我目前正在调试一个简单的c程序,并且想知道这个程序集比较:
cmpl $0x1d,-0xc(%ebp)
从我收集的内容来看,这是针对内存中的某个位置进行检查。
如何使用print或x命令在gdb中访问它?它是否像查看ebp提供的位置一样简单,然后移动12位/字节,或者我完全在错误的轨道上?
答案 0 :(得分:1)
确实将29与在ebp之前偏移12的内存中的位置进行比较。假设您正在反汇编的程序使用帧指针,它正在读取堆栈中的局部变量,可能是第一个。 (虽然编译器可以按任何顺序自由放置它们。)
如果它不使用帧指针,请反汇编周围的代码并找出指定ebp的内容。
答案 1 :(得分:0)
是的,那个cmp
有一个立即操作数和一个内存操作数。是的,用于加载内存操作数的有效地址是ebp - 12个字节。
在gdb中,$ebp
为您提供ebp
寄存器的内容,作为您可以在表达式中使用的值。所以你可以这样做:
p $ebp-0xc # print the address
p *(int*)($ebp-0xc) # dereference it as an int*
x /4db $ebp-0xc # dump 4 8bit bytes (b) with %d formatting
打印char*
会打印以null结尾的字符串以及地址,因此您可以执行以下操作:
(gdb) p (char*)0x0804980B
$20 = 0x804980b "giants"
当然,地址可以是涉及寄存器值的表达式。