8086 머신 코드 + DOS, 61 바이트
16 진 덤프 (오른쪽에 ASCII보기가 있음) :
B8 1E 01 8B F8 CD 21 B1 1F F2 AE 8B F7 AC 8A D0 ......!.........
B4 02 CD 21 80 E2 20 74 02 CD 21 E2 F0 C3 71 77 ...!.. t..!...qw
65 72 74 79 75 69 6F 70 0D 0A 61 73 64 66 67 68 ertyuiop..asdfgh
6A 6B 6C 0D 0A 7A 78 63 76 62 6E 6D 0D jkl..zxcvbnm.
어셈블리 소스 코드 (Tasm으로 어셈블리 가능) :
.MODEL TINY
.CODE
org 100h
MAIN PROC
mov ax, offset qwerty ; sets ah=1 (coincidence)
mov di, ax ; di points to the string
int 21h ; reads a char from keyboard into al
mov cl, 31 ; cx is the length of the string
repne scasb ; look for the char
mov si, di ; si now points beyond the found char
myloop:
lodsb ; load a char
mov dl, al
mov ah, 2
int 21h ; output the char
and dl, 20h ; if it's a letter, set it to a space
jz print_done ; if it's not a letter, don't print a space
int 21h ; if it's a letter, print a space
print_done:
loop myloop ; repeat until end of string
ret
qwerty db 'qwertyuiop',13,10,'asdfghjkl',13,10,'zxcvbnm',13
MAIN ENDP
END MAIN
두 가지 재미있는 점 :
qwerty
문자열 의 오프셋은 입니다 0x011e
. 상위 바이트는 1이며 문자 입력을위한 DOS 기능 번호입니다. 코드에 1 바이트가 저장됩니다.
- 모든 소문자는 비트 5로 설정됩니다.
AND
with를 수행하면 0x20
모두 공백으로 바뀌어 인쇄됩니다. 이전 문자가 줄 끝 바이트 인 경우 0으로 바뀌고 공간이 출력되지 않습니다. 이것은 0d 20 0a 20
줄 끝에서 무의미한 순서를 피하기 위해 사용됩니다 .
가장 재미있는 것 :
일반적인 장소 (문자열의 시작) 대신 주소 0에서 시작하여 입력 크기 (프로그램 크기가 2 바이트 감소)를 검색하려고했습니다. 이것은 거의 효과가 있었다. 그러나 t
코드 자체에는 바이트가 포함되어 있기 때문에 input에 실패했습니다 t
(조건부 점프 인코딩의 일부로). 따라서 t
몇 개의 정크 바이트를 출력합니다.