2014-02-19 125 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