2013-02-15 184 views
3

一直在组装作业,而且大部分我都很了解组件。或者至少对于这个任务来说是足够好的。但是这个mov声明让我沮丧。我真的很感激,如果有人可以解释这个mov语句如何操作寄存器值。“mov(%ebx,%eax,4),%eax”是如何工作的?

MOV(%EBX,%eax中,4),%eax中

P.S.我无法通过基本搜索找到这种特定类型的mov语句,所以我很抱歉如果我错过了它并且在回答问题。

+1

这个问题绝对是重复的。让我看看周围。你有没有检查过[docs](http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)?他们很好地解释了这个问题。尽管如此,您可能想要翻译为英特尔格式程序集,以便在这些书籍中查找。 – 2013-02-15 17:45:23

+0

我觉得这将是,但我很欣赏寻找合适的地方寻找帮助。 – Scalahansolo 2013-02-15 17:48:21

+0

请参阅wikibooks上的[GAS语法寻址模式语法](http://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax#Address_operand_syntax)以及[x86 tag wiki]中的其他链接(https://stackoverflow.com/tags/x86/info) – 2017-09-23 07:44:47

回答

5

完整的存储器寻址模式格式AT &变速箱总成是:

offset(base, index, width) 

因此,对于您的情况:

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

含义,该指令是一样的东西:

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

在类似C的伪代码中。

+0

为什么'uint8_t'在这里? – 0xAX 2015-02-03 10:57:22

+0

指针算术。 – 2015-02-03 11:08:26

+0

是的,但为什么特别是uint8?所有的ebx,eax等等......寄存器都是32位的,无论信息在高三位字节中是否丢失?我问,因为我有:'leal 0x2004(%ebx),%eax',但我看到:'leal 0x4(%ebx),%eax'在调试器中 – 0xAX 2015-02-03 11:19:19

相关问题