x86-16 Machine Code (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
La funzione precedente riceve un valore booleano (0 == falsey, 1 == truthy) nel BLregistro (byte basso diBX ) e stampa una stringa "booleana ridondante" sull'output standard.
Funziona invocando un interrupt (0x21) per effettuare una chiamata alla funzione DOS (selezionata impostando AHsu 2) che stampa un singolo carattere (inDL ) sull'output standard.
Innanzitutto, il carattere ASCII '0' viene caricato in DL, il contatore ( CX) è impostato su 31 e esegue un ciclo per stampare i byte "ridondanti". Quindi, viene aggiunto il valore booleano di input DL(se BLè false, l'aggiunta di 0 rimarrà DLinvariata come ASCII "0"; se BLè vero,DL verrà incrementato di uno a ASCII '1') e verrà stampato il byte finale.
La funzione non restituisce un valore.
Abbastanza decente per un linguaggio che non fa davvero stringhe.
Programma completo, 21 byte
Se si desidera trasformarlo in un programma completo, sono necessari solo altri 5 byte. Invece di passare l'input in un registro, questo legge l'input dagli argomenti passati sulla riga di comando quando si richiama l'applicazione. Un argomento di 0 viene interpretato come falso, così come la completa mancanza di argomenti; un argomento maggiore di 0 viene interpretato come vero.
È sufficiente assemblare il seguente codice come programma COM, quindi eseguirlo sulla riga di comando.
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
Uscita campione:
C:\>bool.com
00000000000000000000000000000000
C:\>bool.com 0
00000000000000000000000000000000
C:\>bool.com 1
00000000000000000000000000000001
C:\>bool.com 2
00000000000000000000000000000001
C:\>bool.com 7
00000000000000000000000000000001
Come funziona? Bene, è praticamente la stessa cosa, fino a quando non si arriva alle CMPistruzioni. Questo confronta l'argomento della riga di comando con il valore del DLregistro (che, ricordate, contiene uno "0" ASCII). In un programma COM, i byte di codice vengono caricati nell'offset 0x100. Precedentemente si tratta del prefisso del segmento di programma (PSP) , che contiene informazioni sullo stato di un programma DOS. In particolare, all'offset 0x82, si trova il primo argomento (in realtà il secondo, poiché il primo è uno spazio) che è stato specificato sulla riga di comando quando è stato invocato il programma. Quindi, stiamo solo confrontando questo byte con uno "0" ASCII.
Il confronto imposta i flag, quindi l' SALCistruzione (un codice operativo non documentato prima del Pentium, equivalente a sbb al, al, ma solo 1 byte anziché 2) imposta ALsu 0 se i due valori erano uguali o -1 se erano diversi. È quindi ovvio che quando sottraggiamo ALda DL, ciò si traduce in ASCII '0' o '1', a seconda dei casi.
(Nota che, un po 'ironicamente, lo spezzerai se passi un argomento con uno 0 iniziale sulla riga di comando, dato che guarda solo al primo carattere. Quindi 01sarà trattato come un falso. :-)