ATT彙編指令中mov與lea的作用比較

2021-08-21 19:03:25 字數 1319 閱讀 4156

以下是個人的感覺,不太確定對錯,但是測試過好像是這樣。

之前挺好奇mov和lea有什麼區別,說是乙個是傳值乙個傳位址,的確好像是這樣。

mov的源運算元和目標運算元,其中目標運算元不能是立即數,且源運算元與目標運算元不能同時是儲存器(記憶體位址)。

lea的源運算元只能是有效位址,目標運算元只能是暫存器

兩者在操作一些記憶體位址上意思好像是一樣的。

比如0x8151abc是乙個函式的位址,我們想把它存入%ebp中,則可以這樣:

mov  $0x8151abc,%ebp 

lea 0x8151abc,%ebp

第乙個的意思是把立即數存入%ebp中,作為%ebp的值。

第二個的意思是把位址存入%ebp中,作為%ebp的值,兩者並無差別。

但是當mov的源運算元是位址的時候:

mov  0x8151abc,%ebp  

或者 mov 0x28(%esp),%ebp

意思就變了,變成從這個位址中找到儲存的值傳送到%ebp中。

所以,綜合上面可知道lea其實就是mov的一種形式。

而且lea指令可以載入有效位址也可以理解源運算元是暫存器儲存的值,即:

int func(int

x,int

y)%rdi為x,%rsi為y

則: lea 0x2(%rdi,%rsi,2),%rax //eax=x+2

y+2

以上的使用比起mov來說方便一些,其實還是得看所使用的暫存器主要用來做什麼,要是上面的例子中引數為指標的話:

int func(int

*x,int

*y)mov (%rsi),%rax //rax= *y;

lea 0x2(%rax,%rax),%rax //rax=2

*rax+2

add (%rdi),%rax //rax=rax+*x

則不能直接用lea,因為這樣會得到的是指標x與指標y位址的合+2,這時候用mov倒是比較方便,先從指標指向的位址中獲取值,然後用lea去計算,再用add.

所以,到底是使用lea或者mov,得看情況,看暫存器的用途去使用吧。

彙編Lea 指令與 Mov 指令

比如你用local在棧上定義了乙個區域性變數localvar,你知道實際的指令是什麼麼?一般都差不多像下面的樣子 push ebp mov esp,ebp sub esp,4 現在棧上就有了4各位元組的空間,這就是你的區域性變數。接下來,你執行mov localvar,4,那麼實際的指令又是什麼?是...

彙編Lea 指令與 Mov 指令

初學彙編,可能對lea指令很迷惑。關於lea指令,下面的文章寫的很好。比如你用local在棧上定義了乙個區域性變數localvar,你知道實際的指令是什麼麼?一般都差不多像下面的樣子 push ebp mov esp,ebp sub esp,4現在棧上就有了4各位元組的空間,這就是你的區域性變數。接...

彙編lea 指令與 mov 指令

比如你用local在棧上定義了乙個區域性變數localvar,你知道實際的指令是什麼麼?一般都差不多像下面的樣子 push ebp mov esp,ebp sub esp,4 現在棧上就有了4各位元組的空間,這就是你的區域性變數。接下來,你執行mov localvar,4,那麼實際的指令又是什麼?是...