8086 মেশিন কোড + ডস, 61 বাইট
হেক্সডাম্প (ডানদিকে এএসসিআইআই ভিউ সহ):
B8 1E 01 8B F8 CD 21 B1 1F F2 AE 8B F7 AC 8A D0 ......!.........
B4 02 CD 21 80 E2 20 74 02 CD 21 E2 F0 C3 71 77 ...!.. t..!...qw
65 72 74 79 75 69 6F 70 0D 0A 61 73 64 66 67 68 ertyuiop..asdfgh
6A 6B 6C 0D 0A 7A 78 63 76 62 6E 6D 0D jkl..zxcvbnm.
সমাবেশের উত্স কোড (তাস দিয়ে একত্রিত হতে পারে):
.MODEL TINY
.CODE
org 100h
MAIN PROC
mov ax, offset qwerty ; sets ah=1 (coincidence)
mov di, ax ; di points to the string
int 21h ; reads a char from keyboard into al
mov cl, 31 ; cx is the length of the string
repne scasb ; look for the char
mov si, di ; si now points beyond the found char
myloop:
lodsb ; load a char
mov dl, al
mov ah, 2
int 21h ; output the char
and dl, 20h ; if it's a letter, set it to a space
jz print_done ; if it's not a letter, don't print a space
int 21h ; if it's a letter, print a space
print_done:
loop myloop ; repeat until end of string
ret
qwerty db 'qwertyuiop',13,10,'asdfghjkl',13,10,'zxcvbnm',13
MAIN ENDP
END MAIN
দুটি মজাদার জিনিস:
qwerty
স্ট্রিং এর অফসেট হয় 0x011e
। এর উপরের বাইটটি 1, যা অক্ষর ইনপুটটির জন্য ডস ফাংশন সংখ্যা। এটি কোডে 1 বাইট সংরক্ষণ করে।
- সমস্ত ছোট-বড় অক্ষরের বিট 5 সেট রয়েছে। যখন একটি করছেন
AND
সঙ্গে 0x20
, সব তারা একটি স্থান, যা ছাপা হয় পরিণত হয়। পূর্ববর্তী চরটি যদি লাইন বাইটের শেষে ছিল তবে এটি 0 এ পরিণত হবে এবং কোনও স্থান আউটপুট নয়। এটি 0d 20 0a 20
লাইনের শেষে অযৌক্তিক ক্রম এড়ানোর জন্য ব্যবহৃত হয় ।
একটি প্রায় মজাদার জিনিস:
আমি ঠিক স্থান (স্ট্রিংয়ের শুরু) এর পরিবর্তে ঠিকানার 0 (যে প্রোগ্রামের আকার 2 বাইট দ্বারা হ্রাস পেয়েছে) থেকে শুরু করে ইনপুট চর অনুসন্ধান করার চেষ্টা করেছি। এটি প্রায় কাজ করে; তবে এটি ইনপুটটির জন্য ব্যর্থ হয়েছিল t
, কারণ কোডটিতে স্বয়ং বাইট রয়েছে t
(শর্তাধীন জাম্পের এনকোডিংয়ের অংশ হিসাবে)। সুতরাং t
, এটি কয়েক জাঙ্ক বাইট আউটপুট হবে: