我想了解這條線是如何工作的:LEA是否執行有符號或無符號算術?
lea (%eax, %eax, 4), %eax
所以它看起來像這樣實際上是說:
%eax = 5* %eax
但是否LEA當作符號或無符號?
我想了解這條線是如何工作的:LEA是否執行有符號或無符號算術?
lea (%eax, %eax, 4), %eax
所以它看起來像這樣實際上是說:
%eax = 5* %eax
但是否LEA當作符號或無符號?
1)LEA並非真正用於算術運算,而是計算存儲器操作的絕對地址。
2)簽名操作和未簽名操作之間沒有區別;在這種情況下,簽名操作和無符號操作的結果是相同的。
3)據我所知,使用LEA指令不可能用寄存器乘以負常數。
這將作爲評論更合適,但評論沒有代碼格式。正如其他的意見和馬丁的回答是暗示,你可以不喜歡以下(氣體語法):
// %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
不會。
這一切都在觀看者的眼中:) –
出於某種原因,我的印象是它不會是相同的結果,但我猜這是不真實的? – krb686
所有現代CPU都使用2的補碼,所以在有符號和無符號操作之間不會有任何差異 –