以下是個人的感覺,不太確定對錯,但是測試過好像是這樣。
之前挺好奇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,那麼實際的指令又是什麼?是...