0x0000000000001413处cmp指令含义及GDB断点设置方法
问题解答
1. cmp DWORD PTR [rbp-0x70],eax指令含义
这是x86-64架构下的比较指令,具体作用如下:
- 两个操作数说明:
- 第一个操作数
DWORD PTR [rbp-0x70]:表示从栈基址寄存器rbp向下偏移0x70的内存地址中,取出长度为32位的双字(DWORD)数值 - 第二个操作数
eax:32位通用寄存器,存储的是前一条指令mov eax,DWORD PTR [rbp-0x74]从栈上读入的32位数值
- 第一个操作数
- 指令执行逻辑:将第一个操作数的值减去第二个操作数的值,不会修改两个操作数本身的原始值,只会根据减法结果修改EFLAGS标志寄存器中的标志位(比如零标志位ZF、符号标志位SF、溢出标志位OF等),供后续的条件跳转指令(如本例后续的
jne)判断使用。
本例中后续的jne指令就是判断该cmp的执行结果:如果两个操作数的值不相等(减法结果不为0,ZF标志位为0),就跳转到0x149d <main+382>的位置执行,否则继续执行下一条指令。
2. GDB在该指令位置设置断点的方法
有两种常用的设置方式:
- 直接通过指令地址设置:在GDB交互界面输入命令
如果程序未开启地址空间布局随机化(PIE),也可以直接用短地址break *0x0000000000001413break *0x1413。 - 通过main函数偏移设置(更通用,支持开启PIE的场景):因为该指令处于main函数偏移+244的位置,输入命令
break *main+244
设置完成后可以输入info breakpoints命令查看断点是否创建成功,程序运行到该指令位置时就会自动暂停。
内容的提问来源于stack exchange,提问作者Max Lien
相关产品推荐
相关产品推荐

