簡體   English   中英

x86-32 匯編中的“lea eax, [ebx + eax]”和“add eax, ebx”有什么區別?

[英]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

更不用說它更好地描述了意圖:)

就數值結果而言,沒有區別。

但是,除了存儲在目標寄存器中的實際結果之外,指令還有更多內容:

  1. 正如aix 所指出的, lea不會根據加法的結果設置標志。 這有時對於指令調度目的很有用。

  2. 一些微架構(早期的 Atom 內核)也存在時序差異; 具體來說,在算術單元和地址生成單元之間轉發結果時會涉及停頓,根據上下文使用addlea可以消除這些(非常小的)停頓。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM