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
ecx에서 X의 크기와 edx의 출력 버퍼에 대한 포인터를받는 함수입니다.
출력 버퍼를 바이트로 순차적으로 채 웁니다. 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;
흥미로운 부분은 공간 수의 계산입니다. 다음 숫자를 생성해야합니다 (예 : N = 9).
7 1
5 2
3 3
1 4
3
1 2
3 1
5 0
7
숫자는 두 개의 산술 진행에서 교대로 가져옵니다. 첫 번째 단계는 -2 단계로 내려 가고 두 번째 단계는 1 단계로 올라갑니다. 첫 번째 진행이 -1에 도달하면 (X 중간) 글리치가 발생하고 (-1이 제거됨) 진행 방향이 바뀝니다.
진행률은 레지스터 ebx
와 edx
-높은 부분 bh
에 dh
저장되고 현재 번호와 낮은 부분 bl
을 dl
저장하고 단계를 저장합니다. 진행을 번갈아 가려면 코드에서 레지스터를로 바꿉니다 xchg
.
진행률이 -1 ( mylab
라벨 주위)에 도달하면 두 레지스터가 증가하여 단계가에서로 변경 -2, 1
됩니다 -1, 2
. 이것은 또한 레지스터의 역할을 변경하므로 레지스터의 높은 부분을 교체합니다.
함수의 끝에 문자열의 끝을 나타내는 0 바이트를 저장합니다.