รหัสเครื่อง 8086 + DOS, 61 ไบต์
Hexdump (พร้อมมุมมอง 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
กับ0x20
พวกเขาทั้งหมดจะกลายเป็นช่องว่างซึ่งจะถูกพิมพ์แล้ว หากอักขระก่อนหน้าเป็นไบต์สิ้นสุดบรรทัดจะกลายเป็น 0 และไม่มีพื้นที่ว่าง สิ่งนี้ใช้เพื่อหลีกเลี่ยงลำดับ0d 20 0a 20
ที่ไม่มีความหมายที่ส่วนท้ายของบรรทัด
สิ่งหนึ่งที่เกือบจะสนุก:
ฉันพยายามค้นหาอินพุตถ่านเริ่มต้นจากที่อยู่ 0 (ลดขนาดโปรแกรมลง 2 ไบต์) แทนที่จะเป็นตำแหน่งปกติ (เริ่มต้นของสตริง) เกือบจะใช้งานได้แล้ว อย่างไรก็ตามมันล้มเหลวในการป้อนข้อมูลt
เพราะรหัสตัวเองมีไบต์t
(เป็นส่วนหนึ่งของการเข้ารหัสของการกระโดดตามเงื่อนไข) ดังนั้นสำหรับt
มันจะเอาท์พุทขยะไม่กี่ไบต์: