【发布时间】:2015-03-03 22:47:25
【问题描述】:
我是汇编代码的新手,我正在使用 gdb 编写具有以下内容的代码:
=> 0x080485ee <+132>: cmp %eax,0x80498d4(,%ebx,4)
0x080485f5 <+139>: je 0x80485fc <main+146>
0x080485f7 <+141>: call 0x8048540 <bomb>
我在该行用断点停止了它并输入了这些 gdb 命令:
(gdb) print $eax
$10 = 134519000
(gdb) print 0x80498d8
$11 = 134519000
(gdb) print $ebx
$12 = 1
据我了解,cmp 指令应该比较 %eax 和 0x80498d4 + (%ebx * 4) 的值,它们是相等的,所以代码应该设置零标志并触发 je 跳转到 main+146 on下一行。但是当我单步执行代码时它不会跳转:
(gdb) stepi 2
0x080485ee <+132>: cmp %eax,0x80498d4(,%ebx,4)
0x080485f5 <+139>: je 0x80485fc <main+146>
=> 0x080485f7 <+141>: call 0x8048540 <bomb>
有人可以帮我理解为什么没有设置零标志并且 je 没有跳转到 main+146 吗?
【问题讨论】:
-
(我知道你可能不知道这一点,但其他人可能知道)Wot 语法!
0x80498d4(,%ebx,4)是否确实转换为更正确格式的[0x80498d4+4*ebx]? -
这是内存引用,不是立即数,所以你需要使用
x命令而不是p,或者自己取消引用指针。