x86-16-Computercode (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
Die obige Funktion empfängt einen Booleschen Wert (0 == Falsey, 1 == Truthy) im BLRegister (Low-Byte von BX) und gibt einen "redundanten Booleschen" String an die Standardausgabe aus.
Es funktioniert durch Aufrufen eines Interrupts (0x21), um einen DOS-Funktionsaufruf (ausgewählt durch Setzen AHauf 2) auszuführen, der ein einzelnes Zeichen (in DL) an die Standardausgabe ausgibt.
Zuerst wird das ASCII-Zeichen '0' geladen DL, der Zähler ( CX) wird auf 31 gesetzt und es wird eine Schleife ausgeführt, um die "redundanten" Bytes zu drucken. Dann wird der boolesche Eingabewert addiert DL(wenn BLfalsch ist, bleibt das Addieren von 0 DLunverändert als ASCII '0'; wenn BLwahr, DLwird es um eins zu ASCII '1' inkrementiert), und das letzte Byte wird gedruckt.
Die Funktion gibt keinen Wert zurück.
Ziemlich anständig für eine Sprache, die nicht wirklich Streicher ist.
Volles Programm, 21 Bytes
Wenn Sie ein vollständiges Programm erstellen möchten, sind nur noch 5 Bytes erforderlich. Anstatt die Eingabe in ein Register zu übergeben, wird die Eingabe aus den Argumenten gelesen, die beim Aufrufen der Anwendung in der Befehlszeile übergeben wurden. Ein Argument von 0 wird ebenso wie das völlige Fehlen von Argumenten als falsch interpretiert. Ein Argument größer als 0 wird als wahr interpretiert.
Stellen Sie einfach den folgenden Code als COM-Programm zusammen und führen Sie ihn dann in der Befehlszeile aus.
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
Beispielausgabe:
C:\>bool.com
00000000000000000000000000000000
C:\>bool.com 0
00000000000000000000000000000000
C:\>bool.com 1
00000000000000000000000000000001
C:\>bool.com 2
00000000000000000000000000000001
C:\>bool.com 7
00000000000000000000000000000001
Wie funktioniert es? Nun, es ist im Grunde dasselbe, bis Sie zur CMPAnweisung kommen. Dadurch wird das Befehlszeilenargument mit dem Wert des DLRegisters verglichen (das, wie Sie sich erinnern, eine ASCII-0 enthält). In einem COM-Programm werden die Codebytes mit dem Offset 0x100 geladen. Davor steht das Programmsegment-Präfix (PSP) , das Informationen zum Status eines DOS-Programms enthält. Insbesondere finden Sie bei Offset 0x82 das erste (eigentlich das zweite, da das erste ein Leerzeichen ist) Argument, das in der Befehlszeile angegeben wurde, als das Programm aufgerufen wurde. Wir vergleichen dieses Byte also nur mit einer ASCII-0.
Beim Vergleich werden die Flags gesetzt, und dann wird der SALCBefehl (ein undokumentierter Opcode vor dem Pentium, der sbb al, alnur 1 Byte anstelle von 2 entspricht) ALauf 0 gesetzt, wenn die beiden Werte gleich waren, oder auf -1, wenn sie unterschiedlich waren. Es ist dann klar , dass , wenn wir subtrahieren ALaus DL, ergibt sich daraus entweder ASCII ‚0‘ oder ‚1‘, als angemessen.
(Beachte, dass du es ironischerweise kaputt machst, wenn du ein Argument mit einer führenden 0 in der Kommandozeile 01übergibst , da es nur auf das erste Zeichen abzielt. Also wird es als falsch behandelt. :-)