lea assembly instruction什麼是leal(%edx,%edx,4),%eax是什麼意思?
在上面的頁面,它說
指令leal (%edx, %edx, 4), %eax
表示:eax = edx * 5
但如何?
我所知%edx
是鹼下%edx
是指數和4是按比例
即DISP(鹼,索引標度)。
lea assembly instruction什麼是leal(%edx,%edx,4),%eax是什麼意思?
在上面的頁面,它說
指令leal (%edx, %edx, 4), %eax
表示:eax = edx * 5
但如何?
我所知%edx
是鹼下%edx
是指數和4是按比例
即DISP(鹼,索引標度)。
一般而言,disp(base,index,scale)
給出地址:
base + scale * index + disp
因此,地址(%edx, %edx, 4)
被解釋爲
disp := 0
base := %edx
index := %edx
disp := 4
在一起,它給出:
%edx + %edx * 4 + 0
其給出%edx * 5
。
現在,leal
用於地址分配。它將上述地址分配給%eax
,因此您獲得%eax := %edx * 5
。
這是常見的,因爲縮放因子scale
只能是1,2,4,8,因此不存在方式,通過直接5乘以%EDX。同樣,如果想獲得%eax = %edx * 3
,我們必須做leal (%edx, %edx, 2), %eax
。
你能用例子來解釋嗎?我的意思是把數字分配給%edx – andrew01239
(%edx,%edx,4)'第一個'%edx'是基地址,即內存地址空間中的任何地址,第二個'%edx'是索引,即任何0,1, 2 .....和比例是'4',那麼它是如何解釋爲'%edx * 5'? – andrew01239
不,兩個'%edx'都是一樣的,只是數字(可能是內存地址,但很可能不是這種情況)。所以你有'%edx'的基礎,並且你正在增加索引'%edx',並且規模爲'4',也就是你將索引'%edx * 4'添加到基'%edx',這使得'%edx + %edx * 4',它使用簡單的數學運算'%edx *(1 + 4)',這使得'%edx * 5'。使用數字:假設'%edx == 10',那麼你有'%edx:=%edx +%edx * 4','%edx:= 10 + 10 * 4','%edx:= 10 + 40', '%edx:= 50'。 – CherryDT
disp(base,index,scale)。
你知道這個指令的工作原理(基地+索引*比例),但你的煩惱來自於事實,你一直在考慮的第一個組成部分永遠是一個地址(「即在內存地址空間中的任何住址」 )和第二個組件總是一個索引(「即任何0,1,2 .....」)。
對於執行該指令的CPU,%edx
的內容可以有你選擇的任何意義!它總是只是一個數字,這就是爲什麼我們使用leal (%edx, %edx, 4), %eax
等指令來計算%eax = %edx * 5
。
我喜歡通過說這是一個恰好使用尋址模式語法和機器碼編碼的移位和添加指令來解釋'lea'。 –
您鏈接的問題已經解釋了它。它只是'edx + edx * 4',當然是'edx * 5'(你知道,'1 + 4 = 5') – Jester
@Jester可以一步一步解釋'edx + edx * 4'如何變成'edx * 5'(如何4變成5)? – andrew01239
這是小學數學......如果你得到1個蘋果和4個蘋果,你會得到5個蘋果...什麼不清楚? – Jester