MOV類指令
MOV類指令是最簡單的數據傳送指令,這類指令把數據從源位置複製到目的位置,不做任何變化。
MOV類指令由四條指令組成:movb、movw、movl和movq。
這些指令都執行同樣的操作:主要區別在於它們操作的數據大小不同:分別是1、2、4和8字節。
指令 | 效果 | 描述 |
---|---|---|
傳送 | ||
傳送字節 | ||
傳送字 | ||
傳送雙字 | ||
傳送四字 | ||
傳送絕對四字 |
源操作數指定的值是一個立即數,存儲在寄存器中或者內存中。
目的操作數指定一個位置,要麼是一個寄存器或者,要麼是一個內存地址。
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。
指令 | 效果 | 描述 |
---|---|---|
以零字節擴展進行傳送 | ||
將做了零擴展的字節傳送到字 | ||
將做了零擴展的字節傳送到雙字 | ||
將做了零擴展的字傳送到雙字 | ||
將做了零擴展的字節傳送到四字 | ||
將做了零擴展的字傳送到四字 |
注意到,並沒有一條明確的指令把4字節源值零擴展到8字節目的。
這樣的指令邏輯上應該被命名爲,但是並沒有這樣的指令。
不過,這樣的數據傳送指令可以用以寄存器爲目的的來實現。
這一技術利用的屬性是,生成4字節值並以寄存器作爲目的的指令會把高4字節置爲0.
MOVS類指令
MOVS類數據移動指令,在將較小的源複製到較大的目的時使用。
這些指令把源數據從源(在寄存器或內存中)複製到目的寄存器。
MOVS類中的指令通過符號擴展來填充,把源操作數的最高位進行復制。
指令 | 效果 | 描述 |
---|---|---|
傳送符號擴展的字節 | ||
將做了符號擴展的字節傳送到字 | ||
將做了符號擴展的字節傳送到雙字 | ||
將做了符號擴展的字傳送到雙字 | ||
將做了符號擴展的字節傳送到四字 | ||
將做了符號擴展的字傳送到四字 | ||
將做了符號擴展的雙字傳送到四字 | ||
把%eax符號擴展到%rax |
cltq指令沒有操作數:它總是以寄存器%eax作爲源,%rax作爲符號擴展結果的目的。它的效果與指令movslq %eax, %rax完全一致,不過編碼更緊湊。