C 在给定地址gdb处找到的显示值

C 在给定地址gdb处找到的显示值,c,linux,assembly,gdb,x86,C,Linux,Assembly,Gdb,X86,我正在调试gdb中的二进制文件。它是由gcc在Intel IA-32上编译的C代码。我从objdump检索到这个输出。我最感兴趣的是最后一行: 08048d9e <func_1> 8048d9e: 55 push %ebp 8048d9f: 89 e5 mov %esp,%ebp 8048da1: 83 ec 18 sub $0x18,%esp

我正在调试gdb中的二进制文件。它是由gcc在Intel IA-32上编译的C代码。我从
objdump
检索到这个输出。我最感兴趣的是最后一行:

08048d9e <func_1>
8048d9e:    55                      push   %ebp
8048d9f:    89 e5                   mov    %esp,%ebp
8048da1:    83 ec 18                sub    $0x18,%esp
8048da4:    c7 44 24 04 88 99 04    movl   $0x8049988,0x4(%esp)
8048dab:    08 
8048dac:    8b 45 08                mov    0x8(%ebp),%eax
8048daf:    89 04 24                mov    %eax,(%esp)
8048db2:    e8 54 01 00 00          call   8048f0b <strings_not_equal>
并收到:

0x8048f0b <strings_not_equal>:  0x57e58955
0x8048f0b:0x57e58955
我对大会的解释有误吗?这是读取gdb中地址值的正确方法吗?我有点希望找到一个更为ascii友好的十六进制值。我感兴趣的是找到与之比较的存储字符串值


另外,您是否有最喜欢的gui工具用于此类调试?我一直在考虑尝试ddd。我想找到一种更简单的调试方法。

您正在正确读取内存地址
0x8048f0b
处的值,但是
call 8048f0b
行指示此地址是函数的开始(称为
strings\u not_equal()
)。你不会期望它是ASCII码——你会期望它是更多的机器码

如果您正在查找
字符串\u not_equal()
的函数参数,则这些参数将被推送到堆栈上。第一个参数是从
0x8(%ebp)
复制的,这是
func1()
的第一个参数。第二个参数是
$0x8049988
,它可能是字符串的地址

如果要将地址内容打印为字符串,可以使用
x/s

x/s 0x8049988

因此,在
阶段1
中,第一个参数:
0x8(%ebp)
存储在堆栈上的
%eax
。这也是传递给
字符串\u not_equal
的参数?您如何知道
字符串不等于
的第二个参数是
$0x8049988
?这是因为它被写入到
0x4(%esp)
?所以
x0x8049988
给出了
0x8049988:0x75742049
x/s0x8049988
给出了一个我所期望的奇怪的长字符串:
0x8049988:“我把月亮变成了我喜欢称之为死星的东西。”
我们不需要2个十六进制值来表示每个ascii字符吗?它是如何将
0x75742049
中的长字符串翻译过来的?@KyleWeller:
func_1()
的第一个参数从
0x8(%esp)
复制到
%eax
,然后从
%eax
复制到堆栈中,在堆栈中它将作为
字符串的第一个参数被拾取
0x8049988
直接复制到堆栈中,在堆栈中它将作为
strings\u not_equal()
的第二个参数<不带任何格式的code>x
将地址的前4个字节显示为32位整数;这4个字节是I(
0x49
)、空格(
0x20
)、t(
0x74
)和u(
0x75
)的ASCII码。作为一个整数,读取顺序相反,因为您的机器是小端。
x/s 0x8049988