gdb:How 在 ASM 中的内存地址打印值

gdb:How to print value at memory address in ASM

   0x08048c62 <+0>:     sub    [=11=]x2c,%esp
   0x08048c65 <+3>:     lea    0x1c(%esp),%eax
   0x08048c69 <+7>:     mov    %eax,0xc(%esp)
   0x08048c6d <+11>:    lea    0x18(%esp),%eax
   0x08048c71 <+15>:    mov    %eax,0x8(%esp)
   0x08048c75 <+19>:    movl   [=11=]x804a73d,0x4(%esp)
   0x08048c7d <+27>:    mov    0x30(%esp),%eax
   0x08048c81 <+31>:    mov    %eax,(%esp)
   0x08048c84 <+34>:    call   0x80488d0 <__isoc99_sscanf@plt>
=> 0x08048c89 <+39>:    cmp    [=11=]x1,%eax

如何打印出最后一条指令中 [=13=]x1 处的内容? 我尝试了所有组合

x/d 0x1
x/d [=12=]x1
x/s [=12=]x1
...
...

但我要么得到 错误:无法访问地址 0x1 处的内存,或者值无法转换为整数(即​​使我尝试将类型更改为 c,s,x,a)

最终,我试图找出传递给 scanf 的参数,即“%d %d %c”

</code>有一个立即数,就是数字<code>1。这不是一个地址。它正在检查 sscanf 的 return 值,即已处理的项目数。转换后的值当然放在内存中作为参数传递给 sscanf 的指针处。

在您的示例中,格式字符串位于 0x804a73d,您应该能够使用 x/s 0x804a73d.

打印它

出于效率原因,代码使用 mov 而不是 push 将项目放入堆栈。您可以在堆栈上的适当偏移处看到参数。它们从 (%esp) 开始,每个都是 4 个字节:

第一个参数(要读取的字符串):

   0x08048c7d <+27>:    mov    0x30(%esp),%eax
   0x08048c81 <+31>:    mov    %eax,(%esp)

第二个参数(格式字符串):

   0x08048c75 <+19>:    movl   [=11=]x804a73d,0x4(%esp)

第三个参数(第一个输出指针):

   0x08048c6d <+11>:    lea    0x18(%esp),%eax
   0x08048c71 <+15>:    mov    %eax,0x8(%esp)

第 4 个参数(第 2 个输出指针):

   0x08048c65 <+3>:     lea    0x1c(%esp),%eax
   0x08048c69 <+7>:     mov    %eax,0xc(%esp)