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, BL
kayı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 AH
tek 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 BL
eklenmesi DL
ASCII '0' olarak değişmeden kalır; doğruysa ASCII '1'e bir arttırılır) ve son bayt yazdırılır.BL
DL
İş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? CMP
Talimatlara ulaşıncaya kadar temelde aynı şey . Bu, komut satırı bağımsız değişkenini DL
kaydı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 SALC
komut (Pentium'dan önce belgelenmemiş bir opcode sbb al, al
, 2 yerine eşdeğer , ancak yalnızca 1 bayt) AL
0 veya farklıysa -1 değerini ayarlar . Biz çıkarmak zaman o zaman açıktır AL
dan DL
uygun 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 01
falsey olarak değerlendirilecektir. :-)