AT&T彙編——MOV指令

MOV類指令

MOV類指令是最簡單的數據傳送指令,這類指令把數據從源位置複製到目的位置,不做任何變化。
MOV類指令由四條指令組成:movb、movw、movl和movq。
這些指令都執行同樣的操作:主要區別在於它們操作的數據大小不同:分別是1、2、4和8字節。

指令 效果 描述
MOVS,DMOV S,D D<SD <- S 傳送
movbmovb 傳送字節
movwmovw 傳送字
movlmovl 傳送雙字
movqmovq 傳送四字
movabsqI,Rmovabsq I, R R<IR<-I 傳送絕對四字

源操作數指定的值是一個立即數,存儲在寄存器中或者內存中。
目的操作數指定一個位置,要麼是一個寄存器或者,要麼是一個內存地址。
x86-64加了一條限制,傳送指令的兩個操作數不能都指向內存位置。
將一個值從一個內存位置複製到另一個內存位置需要兩條指令——第一條指令將源值加載到寄存器中,第二條將該寄存器值寫入目的位置。
這些指令的寄存器操作數可以是x86-64CPU的16寄存器中有標號部分中的任意一個,寄存器部分的大小必須與指令最後一個字符(b、w、l或q)指定的大小匹配。
大多數情況下,MOV中指令只會更新目的操作數指定的那些寄存器字節或內存位置。唯一的例外是movl指令以寄存器作爲目的時,它會把該寄存器的高4位字節設置爲0
造成這個例外的原因是x86-64採用的慣例,即任何爲寄存器生成32爲值的指令都會把該寄存器的高位部分置成0。
常規的movq指令只能以表示爲32位補碼數字的立即數作爲源操作數,然後把這個值符號擴展得到64位的值,放到目的位置。movabsq指令能夠以任意64位立即數值作爲源操作數,並且只能以寄存器作爲目的。

MOVZ類指令

MOVZ類數據移動指令,在將較小的源複製到較大的目的時使用。
這些指令把數據從源(在寄存器或內存中)複製到目的寄存器。
MOVZ類中的指令把目的中剩餘的字節填充爲0。

指令 效果 描述
MOVZS,RMOVZ S, R R<(S)R<-零擴展(S) 以零字節擴展進行傳送
movzbwmovzbw 將做了零擴展的字節傳送到字
movzblmovzbl 將做了零擴展的字節傳送到雙字
movzwlmovzwl 將做了零擴展的字傳送到雙字
movzbqmovzbq 將做了零擴展的字節傳送到四字
movzwqmovzwq 將做了零擴展的字傳送到四字

注意到,並沒有一條明確的指令把4字節源值零擴展到8字節目的。
這樣的指令邏輯上應該被命名爲movzlqmovzlq,但是並沒有這樣的指令。
不過,這樣的數據傳送指令可以用以寄存器爲目的的movlmovl來實現。
這一技術利用的屬性是,生成4字節值並以寄存器作爲目的的指令會把高4字節置爲0.

MOVS類指令

MOVS類數據移動指令,在將較小的源複製到較大的目的時使用。
這些指令把源數據從源(在寄存器或內存中)複製到目的寄存器。
MOVS類中的指令通過符號擴展來填充,把源操作數的最高位進行復制。

指令 效果 描述
MOVZS,RMOVZ S,R R<(S)R<-符號擴展(S) 傳送符號擴展的字節
movsbwmovsbw 將做了符號擴展的字節傳送到字
movsblmovsbl 將做了符號擴展的字節傳送到雙字
movswlmovswl 將做了符號擴展的字傳送到雙字
movsbqmovsbq 將做了符號擴展的字節傳送到四字
movswqmovswq 將做了符號擴展的字傳送到四字
movslqmovslq 將做了符號擴展的雙字傳送到四字
cltqcltq %rax <- 符號擴展(%eax) 把%eax符號擴展到%rax

cltq指令沒有操作數:它總是以寄存器%eax作爲源,%rax作爲符號擴展結果的目的。它的效果與指令movslq %eax, %rax完全一致,不過編碼更緊湊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章