2014-04-02 42 views
2

我想了解這條線是如何工作的:LEA是否執行有符號或無符號算術?

lea (%eax, %eax, 4), %eax 

所以它看起來像這樣實際上是說:

%eax = 5* %eax 

但是否LEA當作符號或無符號?

+3

這一切都在觀看者的眼中:) –

+0

出於某種原因,我的印象是它不會是相同的結果,但我猜這是不真實的? – krb686

+3

所有現代CPU都使用2的補碼,所以在有符號和無符號操作之間不會有任何差異 –

回答

8

1)LEA並非真正用於算術運算,而是計算存儲器操作的絕對地址。

2)簽名操作和未簽名操作之間沒有區別;在這種情況下,簽名操作和無符號操作的結果是相同的。

3)據我所知,使用LEA指令不可能用寄存器乘以負常數。

+3

爲了擴展#1,我不知道任何使用負內存地址的架構...... :-) –

+0

對於帶符號或無符號數字,補碼加法的結果是相同的。兩個32位操作數乘積的低32位對於有符號或無符號數是相同的。對於一些彙編程序(也許是全部),負常數可以用作立即值。 – rcgldr

+0

是否有意或無意; LEA通常用於算術運算 - 或者因爲它的速度快於等價的指令序列,或者因爲它不修改標誌。 – Brendan

1

這將作爲評論更合適,但評論沒有代碼格式。正如其他的意見和馬丁的回答是暗示,你可以不喜歡以下(氣體語法):

// %ecx has a size in it 
neg %ecx 
lea (%esp, %ecx, 4), %esp /* subtract %ecx*4 from stack ptr */ 
neg %ecx 

...與像比較:

lea (,%ecx,4), %edx 
sub %edx, %esp 

...或:

lea (,%ecx,4), %edx 
neg %edx 
lea (%esp,%edx), %esp 

我不能在性能上的差異發表評論,但sub將改變旗幟和lea不會。