数据传送指令

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
posted @ 2019-07-18 21:15  shadowgully  阅读(1473)  评论(0编辑  收藏  举报