鍍金池/ 問答/C  網(wǎng)絡安全/ 匯編語言中l(wèi)eal指令是什么指令?

匯編語言中l(wèi)eal指令是什么指令?

按照書上說的編譯c代碼 結果本來應該是pushl movl addl指令的地方 被一條leal指令完全替代了?
書上說gcc更新地很快 不可能完全一樣 但是leal指令是怎么運作的?
另外 為什么這些指令旁邊都帶著個l? 以及 .seh_endprologue 這個代碼又是什么?
書上的代碼
//code.c
int accum=0;
int sum(int x,int y)
{

int t=x+y;
accum+=t;
return t;

}

dos窗口里用gcc編譯后形成的s文件的一部分

sum:

.seh_endprologue
leal    (%rcx,%rdx), %eax
addl    %eax, accum(%rip)
ret

書上說匯編代碼應該是這樣
sum:

pushl   %ebp
movl    %esp,%ebp
movl    12(%ebp),%eax
addl    8(%ebp),%eax
addl    %eax,accum
popl    %ebp
ret
回答
編輯回答
放開她

leal是地址裝載運算符,原本是專門用來取地址的(類似于C語言的取地址運算&),但是后來經(jīng)常被用作優(yōu)化作用。原因是它可以用一條指令做到原本需要數(shù)條指令才能實現(xiàn)的事情。

比如:

leal (%eax, %eax, 4), %eax

這條指令等同于%eax * 5。

在你的程序里面,原本需要兩條指令的t = x + y,用leal只需一條指令即可。

至于點號開頭的并不是實際的指令,而是給匯編器看的,可以不用理會。

2018年9月15日 05:59