ATT格式彙編 mov與lea的區別

2021-09-29 09:58:09 字數 1095 閱讀 9216

資料傳送指令,目的運算元不能是立即數,資料不能從記憶體直接傳送到記憶體(若需要,轉化成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各位元組的空間,這就是你的區域性變數。接...