[英]What is the difference between "lea eax, [ebx + eax]" and "add eax, ebx" in x86-32 assembly?
GCC 給我做了一些匯編代碼,里面有這個語句:
lea eax, [ebx+eax]
(英特爾語法)只是好奇,這與以下有何區別:
add eax, ebx
是?
eax 和 ebx 包含函數的返回值:)
mov eax, DWORD PTR [ebp+8]
mov DWORD PTR [esp], eax
call CALC1
mov ebx, eax.
mov eax, DWORD PTR [ebp+8]
mov DWORD PTR [esp], eax
call CALC2
lea eax, [ebx+eax]
立即想到的一個區別是lea
不影響標志,而add
會。
如果沒有看到匯編代碼的其余部分,就不可能說這是否有任何相關性。 它可能只是 GCC 代碼生成器的人工制品(即它實際上可以為更一般的情況生成代碼,或者只是使用lea
作為更靈活的add
。)
您可以將結果放入 EAX 以外的其他寄存器中,例如lea edx, eax + ebx
。 add
做不到。
lea
還可以有一個額外的第三個操作數,例如lea eax, ebp + esi + 12
,這使其成為add
指令的更方便的替代方法。
您還可以將某些(字大小的)乘法運算與其結合使用,例如lea eax, ebp + eax * 8
。
更不用說它更好地描述了意圖:)
就數值結果而言,沒有區別。
但是,除了存儲在目標寄存器中的實際結果之外,指令還有更多內容:
正如aix 所指出的, lea
不會根據加法的結果設置標志。 這有時對於指令調度目的很有用。
一些微架構(早期的 Atom 內核)也存在時序差異; 具體來說,在算術單元和地址生成單元之間轉發結果時會涉及停頓,根據上下文使用add
或lea
可以消除這些(非常小的)停頓。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.