8086 मशीन कोड + डॉस, 61 बाइट्स
Hexdump (दाईं ओर ASCII दृश्य के साथ):
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.
विधानसभा स्रोत कोड (tasm के साथ इकट्ठा किया जा सकता है):
.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
, यह कुछ जंक बाइट्स का उत्पादन करेगा: