将数据从一个位置复制到另一个位置的指令。
指令格式 | 指令功能 | 效果 |
---|---|---|
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 |
源操作数可以为以下类型
目的操作数可为寄存器或存储器。
x86-64限制:传送指令源操作数及目的操作数不能都指向内存位置。
movabsq能够以任何64位数(立即数、寄存器、存储器)作为源操作数,但只能以寄存器作为目的操作数。
MOVZ类指令将较小的源值复制到较大的目的中去,将目的中剩余字节填充为0
零扩展,格式为movz#&(#为源操作数的大小,&为目的操作数的大小):
注:无movzlq指令,movzlq可利用以寄存器位目的的movl实现(因为movl会将寄存器高位四字节置零)
MOVS类指令将较小的源值复制到较大的目的中去,将源操作的最高为复制用于填充目的剩余字节,即传送符号扩展的字节
符号扩展,格式为movs#&(#为源操作数的大小,&为目的操作数的大小):
程序栈是一种数据结构,具有“后进先出(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 |
原文:https://www.cnblogs.com/sgawscd/p/11210040.html