8086 kode mesin + DOS, 61 byte
Hexdump (dengan tampilan ASCII di sebelah kanan):
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.
Kode sumber assembly (dapat dirakit dengan 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
Dua hal menyenangkan di sini:
- Offset dari
qwerty
string adalah 0x011e
. Byte atasnya adalah 1, yang merupakan nomor fungsi DOS untuk input karakter. Ini menghemat 1 byte dalam kode.
- Semua huruf kecil memiliki bit 5 set. Ketika melakukan
AND
dengan 0x20
, mereka semua berubah menjadi ruang, yang kemudian dicetak. Jika char sebelumnya adalah byte end-of-line, itu akan berubah menjadi 0, dan tidak ada ruang yang dihasilkan. Ini digunakan untuk menghindari urutan yang tidak masuk akal0d 20 0a 20
di ujung garis.
Satu hal yang hampir menyenangkan:
Saya mencoba mencari input char mulai dari alamat 0 (yang mengurangi ukuran program sebesar 2 byte), bukan tempat yang biasa (mulai dari string). Ini hampir berhasil; Namun, gagal untuk input t
, karena kode itu sendiri berisi byte t
(sebagai bagian dari pengkodean lompatan bersyarat). Jadi untuk t
, itu akan menghasilkan beberapa byte sampah: