x86-64数据传输指令
关于汇编语言一些基础概念的更详细的介绍,可移步MIPS指令集(一)基本操作_mips指令 sw-CSDN博客
该指令集中一个字2字节。
该架构有16个64位寄存器,名字都以%r开头,每个寄存器的最低位字节,低1~2位字节,低1~4位字节,前8个字节都可单独拿出来使用。如下图
当指令以寄存器为目标时,对于生成小于八字节的结果的指令,有两条规则:生成1、2字节的保持高位不变;生成4字节的把高四字节置为0。
这些寄存器中最特别的是栈指针%rsp,用来指明运行时栈的结束位置。在过程的实现中,这个寄存器很重要。
操作数指示符
第一类是立即数,第二类是寄存器,第三类是内存引用。
主要讲内存引用。x86-64有多种不同的寻址方式
数据传输指令
mov是一类数据传输指令,由四条指令组成:movb,movw,movl和movq,第一个操作数是源操作数,第二个是目的操作数。
常规的movq指令只能以表示为32位补码数字的立即数作为源操作数,然后把这个值符号扩展得到64位的值,放到目的位置。movabsq指令可以任意64位立即数作为源操作数,并且只能以寄存器作为目的。
下面介绍两类mov指令,MOVZ类和MOVS类。
MOVZ类把目的中剩余的字节填充为0,MOVS把目的中剩余的字节填充为符号位。
这里解释没有movzlq指令的原因:该指令可通过如下方式实现,movl指令以寄存器为目的。可以这么做的理由是,生成4字节值并且以寄存器作为目的的指令会把高四位置为0
cltq指令无操作数,效果与movslq %eax %rax完全一致,只是编码更紧凑。
这两类指令与movb,movw,movl和movq不同之处在于,这两类指令会改变高位字节,示例如下