我对汇编语言非常陌生。我已经研究了两个星期。
这是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是否仅适用于函数。我在主函数的第三行上没有看到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。我在反汇编代码中找不到它。
答案 0 :(得分:2)
使用指令
将数组buffer1
和buffer2
分配到堆栈上
sub esp, 0x10
这是从堆栈指针的当前值(即0x10
)中减去16
或esp
,这会使函数中的堆栈空间增加16个字节({ 1}}是一个字节,char
中有5个字节,buffer1
中有10个字节,由于对齐的原因,结果将四舍五入为16个字节,即AFAIK)。 buffer2
中没有这样的指令,因为它没有局部变量,因此不需要堆栈空间。
(这在本书的第4章中有更详细的解释:http://pacman128.github.io/pcasm/)