|
发表于 2021-5-24 23:03:12
|
显示全部楼层
直接反编译gcc生成的可执行文件#include <stdio.h>
size_t count = 0;
void hanoi(size_t n, char a, char b, char c) {
if(n == 1) {
printf("%2lu: %c -> %c\n", ++count, a, c);
} else {
hanoi(n - 1, a, c, b);
printf("%2lu: %c -> %c\n", ++count, a, c);
hanoi(n - 1, b, a, c);
}
}
int main(void) {
hanoi(4, 'a', 'b', 'c');
return 0;
}
size_t count = 0;
void hanoi(size_t n, char a, char b, char c) {
794: a9be7bfd stp x29, x30, [sp, #-32]!
798: 910003fd mov x29, sp
79c: f9000fe0 str x0, [sp, #24]
7a0: 39005fe1 strb w1, [sp, #23]
7a4: 39005be2 strb w2, [sp, #22]
7a8: 390057e3 strb w3, [sp, #21]
if(n == 1) {
7ac: f9400fe0 ldr x0, [sp, #24]
7b0: f100041f cmp x0, #0x1
7b4: 54000281 b.ne 804 <hanoi+0x70> // b.any
printf("%2lu: %c -> %c\n", ++count, a, c);
7b8: b0000080 adrp x0, 11000 <__cxa_finalize@GLIBC_2.17>
7bc: 91010000 add x0, x0, #0x40
7c0: f9400000 ldr x0, [x0]
7c4: 91000401 add x1, x0, #0x1
7c8: b0000080 adrp x0, 11000 <__cxa_finalize@GLIBC_2.17>
7cc: 91010000 add x0, x0, #0x40
7d0: f9000001 str x1, [x0]
7d4: b0000080 adrp x0, 11000 <__cxa_finalize@GLIBC_2.17>
7d8: 91010000 add x0, x0, #0x40
7dc: f9400000 ldr x0, [x0]
7e0: 39405fe1 ldrb w1, [sp, #23]
7e4: 394057e2 ldrb w2, [sp, #21]
7e8: 2a0203e3 mov w3, w2
7ec: 2a0103e2 mov w2, w1
7f0: aa0003e1 mov x1, x0
7f4: 90000000 adrp x0, 0 <__abi_tag-0x278>
7f8: 91254000 add x0, x0, #0x950
7fc: 97ffff95 bl 650 <printf@plt>
} else {
hanoi(n - 1, a, c, b);
printf("%2lu: %c -> %c\n", ++count, a, c);
hanoi(n - 1, b, a, c);
}
}
800: 1400001f b 87c <hanoi+0xe8>
hanoi(n - 1, a, c, b);
804: f9400fe0 ldr x0, [sp, #24]
808: d1000400 sub x0, x0, #0x1
80c: 39405be3 ldrb w3, [sp, #22]
810: 394057e2 ldrb w2, [sp, #21]
814: 39405fe1 ldrb w1, [sp, #23]
818: 97ffffdf bl 794 <hanoi>
printf("%2lu: %c -> %c\n", ++count, a, c);
81c: b0000080 adrp x0, 11000 <__cxa_finalize@GLIBC_2.17>
820: 91010000 add x0, x0, #0x40
824: f9400000 ldr x0, [x0]
828: 91000401 add x1, x0, #0x1
82c: b0000080 adrp x0, 11000 <__cxa_finalize@GLIBC_2.17>
830: 91010000 add x0, x0, #0x40
834: f9000001 str x1, [x0]
838: b0000080 adrp x0, 11000 <__cxa_finalize@GLIBC_2.17>
83c: 91010000 add x0, x0, #0x40
840: f9400000 ldr x0, [x0]
844: 39405fe1 ldrb w1, [sp, #23]
848: 394057e2 ldrb w2, [sp, #21]
84c: 2a0203e3 mov w3, w2
850: 2a0103e2 mov w2, w1
854: aa0003e1 mov x1, x0
858: 90000000 adrp x0, 0 <__abi_tag-0x278>
85c: 91254000 add x0, x0, #0x950
860: 97ffff7c bl 650 <printf@plt>
hanoi(n - 1, b, a, c);
864: f9400fe0 ldr x0, [sp, #24]
868: d1000400 sub x0, x0, #0x1
86c: 394057e3 ldrb w3, [sp, #21]
870: 39405fe2 ldrb w2, [sp, #23]
874: 39405be1 ldrb w1, [sp, #22]
878: 97ffffc7 bl 794 <hanoi>
}
87c: d503201f nop
880: a8c27bfd ldp x29, x30, [sp], #32
884: d65f03c0 ret
0000000000000888 <main>:
int main(void) {
888: a9bf7bfd stp x29, x30, [sp, #-16]!
88c: 910003fd mov x29, sp
hanoi(4, 'a', 'b', 'c');
890: 52800c63 mov w3, #0x63 // #99
894: 52800c42 mov w2, #0x62 // #98
898: 52800c21 mov w1, #0x61 // #97
89c: d2800080 mov x0, #0x4 // #4
8a0: 97ffffbd bl 794 <hanoi>
return 0;
8a4: 52800000 mov w0, #0x0 // #0
}
8a8: a8c17bfd ldp x29, x30, [sp], #16
8ac: d65f03c0 ret
|
|