2016-05-15 304 views
-5

lea assembly instruction什麼是leal(%edx,%edx,4),%eax是什麼意思?

在上面的頁面,它說

指令leal (%edx, %edx, 4), %eax表示:eax = edx * 5

但如何?

我所知%edx是鹼下%edx是指數和4是按比例

即DISP(鹼,索引標度)。

+4

您鏈接的問題已經解釋了它。它只是'edx + edx * 4',當然是'edx * 5'(你知道,'1 + 4 = 5') – Jester

+0

@Jester可以一步一步解釋'edx + edx * 4'如何變成'edx * 5'(如何4變成5)? – andrew01239

+1

這是小學數學......如果你得到1個蘋果和4個蘋果,你會得到5個蘋果...什麼不清楚? – Jester

回答

2

一般而言,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

+0

你能用例子來解釋嗎?我的意思是把數字分配給%edx – andrew01239

+0

(%edx,%edx,4)'第一個'%edx'是基地址,即內存地址空間中的任何地址,第二個'%edx'是索引,即任何0,1, 2 .....和比例是'4',那麼它是如何解釋爲'%edx * 5'? – andrew01239

+1

不,兩個'%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

3

disp(base,index,scale)。

知道這個指令的工作原理(基地+索引*比例),但你的煩惱來自於事實,你一直在考慮的第一個組成部分永遠是一個地址(「即在內存地址空間中的任何住址」 )和第二個組件總是一個索引(「即任何0,1,2 .....」)。

對於執行該指令的CPU,%edx的內容可以有你選擇的任何意義!它總是只是一個數字,這就是爲什麼我們使用leal (%edx, %edx, 4), %eax等指令來計算%eax = %edx * 5

+2

我喜歡通過說這是一個恰好使用尋址模式語法和機器碼編碼的移位和添加指令來解釋'lea'。 –