2013-04-24 23 views
1

這些是函數的前四行。我知道前兩行在堆棧中創建了一個新框架,並且基本上都是「設置」行。 lea指令做了什麼?在這個x86-64代碼中做了什麼?

40148e: 48 83 ec 18 sub $0x18,%rsp 
401492: 48 89 f2  mov %rsi,%rdx 
401495: 48 8d 4e 04 lea 0x4(%rsi),%rcx 
401499: 48 8d 46 14 lea 0x14(%rsi),%rax 
+0

第二條指令不設置'%rbp' ... – 2013-04-24 08:01:36

+0

您可能希望仔細張貼這個確切的ASM給出我認爲它來自哪裏。 – 2017-09-11 18:37:02

回答

2

lea,加載有效地址,把計算出的「內存地址」的結果寄存器。所以在這裏,rcx = rsi + 4rax = rsi + 0x14

順便說一句,第二行看起來不像是設置堆棧幀的代碼的一部分,rsi是使用System V AMD64調用約定時的第二個參數。

+1

請記住,'lea'不一定**有**用於計算地址。由於它不像正常的算術指令那樣佔用ALU,所以當不需要標誌時,編譯器喜歡用它來執行簡單的算術運算(「簡單」=由'lea'和尋址模式支持的類型)。 – 2013-04-24 07:20:37

+0

@DanielKamilKozar爲什麼人們會這樣說? 'lea'幾乎在任何CPU上都使用ALU。它不是免費的。 「lea在AGU」曾經是一個灰暗和過去的事情.. – harold 2013-04-24 07:26:29

+0

來源:http://www.agner.org/optimize/instruction_tables.pdf「lea」在K7,K8,K10, Atom ..就是這樣。 – harold 2013-04-24 07:48:03