首页 > 代码库 > 20145316GDB调试汇编堆栈
20145316GDB调试汇编堆栈
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 |
20145316GDB调试汇编堆栈