【发布时间】:2019-06-19 14:33:07
【问题描述】:
我对汇编语言很陌生。我已经研究了2周了。
这是 objdump 生成的转储。 objdump -Mintel -d stack
00000560 <function>:
560: 55 push ebp
561: 89 e5 mov ebp,esp
563: 83 ec 10 sub esp,0x10
566: e8 26 00 00 00 call 591 <__x86.get_pc_thunk.ax>
56b: 05 95 1a 00 00 add eax,0x1a95
570: 90 nop
571: c9 leave
572: c3 ret
00000573 <main>:
573: 55 push ebp
574: 89 e5 mov ebp,esp
576: e8 16 00 00 00 call 591 <__x86.get_pc_thunk.ax>
57b: 05 85 1a 00 00 add eax,0x1a85
580: 6a 03 push 0x3
582: 6a 02 push 0x2
584: 6a 01 push 0x1
586: e8 d5 ff ff ff call 560 <function>
58b: 83 c4 0c add esp,0xc
58e: 90 nop
58f: c9 leave
590: c3 ret
我目前正在学习堆栈。我不确定 prolog 是否仅适用于函数。我在 main 函数的第三行没有看到 sub。不确定 prolog 是否总是使用该模式。
<__x86.get_pc_thunk.ax> 我也很困惑,不知道是什么。
我也想知道为什么它将 0x1a95 添加到 eax,我不确定它为什么选择那个数字。总的来说,添加到 eax 的值是 0x1a85。
这是我用 gcc 编译的 c。我用gcc -m32 -ggdb stack.c -o stack
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
void main() {
function(1, 2,3 );
}
现在我试图在反汇编代码中找到 buffer1 和 buffer2。我猜buffer1[5]是0x05,buffer2[10]是0x0a。我在反汇编代码中找不到。
【问题讨论】:
-
您不会将它们用于任何事情。此外,您没有启用优化。此外,您似乎正在生成与位置无关的代码,这就是
get_pc_thunk的意义所在。编写一些实际执行某些操作并启用优化的合理代码。如果您不关心位置独立性,请禁用它以获得更具可读性的输出。 -
我将添加 -O 和 -no-pie 谢谢你的建议。我还在学习。我做了这样的例子来了解堆栈是如何工作的。