x86 মেশিন কোড, 70 বাইট
60 89 d7 31 db 43 88 ce b2 fe 49 d1 e1 87 da 0f
c7 f0 24 7f 3c 22 72 f7 48 3c 79 74 f2 3c 59 74
ee aa 49 7c 1c 00 df 79 06 86 f7 42 43 eb f6 f6
c3 01 74 03 b0 0a aa 51 88 f9 b0 20 f3 aa 59 eb
cc c6 07 00 61 c3
আমার নির্বাহযোগ্য কোড, বিচ্ছিন্ন:
0000003d <myheh>:
3d: 60 pusha
3e: 89 d7 mov %edx,%edi
40: 31 db xor %ebx,%ebx
42: 43 inc %ebx
43: 88 ce mov %cl,%dh
45: b2 fe mov $0xfe,%dl
47: 49 dec %ecx
48: d1 e1 shl %ecx
0000004a <myloop>:
4a: 87 da xchg %ebx,%edx
0000004c <myrand>:
4c: 0f c7 f0 rdrand %eax
4f: 24 7f and $0x7f,%al
51: 3c 22 cmp $0x22,%al
53: 72 f7 jb 4c <myrand>
55: 48 dec %eax
56: 3c 79 cmp $0x79,%al
58: 74 f2 je 4c <myrand>
5a: 3c 59 cmp $0x59,%al
5c: 74 ee je 4c <myrand>
5e: aa stos %al,%es:(%edi)
5f: 49 dec %ecx
60: 7c 1c jl 7e <mydone>
00000062 <mylab>:
62: 00 df add %bl,%bh
64: 79 06 jns 6c <myprint>
66: 86 f7 xchg %dh,%bh
68: 42 inc %edx
69: 43 inc %ebx
6a: eb f6 jmp 62 <mylab>
0000006c <myprint>:
6c: f6 c3 01 test $0x1,%bl
6f: 74 03 je 74 <myprint1>
71: b0 0a mov $0xa,%al
73: aa stos %al,%es:(%edi)
00000074 <myprint1>:
74: 51 push %ecx
75: 88 f9 mov %bh,%cl
77: b0 20 mov $0x20,%al
79: f3 aa rep stos %al,%es:(%edi)
7b: 59 pop %ecx
7c: eb cc jmp 4a <myloop>
0000007e <mydone>:
7e: c6 07 00 movb $0x0,(%edi)
81: 61 popa
82: c3 ret
এটি এমন একটি ফাংশন যা এক্সেক্সে এক্স এর আকার এবং এডেক্সে আউটপুট বাফারের পয়েন্টার গ্রহণ করে।
এটি আউটপুট বাফারটি যথাযথভাবে বাইট সহ পূরণ করে। আছে 2 * n - 1
পুনরাবৃত্তিও (আউটপুট অ-স্পেস অক্ষরের সংখ্যা সমান)। প্রতিটি পুনরাবৃত্তিতে এটি নিম্নলিখিতগুলি করে:
- একটি এলোমেলো সংখ্যা তৈরি করুন
- পরিসরের সাথে এটি ফিট করার জন্য নম্বর সহ ফিডল; যদি এটি খারাপ হয় তবে ফিরে গিয়ে নতুনভাবে উত্পন্ন করুন
- এলোমেলো অক্ষর মুদ্রণ করুন
- একটি নতুন লাইন মুদ্রণ করুন (প্রতিটি অন্যান্য পুনরাবৃত্তি)
- জায়গাগুলির যথাযথ সংখ্যা মুদ্রণ করুন
একটি এলোমেলো সংখ্যা থেকে একটি এলোমেলো অক্ষরে রূপান্তর লক্ষণীয় নয়:
myrand:
rdrand eax;
and al, 7fh;
cmp al, 22h;
jb myrand;
dec eax;
cmp al, 'y';
je myrand;
cmp al, 'Y';
je myrand;
আকর্ষণীয় অংশটি স্থানগুলির সংখ্যা গণনা ulation এটি অবশ্যই নিম্নলিখিত সংখ্যাগুলি উত্পন্ন করবে (উদাহরণস্বরূপ এন = 9):
7 1
5 2
3 3
1 4
3
1 2
3 1
5 0
7
দুটি গাণিতিক অগ্রগতি থেকে সংখ্যাগুলি পর্যায়ক্রমে নেওয়া হয়। প্রথমটি ধাপ -২ দিয়ে নেমে যায় এবং দ্বিতীয়টি ধাপ ১ দিয়ে উপরে যায় যখন প্রথম অগ্রগতিটি -১ এ পৌঁছে যায় (এক্স এর মাঝখানে), সেখানে একটি ত্রুটি থাকে (-1 সরানো হয়), এবং তারপরে অগ্রগতি দিক পরিবর্তন।
Progressions, রেজিস্টার সংরক্ষিত হয় ebx
এবং edx
- উচ্চ যন্ত্রাংশ bh
এবং dh
বর্তমান সংখ্যা, এবং কম পার্টসের দোকান bl
ও dl
পদক্ষেপ সংরক্ষণ করি। অগ্রগতিগুলির মধ্যে বিকল্প হিসাবে, কোডটি নিবন্ধগুলির সাথে অদলবদল করে xchg
।
অগ্রগতিটি যখন -1 এ পৌঁছে যায় ( mylab
লেবেলের চারপাশে ), তখন এটি উভয় নিবন্ধকেই বাড়িয়ে দেয়, পদক্ষেপগুলি থেকে সরিয়ে -2, 1
নিয়ে যায় -1, 2
। এটি রেজিস্টারের ভূমিকাও পরিবর্তন করে, সুতরাং এটি নিবন্ধগুলির উচ্চতর অংশগুলিকে অদলবদল করে।
ফাংশন শেষে, এটি স্ট্রিংয়ের শেষ নির্দেশ করতে শূন্য বাইট সঞ্চয় করে।