`

汇编指令之数据传送指令

阅读更多
        在x86-64 中的寄存器与汇编操作数杂述一节中,我们介绍了 x86-64 中的 16 种寄存器和各种操作数寻址方式,本文将在此基础上介绍汇编中的数据传送指令。
        最简单形式的数据传送指令如下表所示。这些指令把数据从源位置复制到目的位置,不做任何变化。

        这些指令都执行同样的操作,主要区别在于它们操作的数据大小不同,分别是 1、2、4 和 8 字节。源操作数指定的值是一个存储在寄存器或者内存中的立即数,目的操作数指定一个位置,可以是一个寄存器或者内存地址,但源操作数和目的操作数不能都指向内存位置。因此要将一个值从一个内存位置复制到另一个内存位置需要两条指令——第一条将源值加载到寄存器中,第二条再将该寄存器值写入目的位置。这些指令的寄存器操作数可以是 16 个寄存器有标号部分中的任意一个,不过寄存器部分的大小必须与指令最后一个字符(b、w、l 或 q)指定的大小匹配。多数情况下,MOV 指令只会更新目的操作数指定的那些寄存器字节或内存位置。唯一的例外是 movl 指令以寄存器作为目的地址时,它会把该寄存器的高位 4 字节设置为 0。这是 x86-64 采用的惯例,即任何为寄存器生成 32 位值的指令都会把该寄存器的高位部分设置成 0。
        上表中的最后一条指令是处理 64 位立即数数据的。因为常规的 movq 指令只能以表示为 32 位补码数字的立即数作为源操作数,然后再把这个值符号扩展得到 64 位的值,放到目的地址。而 movabsq 指令能够以任意 64 位立即数值作为源操作数,并且只能以寄存器作为目的位置。
        下面的 MOV 指令示例给出了源和目的类型的五种可能的组合(这里使用的是 ATT 汇编格式,MOV 指令的第一个操作数是源,第二个是目的操作数,Intel 汇编格式则是反的,下同)。
movl $0x4050, %eax              ; Immediate -> Register, 4 bytes
movw %bp, %sp                   ; Register -> Register, 2 bytes
movb (%rdi, %rcx), %al          ; Memory -> Register, 1 byte
movb $-17, (%rsp)               ; Immediate -> Memory, 1 byte
movq %rax, -12(%rbp)            ; Register -> Memory, 8 bytes

        除了上表中这些简单形式的移动指令,下面两张表记录的是另两类移动指令,它们可以在将较小范围的源值复制到较大范围的目的时使用。其中,MOVZ 类中的指令把目的中剩余的字节填充为 0,而 MOVS 类中的指令则通过符号扩展来填充。这两类指令名字的最后两个字符都是大小指示符:第一个字符指定源的大小,第二个指明目的的大小。


        需要注意的是,MOVZ 类指令中并没有一条明确的指令把 4 字节源值零扩展到 8 字节目的,因为正如前面所述,这可以用以寄存器为目的的 movl 指令来实现。另外,MOVS 类指令中还给出了 cltq 指令,其没有操作数,因为它总是以寄存器 %eax 作为源,以寄存器 %rax 作为符号扩展结果的目的。它的效果与指令“movslq %eax, %rax”完全一致,不过编码更为紧凑。
        下面这段汇编代码序列演示了数据传送指令是如何修改目的寄存器的高位字节的。
movabsq $0x0011223344556677, %rax    ; %rax = 0x0011223344556677
movb $-1, %al                        ; %rax = 0x00112233445566FF
movw $-1, %ax                        ; %rax = 0x001122334455FFFF
movl $-1, %eax                       ; %rax = 0x00112233FFFFFFFF
movq $-1, %rax                       ; %rax = 0xFFFFFFFFFFFFFFFF

        除了 MOV 类指令外,pushq 和 popq 指令也可以进行数据传送操作:通过 push 操作可以把数据压入栈,通过 pop 操作则将数据弹出栈。在 x86-64 中,程序栈存放在内存中的某个区域。栈一般是向下增长的,因此栈顶元素的地址是所有栈元素地址中最低的。栈顶元素的地址保存在栈指针寄存器 %rsp 中。下表给出了 pushq 和 popq 指令的执行情况。

        因为栈和程序代码以及其他形式的程序数据都是放在同一内存中,所以程序可以用标准的内存寻址方法访问栈内的任意位置。例如,假设栈顶元素是四字,则指令“movq 8(%rsp), %rdx”会将第二个四字从栈中复制到寄存器 %rdx。

参考书籍:《深入理解计算机系统》第三章——程序的机器级表示。
  • 大小: 56.5 KB
  • 大小: 91 KB
  • 大小: 99.4 KB
  • 大小: 57.6 KB
分享到:
评论

相关推荐

    MASM教案,汇编语言指令及数据传送口诀

    汇编语言MASM ,汇编语言指令 ,数据传送口诀,汇编语言相关知识

    单片机汇编指令大全单片机汇编指令大全.doc

    在单片机汇编指令大全中,我们可以看到有多种类型的指令,包括数据传送类指令、算术逻辑类指令、控制转移类指令、输入/输出类指令等等。每种指令都有其特定的功能和应用场景。 以下我们将详细介绍单片机汇编指令...

    RH850 D1汇编指令

    RH850 D1汇编指令作为RH850系列微控制器的核心组成部分之一,其强大的功能和灵活性使其成为实现高性能、低功耗应用的理想选择。通过对汇编指令的深入了解和掌握,开发者能够更好地利用微控制器的各项特性,从而提高...

    汇编指令查询器 数据传送指令 MOV

    数据传送指令 MOV 格式: MOV OPRD1,OPRD2 功能: 本指令将一个源操作数送到目的操作数中,即OPRD1 堆栈操作指令 PUSH和POP 格式: PUSH OPRD

    DSP C6000系列 常用汇编指令大全

    该文档包含了DSP C6000系列芯片的全部汇编指令,涵盖了数据传输、输入输出端口传送、目的地址传送、标志传送、算术运算、逻辑运算等多个方面。 一、数据传输指令 数据传输指令用于在存贮器和寄存器、寄存器和输入...

    Intel汇编指令手册

    通用数据传送指令 - **MOV**:用于在寄存器和内存之间传递一个字或字节的数据。 - **MOVSX**:首先进行符号扩展(根据最高位符号填充其余未使用的高位),然后将结果传送到目标寄存器或内存单元。 - **MOVZX**:...

    8086汇编指令详解

    本文将详细介绍 8086 汇编指令的七个部分:数据传送指令、算术运算指令、逻辑运算指令、串操作指令、控制转移指令、处理器控制指令和保护方式指令。以下将对其中的数据传送指令进行详细介绍。 数据传送指令包括通用...

    汇编基础有关寄存器和数据传送指令

    本文将深入探讨汇编中的寄存器和数据传送指令。 **寄存器详解** 1. **通用寄存器**:在x86架构的CPU中,通用寄存器包括8个16/32位寄存器,如AX/EAX、BX/EBX、CX/ECX和DX/EDX等。它们可以被用于临时存储计算过程中...

    x86汇编指令集大全(带注释).pdf

    1. 通用数据传送指令: - MOV:将数据从一个位置移动到另一个位置。 - MOVSX:符号扩展后传送数据。 - MOVZX:零扩展后传送数据。 - PUSH:将数据压入堆栈。 - POP:从堆栈中弹出数据。 - PUSHA:将16位通用寄存器压...

    汇编程序 排序 数据传送

    - 常见的数据传送指令有MOV(移动)、XCHG(交换)等,它们用于在CPU的不同部件之间转移数据。 - 在排序过程中,数据传送用于获取待比较的数值,以及在排序完成后将结果存储回内存。 4. **电话号码排序**: - ...

    常用汇编指令(常用汇编指令)

    1. 通用数据传送指令 MOV:传送字或字节 MOVSX:先符号扩展,再传送 MOVZX:先零扩展,再传送 PUSH:把字压入堆栈 POP:把字弹出堆栈 PUSHA:把 AX,CX,DX,BX,SP,BP,SI,DI 依次压入堆栈 POPA:把 DI,SI,BP,SP,BX,DX...

    8086 汇编指令速查手册.doc

    本文档提供了8086汇编指令的速查手册,涵盖了数据传输指令、输入输出端口传送指令、目的地址传送指令、标志传送指令和算术运算指令等多个方面。 数据传输指令: 1. MOV指令:传送字或字节。 2. MOVSX指令:先符号...

    汇编指令英文全称

    1. 通用数据传送指令: MOV 指令把一个字节或字的操作数从源地址 src 传送至目的地址 dest。MOVSX 指令将带符号的数据从源地址传送至目的地址,而 MOVZX 指令将无符号的数据从源地址传送至目的地址。 PUSH 和 POP...

    8086汇编指令大集合

    1. **数据传送指令**:这类指令用于在不同位置之间移动数据,如通用数据传送指令、地址传送指令、标志寄存器传送指令、符号扩展指令和扩展传送指令。例如,`MOV`指令是最基本的传送指令,可以将数据从源操作数传送到...

    51单片机汇编指令详解

    本文对51单片机汇编指令进行了详细的解释,涵盖了指令的格式、汇编、指令类型、数据传递类指令、累加器A与外部数据存储器RAM之间的数据传递类指令、程序存储器向累加器A传送指令等内容。 一、概述 单片机的指令...

    8086 汇编指令速查手册

    本文档提供了 8086 汇编指令的速查手册,涵盖了数据传输指令、输入输出端口传送指令、目的地址传送指令、标志传送指令和算术运算指令等多方面的知识点。 一、数据传输指令 数据传输指令用于在存贮器和寄存器、...

    汇编指令(chm格式)

    通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,...

    微计算机与单片机汇编指令集

    在本文中,我们将详细介绍几种在单片机编程中常用的汇编指令,这些指令包括数据传送指令、累加器专用传送指令、地址传送指令等,它们构成了单片机编程的基础部分。 首先,我们来探讨通用数据传送指令。这类指令主要...

    8086 汇编指令集

    这些指令可以分为通用数据传送指令、地址传送指令、标志寄存器传送指令、符号扩展指令、扩展传送指令等。 1. 通用数据传送指令 MOV DEST,SRC 功能:把一个字节、字或双字从源操作数 SRC 传送至目的操作数 DEST。...

    部分8086汇编指令集

    这些指令可以分为四大类:数据传输指令、输入输出端口传送指令、目的地址传送指令和标志传送指令。 数据传输指令: * MOV:传送字或字节 * MOVSX:先符号扩展,再传送 * MOVZX:先零扩展,再传送 * PUSH:把字压入...

Global site tag (gtag.js) - Google Analytics