#8088 machine code, IBM PC DOS, 35 bytes
Unassembled listing:
B1 23 MOV CL, 23H ; program is 35 bytes, display 70 chars
_LOOP:
AC LODSB ; load byte [SI] into AL, increment SI
8A F0 MOV DH, AL ; save original byte in DH
51 PUSH CX ; save outer loop counter
B9 0204 MOV CX, 0204H ; set up nibble counter and shift count
D2 C0 ROL AL, CL ; reverse nibbles (display high order first)
_NIB:
24 0F AND AL, 0FH ; mask low nibble
3C 0A CMP AL, 0AH ; is < 10?
72 02 JC _ASC ; if so, is a numeric digit
04 07 ADD AL, 07H ; otherwise adjust for A-F hex ASCII
_ASC:
04 30 ADD AL, '0' ; ASCII convert
B4 0E MOV AH, 0EH ; BIOS output char function
CD 10 INT 10H ; display char
8A C6 MOV AL, DH ; restore original nibble to AL
FE CD DEC CH ; decrement nibble counter
75 EC JNZ _NIB ; if > 0, repeat
59 POP CX ; restore outer loop counter
E2 E0 LOOP _LOOP ; continue loop
C3 RET ; return to DOS
This is a complete IBM PC DOS executable that displays itself as ASCII hex, so will always output as twice the program size.
Output
Download and test SELF.COM!