x86-16 मशीन कोड (डॉस), 16 बाइट्स
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
उपरोक्त फ़ंक्शन को BL
रजिस्टर (कम बाइट ) में बूलियन मान (0 == फाल्सी, 1 == सत्य BX
) प्राप्त होता है, और मानक आउटपुट के लिए "अनावश्यक बूलियन" स्ट्रिंग प्रिंट करता है।
यह एक डॉस फ़ंक्शन कॉल करने के लिए एक व्यवधान (0x21) को आमंत्रित करके काम करता है ( मानक AH
2 से चयनित ) जो DL
मानक आउटपुट में एक एकल वर्ण (में ) प्रिंट करता है ।
सबसे पहले, ASCII वर्ण '0' में लोड किया गया है DL
, काउंटर ( CX
) 31 पर सेट है, और यह "निरर्थक" बाइट्स को प्रिंट करने के लिए लूप करता है। फिर, बूलियन मान में जोड़ा जाता है DL
(यदि BL
falsey है, 0 जोड़ने छोड़ देंगे DL
ASCII '0' के रूप में कोई बदलाव नहीं है, अगर BL
truthy है, DL
ASCII '1' के लिए एक के बाद वृद्धि की जाती किया जाएगा), और अंतिम बाइट छपा है।
फ़ंक्शन मान वापस नहीं करता है।
एक ऐसी भाषा के लिए बहुत ही सभ्य है जो वास्तव में तार नहीं करती है।
पूर्ण कार्यक्रम, 21 बाइट्स
यदि आप इसे एक पूर्ण कार्यक्रम में बनाना चाहते हैं, तो केवल 5 और बाइट्स की आवश्यकता है। एक रजिस्टर में इनपुट पास करने के बजाय, यह एप्लिकेशन को इनवॉइस करते समय कमांड लाइन पर दिए गए तर्कों से इनपुट पढ़ता है। 0 के एक तर्क को गलत तरीके से समझा जाता है, जैसा कि तर्कों की पूरी कमी है; 0 से अधिक के तर्क को सत्य के रूप में समझा जाता है।
बस एक COM प्रोग्राम के रूप में निम्न कोड को इकट्ठा करें, और फिर कमांड लाइन पर इसे निष्पादित करें।
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
नमूना आउटपुट:
C:\>bool.com
00000000000000000000000000000000
C:\>bool.com 0
00000000000000000000000000000000
C:\>bool.com 1
00000000000000000000000000000001
C:\>bool.com 2
00000000000000000000000000000001
C:\>bool.com 7
00000000000000000000000000000001
यह कैसे काम करता है? खैर, यह मूल रूप से एक ही बात है, जब तक आप CMP
निर्देश पर नहीं उतरते । यह DL
रजिस्टर के मान के साथ कमांड-लाइन तर्क की तुलना करता है (जो, आपको याद है, इसमें ASCII '0' शामिल है)। एक COM प्रोग्राम में, कोड के बाइट्स को 0x100 ऑफसेट पर लोड किया जाता है। पूर्ववर्ती वह कार्यक्रम खंड उपसर्ग (PSP) है , जिसमें DOS कार्यक्रम की स्थिति के बारे में जानकारी होती है। विशेष रूप से, ऑफसेट 0x82 पर, आपको पहला (वास्तव में दूसरा, चूंकि पहला स्थान है) तर्क मिलता है जो कमांड लाइन पर निर्दिष्ट किया गया था जब प्रोग्राम को लागू किया गया था। इसलिए, हम इस बाइट की तुलना ASCII '0' से कर रहे हैं।
तुलना झंडे सेट करता है, और फिर SALC
निर्देश (पेंटियम से पहले एक undocumented opcode, के बराबर है sbb al, al
, लेकिन 2 के बजाय केवल 1 बाइट) AL
0 पर सेट होता है यदि दो मान समान थे, या -1 यदि वे अलग-अलग थे। यह तब स्पष्ट है कि जब हम इससे घटाते AL
हैं DL
, तो यह ASCII '0' या '1' के रूप में उपयुक्त होता है।
(ध्यान दें, कुछ विडंबना यह है कि आप इसे तोड़ देंगे यदि आप कमांड लाइन पर एक अग्रणी 0 के साथ एक तर्क पास करते हैं, क्योंकि यह केवल पहले वर्ण पर दिखता है। इसलिए 01
इसे गलत माना जाएगा। :-)