moV指令是存取數據指令,cpu主要是跟寄存器和內存打交道,可以進行兩種尋址方式的操作:直接尋址和間接尋址;指令類型主要是:將立即數取入指定數據寄存器;將直接地址中的數據取入指定數據寄存器;將指定寄存器內的數據存入指定的地址中;將指定寄存器內的數據放入地中址寄存器指定的內存中。
mov指令
1.mov指令的順序是從右到左,如mov a,b,則把b的值復制給a。如:MOV 目的操作數(a),源操作數(b) ,即a=b
2.除了之前提到的movb,movw,movl,movq,還有movabsq,代表傳送絕對的四字,movq雖可傳四字,但一旦要傳立即數,則只能傳32位補碼表示的立即數,隨后把它符號拓展到64位。而movabsq可以直接傳64位的立即數,但是它只能以寄存器作為目的地。
3.所有mov指令都不支持從一個內存地址直接傳到另一個內存地址,如movw (%rax),4(%rsp)是不行的。
4.決定mov使用哪個后綴的是寄存器的大小,當兩邊操作的都是寄存器時,若大小不同,必須用第5條中的小數據復制到大目的地的類型的mov指令,當兩邊操作的是立即數和內存時,可以以立即數大小為準,
例子:movl $0x4050,%eax 0x4050雖然是2字節,但%eax是4字節,所以movl
movw %bp,%sp
movb (%rdi,%rcx),%al
movb $17,(%rsp) 立即數->內存
movq %rax,-12(%rbp)
5.當想將小的數據復制到大的目的地時,可以用movz或movs,前者代表用0填充高字節,后者代表用符號填充高字節,后面還要加上兩種轉換數據的大小,
比如movzbw(字節->字,0填充),movswq(字->四字,符號填充),還有一種cltq指令,特指%eax->%rax的符號拓展轉換,等價于movslq %eax,%rax
注意movs和movz都是以寄存器為目的地的。
根據以上信息,可以知道,之前的第4點中的特殊規則其實相當于是說movl可以實現movzlq的功能