x86-16 Makine Kodu (DOS), 16 bayt
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
Yukarıdaki işlev, BLkayıt defterine (düşük bayt BX) bir boole değeri (0 == falsey, 1 == doğruluk) alır ve standart çıktıya bir "gereksiz boole" dizesi yazdırır.
Standart çıkışa AHtek bir karakter (in DL) yazdıran bir DOS işlev çağrısı ( 2'ye ayarlanarak seçilen) yapmak için bir kesme (0x21) çağırarak çalışır .
İlk olarak, ASCII karakteri '0' yüklenir DL, counter ( CX) 31 olarak ayarlanır ve "gereksiz" baytları yazdırmak için döngüler. Daha sonra, giriş boole değeri eklenir DL( falsey ise , 0 BLeklenmesi DLASCII '0' olarak değişmeden kalır; doğruysa ASCII '1'e bir arttırılır) ve son bayt yazdırılır.BLDL
İşlev bir değer döndürmez.
Gerçekten dizeleri olmayan bir dil için oldukça iyi.
Tam Program, 21 bayt
Tam bir program haline getirmek istiyorsanız, sadece 5 bayt daha gereklidir. Bu, girdiyi bir kayıt defterine geçirmek yerine, uygulamayı çağırırken komut satırında iletilen bağımsız değişkenlerden gelen girdiyi okur. 0 argümanı, tam argüman eksikliği gibi falsey olarak yorumlanır; 0'dan büyük bir argüman doğruluk olarak yorumlanır.
Aşağıdaki kodu bir COM programı olarak birleştirin ve komut satırında yürütün.
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
Örnek Çıktı:
C:\>bool.com
00000000000000000000000000000000
C:\>bool.com 0
00000000000000000000000000000000
C:\>bool.com 1
00000000000000000000000000000001
C:\>bool.com 2
00000000000000000000000000000001
C:\>bool.com 7
00000000000000000000000000000001
O nasıl çalışır? CMPTalimatlara ulaşıncaya kadar temelde aynı şey . Bu, komut satırı bağımsız değişkenini DLkaydın değeriyle karşılaştırır (hatırladığınız gibi, bir ASCII '0' içerir). Bir COM programında, kod baytları 0x100 uzaklığına yüklenir. Bundan önce , bir DOS programının durumu hakkında bilgi içeren program segmenti önekidir (PSP) . Özellikle, 0x82 uzaklığında, program çağrıldığında komut satırında belirtilen ilk (aslında ikincisi, bir boşluk olduğu için) bağımsız değişkenini bulursunuz. Bu baytı ASCII '0' ile karşılaştırıyoruz.
Karşılaştırma bayrakları ayarlar ve ardından iki değer eşitse SALCkomut (Pentium'dan önce belgelenmemiş bir opcode sbb al, al, 2 yerine eşdeğer , ancak yalnızca 1 bayt) AL0 veya farklıysa -1 değerini ayarlar . Biz çıkarmak zaman o zaman açıktır ALdan DLuygun olarak, bu iki ASCII '0' in sonuçları veya '1'.
(Biraz ironik bir şekilde, komut satırında baştaki 0 ile bir argüman iletirseniz, yalnızca ilk karaktere baktığından onu kıracağınızı unutmayın. Bu yüzden 01falsey olarak değerlendirilecektir. :-)