【问题标题】:How does "mov (%ebx,%eax,4),%eax" work? [duplicate]“mov (%ebx,%eax,4),%eax”是如何工作的? [复制]
【发布时间】:2013-01-31 18:15:57
【问题描述】:

一直在从事装配任务,并且大部分情况下我对装配非常了解。或者至少对于这项任务来说足够好。但是这个 mov 声明让我绊倒了。如果有人能解释一下这个 mov 语句是如何操纵寄存器值的,我将不胜感激。

mov (%ebx,%eax,4),%eax

附:我无法通过基本搜索找到这种特定类型的 mov 语句,所以如果我错过了它并再次提出问题,我深表歉意。

【问题讨论】:

  • 这个问题绝对是重复的。让我环顾四周。你检查过docs吗?他们很好地解释了这些东西。不过,您可能希望转换为 Intel 格式的程序集以便在这些书中查找。
  • 我认为它会是,但我感谢帮助寻找合适的地方。
  • 参见维基书籍上的GAS syntax addressing mode syntax,以及x86 tag wiki中的其他链接
  • 另请参阅AT&T syntax tag wiki,了解有关语法的更多详细信息,以及指向更多文档的链接。

标签: assembly att addressing-mode


【解决方案1】:

AT&T汇编中完整的内存寻址方式格式为:

offset(base, index, width)

所以对于你的情况:

offset = 0
base = ebx
index = eax
width = 4

意思是指令类似于:

eax = *(uint32_t *)((uint8_t *)ebx + eax * 4 + 0)

在类似 C 的伪代码中。

【讨论】:

  • 为什么uint8_t在这里?
  • 是的,但为什么特别是 uint8? ebx、eax等所有的寄存器都是32位的,高三个字节的信息是否丢失?我问是因为我有:leal 0x2004(%ebx), %eax 但我看到:leal 0x4(%ebx), %eax 在调试器中
  • 因为我希望 eax*4 以字节为增量,而不是 32 位字。请注意,它没有被取消引用为一个字节。
  • 转换为 (uintptr_t) 而不是数学指针可能更清楚。
猜你喜欢
  • 2012-05-21
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 2012-10-10
  • 1970-01-01
  • 2016-05-29
  • 2013-09-10
相关资源
最近更新 更多