使用gdb访问内存,是否为汇编代码?

时间:2015-10-07 01:42:11

标签: debugging assembly x86 gdb

我目前正在调试一个简单的c程序,并且想知道这个程序集比较:

cmpl $0x1d,-0xc(%ebp)

从我收集的内容来看,这是针对内存中的某个位置进行检查。

如何使用print或x命令在gdb中访问它?它是否像查看ebp提供的位置一样简单,然后移动12位/字节,或者我完全在错误的轨道上?

2 个答案:

答案 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"

当然,地址可以是涉及寄存器值的表达式。