数据传送指令
3.数据传送指令
将数据从一个位置复制到另一个位置的指令。
最简单形式的数据传送指令——MOV类指令。
指令格式 | 指令功能 | 效果 |
---|---|---|
movb S,D | 传送一个字节(8位) | S->D |
movw S,D | 传送一个字(16位) | S->D |
movl S,D | 传送双字(32位) | S->D |
movq S,D | 传送四字(32位扩展为64位) | S->D |
movabsq I,R | 传送绝对的四字(64位) | I->R |
源操作数可以为以下类型
- 立即数,例如$0x100
- 寄存器,例如%bp
- 存储器,例如(%rdi,%rcx)
目的操作数可为寄存器或存储器。
x86-64限制:传送指令源操作数及目的操作数不能都指向内存位置。
movabsq能够以任何64位数(立即数、寄存器、存储器)作为源操作数,但只能以寄存器作为目的操作数。
MOVZ类指令
MOVZ类指令将较小的源值复制到较大的目的中去,将目的中剩余字节填充为0
零扩展,格式为movz#&(#为源操作数的大小,&为目的操作数的大小):
- movzbw
- movzbl
- movzbq
- movzwl
- movzwq
注:无movzlq指令,movzlq可利用以寄存器位目的的movl实现(因为movl会将寄存器高位四字节置零)
MOVS类指令
MOVS类指令将较小的源值复制到较大的目的中去,将源操作的最高为复制用于填充目的剩余字节,即传送符号扩展的字节
符号扩展,格式为movs#&(#为源操作数的大小,&为目的操作数的大小):
- movsbw
- movsbl
- movsbq
- movswl
- movswq
- movslq
- cltq 把%eax符号扩展到%rax(eax为rax寄存器的低32位)类似于movslq %eax,%rax
程序栈
程序栈是一种数据结构,具有“后进先出(Last In First Out)”的特性。
在x86-64中,程序栈存放在内存中的某个区域,栈顶元素的地址是所有栈中元素地址最低的,栈指针%rsp保存栈顶元素的地址。
入栈出栈指令
指令 | 效果 | 描述 |
---|---|---|
pushq S | R[%rsp]<-R[%rsp]-8; | 将四字压入栈 |
M[R[%rsp]]<-S | ||
popq S | D<-M[R[%rsp]]; | 将四字弹出栈 |
R[%rsp]<-R[%rsp]+8 |