2016-11-15 545 views
-1

我對程序集有一個非常簡短的理解,並且對以下代碼的作用感到困惑?movl(%eax,%edx,4),%ecx指令是做什麼的?

movl (%eax, %edx, 4), %ecx 

我的理解是%edx被乘以4,然後用的%eax值被相加,然後被存儲在%ecx這是通過數值給出的表

Register Values

給出的答案是0x11,但我沒有得到答案。

+0

在AT&T語法中,使用'(..)'圓括號表示正在提取/寫入內存內容。不幸的是,規則沒有到處遵循,某些指令強制使用內存,而沒有使用'()'語法(當指令對於非內存使用沒有意義時)。在英特爾語法中,內存訪問由'[]'標記,用所有(?)指令更嚴格地使用('lea'是使用'mov'語法的一種例外,但不訪問內存)。因此,使用AT&T語法,您必須完全閱讀指令以確定內存是否被訪問,但使用'()'這是安全的。 – Ped7g

回答

2

EDX乘以4,加到EAX,從該地址的內存中讀取4字節的值,並放入ECX中。

MOV通常不執行算術運算,除非它是地址計算。


你的具體情況:edx = 3eax = 0x100temporary_address_in_CPU_during_mov = eax + edx * 4 = 0x100 + 3*4 = 0x10C。地址0x10C的內存值爲0x11

這個地址運算可以通過lea指令使用本身,當CPU將做地址數學,但不是從內存中加載值它只會存儲計算的地址,所以:

leal (%eax, %edx, 4), %ecx 

將加載ecx與值0x10C(不訪問內存)。對於簡單的算術運算,這有時會被「欺騙」,如eax = 5*eaxlea (eax,eax,4),eax(可能比imul更快,並且不會更改標誌寄存器,有時很方便)。

相關問題