180 বাইট, মেশিন কোড (16-বিট x86)
আমি লক্ষ্য করেছি বেশিরভাগ উত্তরগুলি বিল্টিন এনকোড / ডিকোড ব্যবহার করে (যা আমি বিশ্বাস করি যে এটি পুরোপুরি ভাল) তবে আমি ভেবেছিলাম যে আমি আমার 16-বিট অনুসন্ধান চালিয়ে যাব ।
পূর্ববর্তী বেশী হিসাবে, এই ঘটনার পর কম্পাইলার ছাড়া বেশিরভাগই ব্যবহার এইচটি hexeditor এবং বরফযুক্ত এর hexplorer ।
00000000: eb40 ac20 0000 1a20 9201 1e20 2620 2020 .@. ... ... &
00000010: 2120 c602 3020 6001 3920 5201 0000 7d01 ! ..0 `.9 R...}.
00000020: 0000 0000 1820 1920 1c20 1d20 2220 1320 ..... . . . " .
00000030: 1420 dc02 2221 6101 3a20 5301 0000 7e01 . .."!a.: S...~.
00000040: 7801 89f7 4646 89fa 89d9 4143 4bb4 3fcd x...FF....ACK.?.
00000050: 2185 c074 288a 053c 8073 05e8 1700 ebec !..t(..<.s......
00000060: 3ca0 721a d440 0d80 c050 86c4 e806 0058 <.r..@...P.....X
00000070: e802 00eb d7b4 4088 05b3 01cd 21c3 2c80 ......@.....!.,.
00000080: d0e0 89c3 8b00 89cb 85c0 74c0 3dff 0773 ..........t.=..s
00000090: 08c1 c002 c0e8 02eb cd50 c1e8 0c0c e0e8 .........P......
000000a0: d3ff 5825 ff0f c1c0 02c0 e802 0d80 8050 ..X%...........P
000000b0: 86c4 ebb8 ....
ব্যবচ্ছেদ
বাস্তবায়ন বেশ সোজা-এগিয়ে, যদিও আমি সামনের দিকে প্রবাহিত করার জন্য খুব বেশি চিন্তাভাবনা করি নি তাই সেখানে কিছু স্প্যাগেটি রয়েছে।
আমি কিছুটা অর্ডার মিশিয়ে দেব, এটি অনুসরণ করা আরও সহজ করার জন্য ...
0000 eb40 jmp 0x42
ইউনিকোড কোডগুলিতে চরগুলি> = 0x80 <0xa0 মানচিত্রযুক্ত টেবিলের উপরে যান।
data db ACh,20h, 00h,00h, 1Ah,20h, ...
অবৈধগুলি 0 হিসাবে এনকোড করা আছে, এগুলি কোনও কিছুর সাথে ম্যাপ করা হয় না
0075 b440 mov ah, 0x40
0077 8805 mov [di], al
0079 b301 mov bl, 0x1
007b cd21 int 0x21
007d c3 ret
চর মুদ্রণ করতে ব্যবহৃত সহায়ক ফাংশন al
, কয়েকবার কল করা হবে called
0042 89f7 mov di, si
0044 46 inc si
0045 46 inc si
0046 89fa mov dx, di
0048 89d9 mov cx, bx
004a 41 inc cx
004b 43 inc bx
রেজিস্টার প্রস্তুত। ডেটা 0x100 এ পড়বে, si
উপরের অনুবাদ সারণীতে নির্দেশ করুন।
004c 4b dec bx
004d b43f mov ah, 0x3f
004f cd21 int 0x21
0051 85c0 test ax, ax
0053 7428 jz 0x7d
স্টিডিন থেকে চর পড়ুন, ইওএফ থাকলে 0x7d এ যান।
Sidenote: এটি আসলে একটি ছোট (কিন্তু বেশ ভাল পরিচিত) কৌতুক হয়, 0x7d রয়েছে ret
, এই কারণ হবে pop sp
, sp
শুরু বিন্দুতে একটি সেগমেন্ট শেষে, সেখানে 00 00
আছে, এবং cs:0
ডস মধ্যে রয়েছে CD 20
, যা প্রস্থান আবেদন জানাবে।
0055 8a05 mov al, [di]
0057 3c80 cmp al, 0x80
0059 7305 jnc 0x60
005b e81700 call 0x75
005e ebec jmp 0x4c
যদি চরটি <0x80 হয় তবে কেবল এটি মুদ্রণ করুন এবং লুপের শুরুতে যান (কারণ সহায়ক ফাংশনটি বিএক্সকে 1 - stdout এ সেট করছে, লাফিয়ে যাবে dec bx
)
0060 3ca0 cmp al, 0xa0
0062 721a jc 0x7e
0064 d440 aam 0x40
0066 0d80c0 or ax, c080
0069 50 push ax
006a 86c4 xchg ah, al
006c e80600 call 0x75
006f 58 pop ax
0070 e80200 call 0x75
0073 ebd7 jmp 0x4c
এই অংশটি চরগুলি> = 0xa0 এর সাথে সম্পর্কিত, এসকিআই কোডটিকে "উচ্চ" দুটি বিট এবং "লো" 6 বিটে বিভক্ত করে এবং দুটি বাইটের জন্য utf-8 মাস্ক সি080 প্রয়োগ করে, তারপর উভয় প্রিন্ট করে
007e 2c80 sub al, 0x80
0080 d0e0 shl al, 0x1
0082 89c3 mov bx, ax
0084 8b00 mov ax, [bx+si]
0086 89cb mov bx, cx
0088 85c0 test ax, ax
008a 74c0 jz 0x4c
008c 3dff07 cmp ax, 07ff
008f 7308 jnc 0x99
0091 c1c002 rol ax, 0x2
0094 c0e802 shr al, 0x2
0097 ebcd jmp 0x66
এই অংশটি চরগুলি> = 0x80 <0xa0 এর সাথে সম্পর্কিত, এটি শীর্ষে টেবিলের মধ্যে যথাযথ utf-8 কোড সন্ধান করে, যদি কোড 0 এর সমান হয় তবে কেবল শুরুতে চলে যান, যদি এটি 0x7ff এর নীচে থাকে (এরগো: দুটি ইউটিএফ -8 বাইটে ফিট করে) , কেবল মানটি সামঞ্জস্য করুন এবং 0x166 এ আগের কোডটি পুনরায় ব্যবহার করুন।
0099 50 push ax
009a c1e80c shr ax, 0xc
009d 0ce0 or al, e0
009f e8d3ff call 0x75
00a2 58 pop ax
00a3 25ff0f and ax, 0fff
00a6 c1c002 rol ax, 0x2
00a9 c0e802 shr al, 0x2
00ac 0d8080 or ax, 8080
00af 50 push ax
00b0 86c4 xchg ah, al
00b2 ebb8 jmp 0x6c
চূড়ান্ত অংশ, 0x7FF এর উপরে থাকা কোডগুলির সাথে ডিল করে, কম 12 বিট ফেলে, 0xE0 প্রয়োগ করুন ( রেফারেন্সের জন্য ইউটিএফ -8 এনকোডিং বিবরণ দেখুন ) এবং এটি মুদ্রণ করুন, 12 টি বিট সামঞ্জস্য করুন এবং 8080 মুখোশ প্রয়োগ করুন এবং আবার অংশটি পুনরায় ব্যবহার করুন যা দুটি চরিত্রের বাইরে বেরিয়ে আসে ।