x86-16 Kode Mesin (DOS), 16 byte
B4 02 mov ah, 2
B2 30 mov dl, '0'
B9 1F 00 mov cx, 31
PrintZeros:
CD 21 int 0x21
E2 FC loop PrintZeros
00 CA add dl, bl
CD 21 int 0x21
C3 ret
Fungsi di atas menerima nilai boolean (0 == falsey, 1 == truthy) dalam BL
register (byte rendah BX
), dan mencetak string "redundant boolean" ke output standar.
Ia bekerja dengan menggunakan interupsi (0x21) untuk membuat panggilan fungsi DOS (dipilih dengan menetapkan AH
ke 2) yang mencetak satu karakter (dalam DL
) ke output standar.
Pertama, karakter ASCII '0' dimasukkan ke dalam DL
, penghitung ( CX
) diatur ke 31, dan loop untuk mencetak byte "redundan". Kemudian, nilai input boolean ditambahkan ke DL
(jika BL
falsey, menambahkan 0 tidak akan DL
berubah sebagai ASCII '0'; jika BL
benar, DL
akan ditambahkan oleh satu ke ASCII '1'), dan byte terakhir dicetak.
Fungsi tidak mengembalikan nilai.
Lumayan untuk bahasa yang tidak terlalu bagus.
Program Lengkap, 21 byte
Jika Anda ingin membuatnya menjadi program penuh, hanya 5 byte lagi diperlukan. Alih-alih memasukkan input dalam register, ini membaca input dari argumen yang dilewatkan pada baris perintah ketika memanggil aplikasi. Argumen 0 diartikan sebagai falsey, seperti halnya kurangnya argumen; argumen yang lebih besar dari 0 ditafsirkan sebagai kebenaran.
Cukup kumpulkan kode berikut sebagai program COM, dan kemudian jalankan di baris perintah.
B4 02 mov ah, 2
B2 30 mov dl, '0'
B9 1F 00 mov cx, 31
PrintZeros:
CD 21 int 0x21
E2 FC loop PrintZeros
3A 16 82 00 cmp dl, BYTE PTR [0x82] ; compare to 2nd arg, at offset 0x82 in PSP
D6 salc ; equivalent to sbb al, al
28 C2 sub dl, al
CD 21 int 0x21
C3 ret ; you can simply 'ret' to end a COM program
Output sampel:
C:\>bool.com
00000000000000000000000000000000
C:\>bool.com 0
00000000000000000000000000000000
C:\>bool.com 1
00000000000000000000000000000001
C:\>bool.com 2
00000000000000000000000000000001
C:\>bool.com 7
00000000000000000000000000000001
Bagaimana cara kerjanya? Yah, pada dasarnya hal yang sama, sampai Anda selesai dengan CMP
instruksi. Ini membandingkan argumen baris perintah dengan nilai DL
register (yang, Anda ingat, berisi ASCII '0'). Dalam program COM, byte kode dimuat pada offset 0x100. Sebelumnya itu adalah awalan segmen program (PSP) , yang berisi informasi tentang keadaan program DOS. Khususnya, pada offset 0x82, Anda menemukan argumen pertama (sebenarnya yang kedua, karena argumen pertama adalah spasi) yang ditentukan pada baris perintah ketika program dipanggil. Jadi, kami hanya membandingkan byte ini dengan ASCII '0'.
Perbandingan menetapkan bendera, dan kemudian SALC
instruksi (opcode tidak berdokumen sebelum Pentium, setara dengan sbb al, al
, tetapi hanya 1 byte, bukan 2) ditetapkan AL
ke 0 jika kedua nilai sama, atau -1 jika keduanya berbeda. Hal ini kemudian jelas bahwa ketika kita kurangi AL
dari DL
, hasil ini baik ASCII '0' atau '1', yang sesuai.
(Perhatikan bahwa, agak ironisnya, Anda akan memecahnya jika Anda melewati argumen dengan 0 di baris perintah, karena itu hanya terlihat pada karakter pertama. Jadi 01
akan diperlakukan sebagai falsey. :-)