【问题标题】:Gdb assembly language instruction addgdb 汇编语言指令添加
【发布时间】:2014-03-12 01:29:27
【问题描述】:

我需要了解汇编代码中的add指令:

=> 0x08048bff <+43>:    add    0x14(%esp,%ebx,4),%eax
(gdb) i r
eax            0x1      1
ecx            0x0      0
edx            0x0      0
ebx            0x1      1
esp            0xffffcd70       0xffffcd70
ebp            0xffffcdc8       0xffffcdc8
esi            0x0      0
edi            0x0      0
eip            0x8048bff        0x8048bff <phase_2+43>
eflags         0x202    [ IF ]
cs             0x23     35
ss             0x2b     43
ds             0x2b     43
es             0x2b     43
fs             0x0      0
gs             0x63     99

我认为0x14(%esp,%ebx,4) 的答案是(%ebx*4)+%esp+0x14,但我得到的是0xffffcd82,我不知道寄存器中的地址是什么。有人可以解释一下我应该在%eax 中输入什么值吗?

【问题讨论】:

  • 您需要一本描述您的 CPU 指令的手册才能理解这一点。
  • 我想正确的问题是假设我的记忆中的数学正确,我在哪里寻找地址 0xffffcd82? GDB 中是否有一条指令可以让您查看内存?我试图找出价值是什么,以找出我所在的行。

标签: assembly x86


【解决方案1】:

是的,你说得对,0x14(%esp,%ebx,4)(%ebx*4)+%esp+0x14 的 at&t 语法。因此,地址是0xffffcd88。您可以让 gdb 使用 p/x $ebx*4+$esp+0x14 为您计算。 add 指令将获取内存中该地址的 4 字节整数,并将其添加到 %eax 中已经存在的任何内容中。您可以使用例如x/d 0xffffcd88 来检查 gdb 中的内存内容。

PS:您可以将 gdb 切换为使用 intel 语法,使用 set disassembly-flavor intel 应该更易于阅读。

【讨论】:

  • 啊,我明白了,你完美地回答了我的问题。现在我知道 %eax 的值是 1。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 2022-11-25
  • 2018-06-24
相关资源
最近更新 更多