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
উপরের ফাংশনটি রেজিস্টারে একটি বুলিয়ান মান (0 == মিথ্যা, 1 == সত্যবাদী) গ্রহণ করে BL
(কম বাইট BX
), এবং স্ট্যান্ডার্ড আউটপুটে একটি "রিডানড্যান্ট বুলিয়ান" স্ট্রিং প্রিন্ট করে।
এটি ডস ফাংশন কল করতে একটি বাধা (0x21) ডেকে কাজ করে ( AH
2 সেট করে নির্বাচিত ) যা DL
স্ট্যান্ডার্ড আউটপুটে একক অক্ষর (ইন ) মুদ্রণ করে ।
প্রথমত, ASCII অক্ষর '0' এ লোড করা হয় DL
, কাউন্টারটি ( CX
31) সেট করা থাকে এবং এটি "রিডানড্যান্ট" বাইটগুলি মুদ্রণ করতে লুপ হয়। তারপরে, ইনপুট বুলিয়ান মানটি যুক্ত করা হয় DL
(যদি BL
মিথ্যা হয় তবে 0 যুক্ত DL
করা ASCII '0' হিসাবে অপরিবর্তিত থাকবে ; যদি BL
সত্য DL
হয় তবে একজনকে ASCII '1' এ বাড়ানো হবে), এবং চূড়ান্ত বাইটটি মুদ্রিত হবে।
ফাংশনটি কোনও মান দেয় না।
সত্যিকারের স্ট্রিংগুলি না করে এমন ভাষার জন্য অত্যন্ত শালীন।
সম্পূর্ণ প্রোগ্রাম, 21 বাইট
আপনি যদি এটি একটি সম্পূর্ণ প্রোগ্রামে পরিণত করতে চান তবে আরও 5 বাইট প্রয়োজন। কোনও রেজিস্টারে ইনপুট পাস করার পরিবর্তে, আবেদনটি করার সময় কমান্ড লাইনে পাস হওয়া আর্গুমেন্টগুলি থেকে ইনপুটটি পড়ে reads 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' থাকে)। কোনও সিওএম প্রোগ্রামে, কোড বাইটস অফসেট 0x100 এ লোড হয়। এর পূর্ববর্তী অংশটি হ'ল প্রোগ্রাম বিভাগের উপসর্গ (পিএসপি) , যা কোনও ডস প্রোগ্রামের স্থিতি সম্পর্কে তথ্য ধারণ করে। বিশেষত, 0x82 অফসেটে আপনি প্রথমটি (আসলে দ্বিতীয়টি, যেহেতু প্রথমটি একটি স্থান হ'ল) প্রোগ্রামটি চালু হওয়ার সময় কমান্ড লাইনে নির্দিষ্ট করা হয়েছিল argument সুতরাং, আমরা কেবল এই বাইটকে একটি ASCII '0' এর সাথে তুলনা করছি।
তুলনাটি পতাকাগুলি সেট করে এবং তারপরে SALC
নির্দেশিকা (পেন্টিয়ামের পূর্বে একটি অননুমোদিত ওপকোড, সমতুল্য sbb al, al
, তবে 2 এর পরিবর্তে কেবল 1 বাইট) 2 AL
মান দুটি সমান হলে 0 বা সেগুলি পৃথক হলে -1 এ সেট হয়। তখনই যখন আমরা বিয়োগ যে সুস্পষ্ট AL
থেকে DL
পারেন হওয়া ASCII '0', এই ফলাফল বা '1', যথাযথ হিসাবে।
(দ্রষ্টব্য, কিছুটা বিদ্রূপের সাথে, আপনি যদি কমান্ড লাইনে শীর্ষস্থানীয় 0 দিয়ে কোনও যুক্তিটি পাস করেন তবে আপনি এটি ভেঙে ফেলবেন, যেহেতু এটি কেবল প্রথম চরিত্রের দিকে দেখায় So তাই 01
মিথ্যা হিসাবে বিবেচিত হবে: :-)