-1
我對程序集有一個非常簡短的理解,並且對以下代碼的作用感到困惑?movl(%eax,%edx,4),%ecx指令是做什麼的?
movl (%eax, %edx, 4), %ecx
我的理解是%edx
被乘以4,然後用的%eax
值被相加,然後被存儲在%ecx
這是通過數值給出的表
給出的答案是0x11,但我沒有得到答案。
我對程序集有一個非常簡短的理解,並且對以下代碼的作用感到困惑?movl(%eax,%edx,4),%ecx指令是做什麼的?
movl (%eax, %edx, 4), %ecx
我的理解是%edx
被乘以4,然後用的%eax
值被相加,然後被存儲在%ecx
這是通過數值給出的表
給出的答案是0x11,但我沒有得到答案。
EDX乘以4,加到EAX,從該地址的內存中讀取4字節的值,並放入ECX中。
MOV通常不執行算術運算,除非它是地址計算。
你的具體情況:edx = 3
,eax = 0x100
,temporary_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*eax
:lea (eax,eax,4),eax
(可能比imul
更快,並且不會更改標誌寄存器,有時很方便)。
在AT&T語法中,使用'(..)'圓括號表示正在提取/寫入內存內容。不幸的是,規則沒有到處遵循,某些指令強制使用內存,而沒有使用'()'語法(當指令對於非內存使用沒有意義時)。在英特爾語法中,內存訪問由'[]'標記,用所有(?)指令更嚴格地使用('lea'是使用'mov'語法的一種例外,但不訪問內存)。因此,使用AT&T語法,您必須完全閱讀指令以確定內存是否被訪問,但使用'()'這是安全的。 – Ped7g