2014-02-19 36 views
0
add $1, (%eax, %ecx, 1) 

我知道首先它将ecx乘以1个字节,但它是ecx的内存地址还是它的值?并且,当它添加到eax中时,是将内存地址添加到eax中还是将ecx的值添加到eax中?那么最后呢,它会把1加到eax的内存地址上?谢谢。这个大会x86线做什么?

回答

1

它将地址EAX + ECX的32位值加1。 (%eax, $ecx, 1)语法表示操作编码的基于比例 - 索引的部分,其中EAX是基准,ECX是索引,1是比例(即根本没有比例)。对于具有恒定位移1的地址,语法应该是1(%eax, $ecx, 1)

+0

汇编程序如何知道它是递增32位值而不是16位或8位值?使用英特尔汇编程序时,需要指定操作数大小,例如“add dword ptr [eax,ecx],1”。在ATT汇编语法中,“add”与“addl”相同吗? – rcgldr

+0

处于32位模式的CPU - 寄存器名称表明。没有明确的“字节ptr”或“字ptr”,即使在英特尔语法中,默认值也是32位操作数(至少如MASM所理解的那样)。 AT&T语法在命令('addl',而不是'add')之后确实需要操作数大小后缀,但也许有些汇编器原谅了这一点。 –

+0

使用ML.EXE(MASM 6.11)或更高版本,我得到指令“mov [ebx],1”的“错误A2070:无效指令操作数”。将其更改为“mov dword ptr [ebx],1修复错误(也可以使用字ptr或字节ptr。如果在64位模式下,则可以使用mov qword ptr [rbx],1。 – rcgldr