- 浏览: 141169 次
文章分类
最新评论
在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 汇编格式则是反的,下同)。
除了上表中这些简单形式的移动指令,下面两张表记录的是另两类移动指令,它们可以在将较小范围的源值复制到较大范围的目的时使用。其中,MOVZ 类中的指令把目的中剩余的字节填充为 0,而 MOVS 类中的指令则通过符号扩展来填充。这两类指令名字的最后两个字符都是大小指示符:第一个字符指定源的大小,第二个指明目的的大小。
需要注意的是,MOVZ 类指令中并没有一条明确的指令把 4 字节源值零扩展到 8 字节目的,因为正如前面所述,这可以用以寄存器为目的的 movl 指令来实现。另外,MOVS 类指令中还给出了 cltq 指令,其没有操作数,因为它总是以寄存器 %eax 作为源,以寄存器 %rax 作为符号扩展结果的目的。它的效果与指令“movslq %eax, %rax”完全一致,不过编码更为紧凑。
下面这段汇编代码序列演示了数据传送指令是如何修改目的寄存器的高位字节的。
除了 MOV 类指令外,pushq 和 popq 指令也可以进行数据传送操作:通过 push 操作可以把数据压入栈,通过 pop 操作则将数据弹出栈。在 x86-64 中,程序栈存放在内存中的某个区域。栈一般是向下增长的,因此栈顶元素的地址是所有栈元素地址中最低的。栈顶元素的地址保存在栈指针寄存器 %rsp 中。下表给出了 pushq 和 popq 指令的执行情况。
因为栈和程序代码以及其他形式的程序数据都是放在同一内存中,所以程序可以用标准的内存寻址方法访问栈内的任意位置。例如,假设栈顶元素是四字,则指令“movq 8(%rsp), %rdx”会将第二个四字从栈中复制到寄存器 %rdx。
参考书籍:《深入理解计算机系统》第三章——程序的机器级表示。
最简单形式的数据传送指令如下表所示。这些指令把数据从源位置复制到目的位置,不做任何变化。
这些指令都执行同样的操作,主要区别在于它们操作的数据大小不同,分别是 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。
参考书籍:《深入理解计算机系统》第三章——程序的机器级表示。
发表评论
-
浮点运算指令
2019-05-22 23:13 1568上一节介绍了浮点数与各种数值类型之间的相互转换 ... -
浮点数类型转换指令
2019-05-15 22:37 1691在浮点寄存 ... -
浮点寄存器概述
2019-05-14 22:31 2568本文介绍的浮点寄存器是基于 AVX2(Adva ... -
汇编指令之跳转指令
2019-04-15 00:21 4769正常执行的情况下,指令会按照顺序一条条地执行, ... -
汇编指令之条件码
2019-04-08 21:05 2336在系统底层,除了整数寄存器,CPU 还维护着一 ... -
汇编指令之算术和逻辑操作指令
2019-03-28 22:16 1347下表是 x86-64 ... -
x86-64 中的寄存器与汇编操作数杂述
2019-03-20 21:45 982Intel 中常用 ... -
hello 程序执行背后的故事
2018-12-26 21:48 607源文件 hello. ... -
linux启动服务概述
2017-04-08 02:43 396传统的linux中定义了七个运行级,分别如下: ... -
unix限制
2017-04-04 16:08 572UNIX系统实现定义了很多幻数和常量,其中有很 ... -
linux引导加载程序--GRUB
2017-04-04 04:22 623linux世界里有两种 ... -
存储器映射
2016-06-13 00:12 551注:本文摘自《深入理解计算机操作系统》第九章--虚拟存 ... -
虚拟存储器对存储器管理的作用
2016-06-10 16:00 693注:本文中的大部分内容均是摘录自《深入理解计算机系统》一书,权 ... -
信号处理问题
2016-06-03 08:31 560注:本文摘自《深入理解计算机系统》第8章 --- 异常控制流。 ... -
僵尸进程
2016-05-23 23:57 359在解释僵尸进程的概念之前,我们得先了解这样的一个事实: 一个进 ... -
程序优化之存储器别名使用
2016-05-20 08:55 794说明:本文示例摘自《深入理解计算机系统》第五章----优化程序 ... -
条件变量基本概念与原理(转载)
2016-05-20 08:54 1568对于条件变量,我一直感到很困惑,搞不清其与互斥锁到底有啥区别, ... -
CPU与磁盘的交互过程
2016-05-19 09:05 1829对于计算机系统底层技术,想必很多人都和我一样不太了解,最近在学 ... -
存储器层次结构中基本的缓存原理
2016-05-19 09:00 663对于操作系统,我们知道,越靠近CPU的存储器,其存储速度就会越 ... -
异常处理
2016-05-19 00:29 422我知道很多人都知道异常处理,但可能对其底层并不太了解,现在我们 ...
相关推荐
汇编语言MASM ,汇编语言指令 ,数据传送口诀,汇编语言相关知识
在单片机汇编指令大全中,我们可以看到有多种类型的指令,包括数据传送类指令、算术逻辑类指令、控制转移类指令、输入/输出类指令等等。每种指令都有其特定的功能和应用场景。 以下我们将详细介绍单片机汇编指令...
RH850 D1汇编指令作为RH850系列微控制器的核心组成部分之一,其强大的功能和灵活性使其成为实现高性能、低功耗应用的理想选择。通过对汇编指令的深入了解和掌握,开发者能够更好地利用微控制器的各项特性,从而提高...
数据传送指令 MOV 格式: MOV OPRD1,OPRD2 功能: 本指令将一个源操作数送到目的操作数中,即OPRD1 堆栈操作指令 PUSH和POP 格式: PUSH OPRD
本汇编指令大全共分为四个部分:数据传输指令、输入输出端口传送指令、目的地址传送指令和标志传送指令。 数据传输指令用于在存贮器和寄存器、寄存器和输入输出端口之间传送数据。常用的数据传输指令包括MOV、MOVSX...
该文档包含了DSP C6000系列芯片的全部汇编指令,涵盖了数据传输、输入输出端口传送、目的地址传送、标志传送、算术运算、逻辑运算等多个方面。 一、数据传输指令 数据传输指令用于在存贮器和寄存器、寄存器和输入...
通用数据传送指令 - **MOV**:用于在寄存器和内存之间传递一个字或字节的数据。 - **MOVSX**:首先进行符号扩展(根据最高位符号填充其余未使用的高位),然后将结果传送到目标寄存器或内存单元。 - **MOVZX**:...
本文将详细介绍 8086 汇编指令的七个部分:数据传送指令、算术运算指令、逻辑运算指令、串操作指令、控制转移指令、处理器控制指令和保护方式指令。以下将对其中的数据传送指令进行详细介绍。 数据传送指令包括通用...
本文将深入探讨汇编中的寄存器和数据传送指令。 **寄存器详解** 1. **通用寄存器**:在x86架构的CPU中,通用寄存器包括8个16/32位寄存器,如AX/EAX、BX/EBX、CX/ECX和DX/EDX等。它们可以被用于临时存储计算过程中...
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汇编指令的速查手册,涵盖了数据传输指令、输入输出端口传送指令、目的地址传送指令、标志传送指令和算术运算指令等多个方面。 数据传输指令: 1. MOV指令:传送字或字节。 2. MOVSX指令:先符号...
1. 通用数据传送指令: MOV 指令把一个字节或字的操作数从源地址 src 传送至目的地址 dest。MOVSX 指令将带符号的数据从源地址传送至目的地址,而 MOVZX 指令将无符号的数据从源地址传送至目的地址。 PUSH 和 POP...
1. **数据传送指令**:这类指令用于在不同位置之间移动数据,如通用数据传送指令、地址传送指令、标志寄存器传送指令、符号扩展指令和扩展传送指令。例如,`MOV`指令是最基本的传送指令,可以将数据从源操作数传送到...
本文对51单片机汇编指令进行了详细的解释,涵盖了指令的格式、汇编、指令类型、数据传递类指令、累加器A与外部数据存储器RAM之间的数据传递类指令、程序存储器向累加器A传送指令等内容。 一、概述 单片机的指令...
本文档提供了 8086 汇编指令的速查手册,涵盖了数据传输指令、输入输出端口传送指令、目的地址传送指令、标志传送指令和算术运算指令等多方面的知识点。 一、数据传输指令 数据传输指令用于在存贮器和寄存器、...
通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,...
这些指令可以分为通用数据传送指令、地址传送指令、标志寄存器传送指令、符号扩展指令、扩展传送指令等。 1. 通用数据传送指令 MOV DEST,SRC 功能:把一个字节、字或双字从源操作数 SRC 传送至目的操作数 DEST。...
这些指令可以分为四大类:数据传输指令、输入输出端口传送指令、目的地址传送指令和标志传送指令。 数据传输指令: * MOV:传送字或字节 * MOVSX:先符号扩展,再传送 * MOVZX:先零扩展,再传送 * PUSH:把字压入...