GDB调试例子的汇编堆栈
- 代码
- 直接-m32编译出现问题
- 编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令sudo apt-get install libc6-dev-i386
- 编译成功,进入gdb调试界面
- 在main处设置断点、运行并获取汇编代码查看各寄存器状态
- 主函数栈基址为0xffffd104,值为0
- call指令将下一条指令地址入栈,%esp、%ebp值发生变化
- 上一个函数的基址入栈,从当前%esp开始作为新基址,原地址压栈保存
- 为传参做准备
- 实参计算在%eax中进行
- f函数汇编代码
- 实参入栈
- call指令将下一条指令的地址入栈
- 计算short+int
- pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节
- ret指令将栈顶弹给%eip
堆栈情况
指令 |
%esp |
%ebp |
堆栈 |
movl$0x8,(%esp) |
0ffffd104 |
0ffffd108 |
0x0 |
call 0x8048401 |
0ffffd100 |
0ffffd108 |
0x8 0x0 |
push %ebp |
0ffffd100 |
0ffffd108 |
0x804842e 0x8 0x0 |
mov %esp,%ebp |
0ffffd0fc |
0ffffd108 |
0xffffd108 0x804842e 0x8 0x0 |
mov 0x804a01c,%edx/// |
0ffffcf6c |
0ffffcf6c |
0xffffcf78 0x804842e 0x8 0x0 |
call 0x80483ed |
0ffffd0f8 |
0ffffd0fc |
0xa 0xffffd108 0x804842e 0x8 0x0 |
push %ebp |
0ffffd0f4 |
0ffffd0fc |
0x804841a 0xa 0xffffd108 0x804842e 0x8 0x0 |
mov %esp,%ebp |
0ffffd0f0 |
0ffffd0fc |
0xffffd0fc 0x804841a 0xa 0xffffcd108 0x804842e 0x8 0x0 |
movzwl 0x804841a,%eax |
0ffffd0f0 |
0ffffd0f0 |
0xffffd0fc 0x804841a 0xa 0xffffcd108 0x804842e 0x8 0x0 |
ret |
0ffffd0f4 |
0xffffd0fc |
0x804841a 0xa 0xffffcd108 0x804842e 0x8 0x0 |
leave |
0ffffd0f8 |
0ffffd0fc |
0xa 0xffffcd108 0x804842e 0x8 0x0 |
ret |
0ffffd100 |
0ffffd108 |
0x804842e 0x8 0x0 |
leave |
0ffffd104 |
0ffffd108 |
0x8 0x0 |
ret |
0xffffd10c |
0x0 |
时间: 2024-10-11 10:22:20