डॉस पर x86 मशीन कोड (.com
फाइल) - 70 बाइट्स
.COM फ़ाइलों के साथ काम करना, एक पैलेन्ड्रोम बनाना आसान है - चूंकि COM "लोडर" सिर्फ फाइल की सामग्री को पते पर रखता है 100h
और वहां कूदता है, इसलिए प्रोग्राम को पहले से ही किसी भी तरह से इसके अंत में हार्डकोड करना चाहिए और इसके बाद सब कुछ अनदेखा करना चाहिए, इसलिए हम सिर्फ उधार दे सकते हैं पहले N-1 बाइट्स का उल्टा होना (केवल कैविएट: यदि प्रोग्राम किसी तरह फ़ाइल की लंबाई के साथ ट्रिक्स करने की कोशिश करता है तो सब कुछ टूट जाता है)।
यहाँ मेरे .COM
-yndromromizing के हेक्स डंप है .COM
:
00000000 31 db 8a 1e 80 00 c6 87 81 00 00 ba 82 00 b8 00 |1...............|
00000010 3d cd 21 72 30 89 c6 bf ff ff b9 01 00 ba fe 00 |=.!r0...........|
00000020 89 f3 b4 3f cd 21 3c 01 75 18 b4 40 bb 01 00 cd |...?.!<.u..@....|
00000030 21 85 ff 75 e5 89 f3 f7 d9 88 ee b8 01 42 cd 21 |!..u.........B.!|
00000040 eb d8 47 74 f0 c3 |..Gt..|
यह कमांड लाइन पर इनपुट फ़ाइल लेता है, और आउटपुट को stdout पर लिखता है; अपेक्षित उपयोग कुछ ऐसा हैcompalyn source.com > out.com
।
टिप्पणी विधानसभा:
org 100h
section .text
start:
; NUL-terminate the command line
xor bx,bx
mov bl, byte[80h]
mov byte[81h+bx],0
; open the input file
mov dx,82h
mov ax,3d00h
int 21h
; in case of error (missing file, etc.) quit
jc end
; si: source file handle
mov si,ax
; di: iteration flag
; -1 => straight pass, 0 reverse pass
mov di,-1
loop:
; we read one byte at time at a bizarre memory
; location (so that dl is already at -2 later - we shave one byte)
mov cx,1
mov dx,0feh
mov bx,si
mov ah,3fh
int 21h
; if we didn't read 1 byte it means we either got to EOF
; or sought before the start of file
cmp al,1
jne out
; write the byte on stdout
mov ah,40h
mov bx,1
int 21h
; if we are at the first pass we go on normally
test di,di
jnz loop
back:
; otherwise, we have to seek back
mov bx,si
; one byte shorter than mov cx,-1
neg cx
; dl is already at -2, fix dh so cx:dx = -2
mov dh,ch
mov ax,4201h
int 21h
jmp loop
out:
; next iteration
inc di
; if it's not zero we already did the reverse pass
jz back
end:
ret
खुद पर परीक्षण किया और पिछले प्रश्न के समाधान DosBox में ठीक काम करने लगता है, "कैनन" DOS निष्पादक पर कुछ और व्यापक परीक्षण का पालन करेंगे।