x86 32-বিট মেশিন কোড, 24 21 বাইট
চেঞ্জলগ: -৩ বাইট: স্ট্যান্ডার্ড অ্যাড / সিএমপি / জেবি / প্রতিস্থাপন করুন একটি ডিএএস হ্যাকের সাথে @ পেটার ফেরি দ্বারা
64-বিট: এখনও 24 বাইট। লং মোডটি ডিএএস অপকোডটিকে সরিয়েছে।
16-বিট মোড: ডিফল্ট অপারেন্ড-আকারটি 16-বিট তবে সমস্যাটি নির্দিষ্টভাবে অন্তর্নিহিত 32-বিট। হার্ড-কোডেড 8 হেক্স ডিজিট সহ।
bswapস্ট্যান্ডার্ড অর্ডারে ম্যানুয়াল ইনট-> হেক্সের সাথে বাইট-রিভার্স করুন (সর্বাধিক উল্লেখযোগ্য স্তন্যপায়ী , প্রথমে আরোহী ক্রমে চার্ট আউটপুট বাফারে হেক্স সংখ্যা লিখতে হবে)) এটি একটি বাইট বনামের মধ্যে নিবলগুলির মধ্যে ক্রমটি স্যুইচ করার জন্য লুপটি আনারল করা দরকার avo বাইট জুড়ে।
void lehex(char buf[8] /*edi*/, uint32_t x /*esi*/);X86-64 সিস্টেম ভি এর মতো কলযোগ্য , বাদে এটি 64-বিট মোডে কাজ করে না। (এটির জন্য ইডিআইতে আউটপুট পয়েন্টার প্রয়োজন stosb। ইনপুট নম্বর ইসিএক্স বা ইএএক্স ছাড়া অন্য কোনও রেজিস্টারে থাকতে পারে))
1 lehex:
2 00000000 0FCE bswap esi
3 00000002 6A08 push 8 ; 8 hex digits
4 00000004 59 pop ecx
5 .loop: ;do{
6 00000005 C1C604 rol esi, 4 ; rotate high nibble to the bottom
7
8 00000008 89F0 mov eax, esi
9 0000000A 240F and al, 0x0f ; isolate low nibble
10 0000000C 3C0A cmp al, 10 ; set CF according to digit <= 9
11 0000000E 1C69 sbb al, 0x69 ; read CF, set CF and conditionally set AF
12 00000010 2F das ; magic, which happens to work
13
14 00000011 AA stosb ; *edi++ = al
15 00000012 E2F1 loop .loop ; }while(--ecx)
16
17 00000014 C3 ret
আকার = 0x15 = 21 বাইট।
টিএমও FASM 32-বিট x86 টেস্ট কেস হিসাবে একটি এসএম কলারের সাথে কেস ব্যবহার করেwrite দুটি বারে বাফারের সাথে যুক্ত করতে দুবার কল করার পরে আউটপুট লিখতে সিস্টেম কল ব্যবহার করে। সংখ্যা বনাম চিঠির মধ্যে সীমানায় 9 এবং A সহ সমস্ত হেক্স্স অঙ্ক 0..F পরীক্ষা করে।
দ্য DASহ্যাক - এক্স 86 কম মৃদু কামড় থেকে বের করে নিয়ে, একটি অর্ধ বহন পতাকা হয়েছে। প্যাক-বিসিডি স্টাফ যেমন DAS নির্দেশের জন্য দরকারী, দুটি 2-সংখ্যার বিসিডি পূর্ণসংখ্যার বিয়োগের পরে ব্যবহারের উদ্দেশ্যে। AL- এর নিম্ন স্তনবৃন্ত 0-9 সীমার বাইরে থাকায় আমরা অবশ্যই এখানে এটি গালি দিচ্ছি।
ম্যানুয়ালটিতে অপারেশন বিভাগের if (old_AL > 99H) or (old_CF = 1)তৃতীয় AL ← AL − 60H;অংশটি লক্ষ্য করুন ; sbb সর্বদা এখানে সিএফ সেট করে যাতে সেই অংশটি সর্বদা ঘটে। বড় হাতের অক্ষরের জন্য এটি এবং এএসসিআইআই ব্যাপ্তি পছন্দটিকে প্রেরণা দেয়sub al, 0x69
cmp 0xD, 0xA সিএফ সেট করে না
- SBB
0xD - 0x69 AL = এ মোড়ানো0xA4 ইনপুট হিসাবে । (এবং সিএফ সেট করে, এএফ সাফ করে)
- ড্যাসের প্রথম অংশে কোনও এলএল - = 6 নেই (কারণ 4> 9 টি মিথ্যা এবং এএফ = 0)
- AL - = 0x60 দ্বিতীয় অংশে ছেড়ে যাচ্ছে
0x44, এর জন্য ASCII কোড'D'
বনাম একটি সংখ্যা:
cmp 0x3, 0xA সিএফ সেট করে
- SBB
3 - 0x69 - 1 = AL = 0x99 এবং সিএফ এবং এএফ সেট করে
- DAS এর প্রথম অংশে কোনও AL - = 6 নেই (9> 9 টি মিথ্যা তবে এএফ সেট করা আছে), 0x93 রেখে
- AL - = 0x60 দ্বিতীয় অংশে 0x33 রেখে ASCII কোড
'3'।
এসবিবিতে বিয়োগ 0x6aপ্রতিটি অঙ্কের জন্য এএফ সেট করবে <= 9 সুতরাং সমস্ত সংখ্যা একই যুক্তি অনুসরণ করে। এবং এটি প্রতিটি বর্ণমালা হেক্স ডিজিটের জন্য সাফ রেখে দিন। অর্থাত্ DAS- র 9 / A বিভাজন হ্যান্ডলিং সঠিকভাবে কাজে লাগানো।
সাধারণত (পারফরম্যান্সের জন্য) আপনি একটি স্কেলার লুপের জন্য একটি লুকিং টেবিল বা সম্ভবত একটি শাখাবিহীন 2x leaএবং cmp/cmovশর্তসাপেক্ষ অ্যাড ব্যবহার করবেন add তবে 2-বাইট al, imm8নির্দেশাবলী কোড-আকারের জন্য একটি বড় জয়।
x86-64 'VERSION সংস্করণ : শুধু অংশ আলাদা মধ্যে and al, 0xfএবং stosb।
;; x86-64 int -> hex in 8 bytes
10 0000000C 0430 add al, '0'
11 0000000E 3C39 cmp al, '9'
12 00000010 7602 jbe .digit
13 00000012 0427 add al, 'a'-10 - '0' ; al = al>9 ? al+'a'-10 : al+'0'
14 .digit:
লক্ষ্য করুন যে add al, '0' সর্বদা চলতে থাকে, এবং শর্তসাপেক্ষ যুক্তটি কেবল / এর পরিবর্তে কেবলমাত্র একটি তৈরি করতে 'a'-10এবং এর মধ্যে পার্থক্য যুক্ত করে'0'ififelse ।
আমার সি উত্তরmain হিসাবে একই কলার ব্যবহার করে পরীক্ষিত এবং কাজ করে , যা ব্যবহার করে এবং ।char buf[8]printf("%.8s\n", buf)