資料傳送指令,目的運算元不能是立即數,資料不能從記憶體直接傳送到記憶體(若需要,轉化成2條指令,從內訪問資料到暫存器,從暫存器到記憶體)
lea(load effective address)其實是mov的變形,它的源運算元看上去是乙個記憶體引用,但並非從指定位置讀入資料,而是將有效位址寫入到目的運算元,目的操作時只能為暫存器
--出自《深入理解計算機系統(第三版)》p129
理解二者的不同之前,我們要先明白以下幾個運算元格式的含義:
暫存器名:實際上是訪問暫存器內儲存的數;
eg: %rdi,實際上就是訪問%rdi暫存器內儲存的值
使用**將二者指令進行對比:
首先說明:
x in %rdi
y in %rsi
%rax 儲存的是返回值
mov指令
lea指令
mov %rsi,%raxlea %rsi,%rax
val = y;
將%rsi暫存器中儲存的值y存放到暫存器%rax中
val = &y;
將%rsi暫存器的位址儲存到暫存器%rax上,但是對於暫存器本身而言,不像記憶體位址表示是16進製制一樣,暫存器通常是使用名稱代替,這裡可以理解為y的值就是%rsi
mov 8(%rsi,%rdi,8),%raxlea 8(%rsi,%rdi,8),%rax
val =*(y+8x+8);
將記憶體位址y+8x+8內儲存的值存放到暫存器%rax中
val = y+8x+8;
將記憶體位址y+8x+8儲存到暫存器%rax上
mov %rsi,(%rax )
*val = y;
將%rsi暫存器中儲存的值y存放到記憶體位址(%rax中存放的值就是記憶體中的位址)內
lea 不存在該格式,因為lea指令的目的運算元只能是暫存器
mov %rsp,%rax = lea (%rsp),%rax 將暫存器%rsp內儲存的值賦值給%rax暫存器
以上拙見,若有錯誤,懇請指點
ATT彙編指令中mov與lea的作用比較
以下是個人的感覺,不太確定對錯,但是測試過好像是這樣。之前挺好奇mov和lea有什麼區別,說是乙個是傳值乙個傳位址,的確好像是這樣。mov的源運算元和目標運算元,其中目標運算元不能是立即數,且源運算元與目標運算元不能同時是儲存器 記憶體位址 lea的源運算元只能是有效位址,目標運算元只能是暫存器。兩...
彙編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各位元組的空間,這就是你的區域性變數。接...