深入理解计算机系统(3.3)------操作数指示符和数据传送指令

ARM Assembly Language Programming (part 4) 4. The BBC BASIC Assembler There are two main ways of writing ARM assembly language programs. One is to use a dedicated assembler. Such a program takes a text file containing ARM assembly language in 阅读详情

  在上一篇博客 程序编码以及数据格式 中我们给出了一个简单的C程序,然后编译成了汇编代码。大家看不懂没关系,后面的博客我们将逐渐揭开一些汇编指令的神秘面纱。本篇博客我们将对操作数指示符和数据传送指令进行详细的介绍。

1、整数寄存器

  上一篇博客我们讲了在汇编语言中,如下的几个处理器状态是可见的:

  一、程序计数器(在 IA32 中通常称为 PC,用 %eip 表示):指示将要执行的下一条指令在存储器中的地址。

  二、整数寄存器文件:包含8个命名的位置,可以存储一些地址或者整数的数据。有的用来记录某些重要的程序状态,有的则用来保存临时数据。

  三、条件码寄存器:保存最近执行的算数或逻辑指令的状态信息,它们用来实现控制或数据流中的条件变化,比如用来实现 if 和 while 语句。

  四、浮点寄存器:存储浮点数。

  这里我们要讲的就是第三个整数寄存器,在 32 位 CPU 中包含一组 8 个存储 32 位值的寄存器。这些寄存器用来存储整数数据或指针。下图是 IA32 的整数寄存器:

  

  上述八个寄存器主要功能如下:

%eax,可存放一般数据,而且可作为累加器使用;
%ebx,可存放一般数据,而且可用来存放数据的指针(偏移地址);
%ecx,可存放一般数据,而且可用来做计数器,常常将循环次数用它来存放;
%edx,可存放一般数据,而且可用来存放乘法运算产生的部分积,或用来存放输入输出的端口地址(指针);
%esi,可存放一般数据,还可用于串操作中,存放源地址,对一串数据访问;
%edi,可存放一般数据,还可用于串操作中,存放目的地址,对一串数据访问;
%esp,用于寻址一个称为堆栈的存储区,通过它来访问堆栈数据;
%ebp,可存放一般数据,用来存放访问堆栈段的一个数据区,作为基地址;

  在大多数情况下,%eax、%ecx、%edx、%ebx、%esi、%edi等6个寄存器可以看做通用寄存器,对它们的使用没有限制;%esp、%ebp两个寄存器保存着指向程序栈中重要位置的指针,只有根据栈管理的标准惯例才能修改这两个寄存器中的值。

  这8个寄存器都可以作为16位(字)或32位(双字)来访问。字节操作指令可以独立的读或者写%eax、%ecx、%edx、%ebx等4个寄存器的2个低位字节,因为%ax、%cx、%dx、%bx这4个16位寄存器又可分别分成ah,al ;bh,bl;ch,cl;dh,dl的8位寄存器。

  这里大家也只需要有个眼熟就好了,后面我们将对这个8个寄存器进行详细讲解。

2、操作数指示符

  我们知道大多数指令都有一个或多个操作数(operand),指示出执行一个操作中要引用的源数据值,以及放置结果的目标位置。下图是 IA32 支持的多种操作数格式:

  

  上图我们可以看出源数据值可以是常数形式给出,或者是从寄存器或存储器中读出。而结果可以存放在寄存器或存储器中。我们将不同的操作数分为如下三种类型:

  ①、立即数(immediate):书写方式是$符号后跟一个标准C表示的整数,比如$52,$0x1F等等。任何能放进一个32位的字里面的数值都可以做立即数。

  ②、寄存器(register):它表示某个寄存器的内容,可以是8个32位寄存器中的一个(比如%eax),也可以是8个16位寄存器中的一个(比如%ax),还可以是8个单字节寄存器寄存器(比如%al)。上图是用Ea来表示任意寄存器a,用引用 R[Ea]来表示它的值。

  ③、存储器(memory):它会根据计算出来的地址(通常称为有效地址)来访问某个存储器位置。我们将存储器看成一个很大的字节数组,用符号Mb[Addr] 表示对存储在存储器中从地址 Addr 开始的 b 个字节值的引用。上图省略了下方的 b.

   从上图我们知道,第一行是立即数,第二行则是寄存器,剩下的全部是存储器。其中最后一行存储器语法 Imm(Eb,Ei,s),表示的是最常用的形式,分为四个部分,

  一、Imm 是立即偏移数

  二、Eb 是基址寄存器

  三、Ei 是变址寄存器

  四、s 是比例因子,必须是 1、2、4或8

  然后有效地址计算公式为: Imm + R[Eb]+R[Ei]*s。比如对于2(%esp,%eax,4)这个操作数来讲,它代表的是内存地址为2+%esp+4*%eax的存储器区域的值。

3、数据传送指令

  数据传送指令:将数据从一个位置复制到另一个位置的指令。简单来说就是复制指令。

  将源操作数的值复制到目的操作数中并覆盖。源操作数指定的值是一个立即数,存储在寄存器或存储器中。目的操作数指定一个位置,要么是一个寄存器,要么是一个存储器地址。在 IA32 中还有一条限制,传送指令的两个操作数不能都执行存储器位置。

  将一个值从一个存储器位置复制到另一个存储器位置需要两条指令:(就和宋丹丹把大象送进冰箱的步骤一样)

  ①、第一条指令将源值加载到寄存器中

  ②、第二条指令将该寄存器值写入到目的位置。

  下图是许多不同的指令类:

  

 4、MOV 指令

  MOV 类由三条指令组成:movb,movw和 movl。指令格式为 [movx S D],表示将源操作数S中的数据复制到目的操作数D中。三种指令的区别是它们分别是在大小为 1,2和4个字节的数据上进行操作。

  这里举一个简单的例子,比如我们有一条指令为movl %edx %eax。那么它的执行过程就如下图所示。

  

  上图引用至:深入理解计算机系统(3.3)---数据传送(或者说复制)指令详解 - 左潇龙 - 博客园

  在指令执行之后,%edx寄存器当中的内容会被复制到%eax寄存器。数据格式则为四个字节,也就是双字。我们还可以使用movb和movw去复制一个字节或者两个字节。

5、MOVS指令  

  MOVS指令格式为 [movsxy S D],其中x、y为数据格式,S为源操作数,D为目的操作数。x、y的组合有三种,分别是bw,bl,wl,分别表示字节(8位)传送到字(16位),字节(16位)传送到双字(32位),字(16位)传送到双字(32位)。

  将较小的源数据复制到一个较大的数据位置。高位用符号位扩展,即目的位置的所有高位用源值的最高位数值进行填充。

  比如对于指令movswl %dx %eax来讲,它的作用如下图所示。

  

  上图引用至:深入理解计算机系统(3.3)---数据传送(或者说复制)指令详解 - 左潇龙 - 博客园

  这里使用了十六进制的整数表示方式。可以看到,movs指令将0x8FFF扩展以后存入%eax寄存器,其中%dx为寄存器%edx的后16位表示。

6、MOVZ 指令

  MOVZ 指令和上面的MOVS 指令十分相似。指令格式为 [movzxy S D],其中x、y为数据格式,S为源操作数,D为目的操作数。x、y的组合有三种,分别是bw,bl,wl,分别表示字节(8位)传送到字(16位),字节(16位)传送到双字(32位),字(16位)传送到双字(32位)。

  将较小的源数据复制到一个较大的数据位置。高位用0扩展,即目的位置的所有高位用0进行填充。

  比如对于指令movzwl %dx %eax来讲,它的作用如下图所示。

  

  上图引用至:深入理解计算机系统(3.3)---数据传送(或者说复制)指令详解 - 左潇龙 - 博客园

  扩展后,目标寄存器%eax的前16位为0而不再是1。

7、push 和 pop 指令

  我们知道 栈 是一个数据结构,可以添加或删除值,遵循“后进先出”的原则。

  push:把数据压入栈中,添加数据。

  pop:把数据移出栈,删除数据。注意移出的值总是最近被压入而仍然在栈中的值。

  栈可以实现为一个数组,总是从数组的一端插入或删除元素。而这一端称为栈顶,在 IA32 中,程序栈存放在存储器某个区域,如下图所示:

  

  注意由于操作数字节的不同,pushl 是将双字(32位)压入栈中;popl 是移出双字。

  将一个双字值压入栈中,首先要将栈指针减4,然后将值写到新的栈顶地址。因此指令 pushl %ebp 等价于下面两条指令:

  subl  $4,%esp

  movl %ebp,(%esp)

  上图所示,当 %esp 为0x108,%eax为0x123时,执行指令 pushl %ebp 的效果。首先 %esp 会减4,得到0x104,然后会将 0x123 存放到存储器地址 0x104处。

  将一个双字值从栈顶移出,首先要从栈顶位置读出数据,然后将栈指针加4。因此指令 popl %eax 等价于下面两条指令:

  movl (%esp),%eax

  addl $4,%esp

  上图所示,先从存储器中读取值 0x123,再写到寄存器 %edx中,然后寄存器%esp的值将增加回到0x108。

  注意值0x123仍然会保存在存储器0x104中,直到被覆盖(比如被另一条入栈操作覆盖)。无论如何,%esp 指向的地址总是栈顶,任何存储在栈顶之外的数据都认为是无效的。

8、总结

  本章主要介绍了操作数指示符,需要我们理解几种表达式的计算方法。接着介绍了几种数据传送指令,包括MOV,MOVS,MOVZ,PUSH和POP等,总体上来看不难理解,我们在了解这些指令后,再回头看那些汇编代码,应该会理解很多了。下一篇博客我们将进一步介绍汇编指令——算术和逻辑操作。

  

深入理解计算机系统(第三版)读书笔记一(寄存器、操作数、MOV、出入栈、算数、逻辑指令) 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma... 阅读详情

相关推荐

深入理解计算机系统 笔记(二)

第三章 程序的机器级表示

Eremita的博客 4294

X86 MOVSB MOVSW MOVSD MOVSQ 指令详解

SDM指令功能描述(MOVS/MOVSB/MOVSW/MOVSD/MOVSQ) MOVS/MOVSB/MOVSW/MOVSD/MOVSQ)总体描述: 从DS:SI(16-bit)/DS:ESI(32-bit)/RSI(64-bit)指示的地址中复制一个byte/word/dword/qword到ES:DI(16-bit)/ES:EDI(32-bit)/RDI(64-bit)指示的地址中。 (R

ross1206的博客 1万+

深入理解计算机系统[习题]_第三章_程序的机器级表示

深入,并且广泛 -沉默犀牛 之前整理了第二张的习题,没想到访问量挺高的,看来还是有人需要习题和答案的,以后每看完一章书,就会对应的整理出那一章的习题。 如果看完答案觉得不同,请看我的“深入理解计算机系统_第一部分_第三章_程序的机器级表示” 其中对这一章都进行了详细的介绍 1.熟悉操作数的类型 2.这个练习题要看上面的各个寄存器的字节数 [看答案介绍内存引用总是用四字长寄存器给...

感谢您来到姜立明的技术探索空间 2615

Assembly Tutorial

Assembly Tutorial  GameDev.net <!--var browName = navigator.appName;var SiteID = 1;var browDateTime =

amd k_7的专栏 9270

深入理解计算机系统(3.3)---数据传送(或者说复制)指令详解

引言     上一章我们已经介绍了汇编语言的基础部分,包括数据格式、寄存器以及操作数的标识方式,接下来我们就应该去认识一下汇编语言当中的各个指令了。这些指令大多数都非常简单,但是组合在一起却能模拟出我们程序当中想要的任何效果,确实是十分神奇的一件事。    数据传送指令     数据传送指令的目的是为了将一个数据从一个位置复制到另外一个位置。既然如此,那么数据传送指令就会包含一个源操作

Java's paradise 875

Run-Time Check Failure #2

我自己找的问题是sprintf函数,类型和长度都不能错,否则就会报错,报错还不是立马报错,如果类型和长度弄错,内存会异常,后面的代码执行才会内存泄露。char str3[80]; sprintf(str3, "%d%s got_picture:%d decode_error_num %d", cam_no, " Decode Error", got_picture, decode_error...

jacke121的专栏 9716

系统处理 IRQ_EINT0 IRQ_EINT11 的过程

系统处理 IRQ_EINT0 IRQ_EINT11 的过程 主要分析系统处理 IRQ_EINT0 IRQ_EINT11 的过程。   2440处理器的中断组织成两层:主中断 和 次中断,一共可以处理60个中断源。   主中断 和 次中断 经过中断构架的抽象之后,编写驱动程序时,我们不用考虑这两层中断,直接使用 request_irq 注册 60个中断源的某个,就可以直接使用中断了。

newnewman 8001

别再傻傻分不清!5分钟搞懂倾斜摄影里‘地面分辨率’和‘模型精度’到底啥关系

本文深入解析倾斜摄影中‘地面分辨率’与‘模型精度’的关系,帮助读者快速理解两者的本质区别与内在关联。通过实战案例和公式计算,详细说明如何从航飞设计到精度验证全流程控制,避免常见认知误区,并针对不同应用场景提供精度需求建议。

weixin_33700350的博客 477

理解计算机系统_程序的机器级表示(二):寄存器,操作数,数据传送,程序栈

以(以下称“本书”)内容为基础,对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定。

jllws1的博客 1205

从零到一:如何用YOLOv8和PyQt5打造你的第一个花卉识别桌面应用

本文详细介绍了如何使用YOLOv8和PyQt5从零开始构建一个花卉识别桌面应用。涵盖环境搭建、数据准备、模型训练、界面设计、模型集成与性能优化等全流程,帮助开发者快速掌握深度学习目标识别技术的实际应用。

weixin_29048775的博客 454

MobilenetV1、V2、V3系列详解

Mobilenet系列模型作为当前主流的端侧轻量级模型被广泛应用,很多算法都会使用其作为backbone提取特征,这一章对Mobilenet系列模型V1,V2,V3做一个总结。

turned的博客 1万+

深入理解计算机系统chapter3.3操作指示符和数据传送指令

目录 1、整数寄存器 2、操作数指示符 3、数据传送指令 4、MOV 指令 5、MOVS指令   6、MOVZ 指令 7、push 和 pop 指令 在上一篇博客程序编码以及数据格式中我们给出了一个简单的C程序,然后编译成了汇编代码。大家看不懂没关系,后面的博客我们将逐渐揭开一些汇编指令的神秘面纱。本篇博客我们将对操作数指示符和数据传送指令进行详细的介绍。 ...

JQ210245253的博客 1417

一文详解AUTOSAR COM ComSignal结构体

ComSignalLength指定信号的长度,以字节为单位,影响数据的解析范围和精度。比如车速信号若为UINT16类型,ComSignalLength=16。这里需要注意必须ComSignalLength与ComSignalType匹配(比如FLOAT32类型需配置ComSignalLength=32),超出实际物理值范围时需配置缩放(Scaling)参数。ComSignalType定义信号的物理数据类型,决定如何解析原始字节数据。

menghuyouyou的博客 942

深入理解计算机系统 第3章 程序的机器级表示

目录   第3章 程序的机器级表示 数据格式 操作数指示符 练习题 数据传送指令 习题3.4 访问信息 压入和弹出栈数据 算数和逻辑操作 移位操作 讨论 特殊的算数操作 问题 第3章 程序的机器级表示 数据格式 操作数指示符 操作数的三种类型: 立即数(immediate) 在ATT格式的汇编代码中,立即数的书写方式是‘$’后面跟一个用标准C表示法表示的整数,...

isanth 2086

DRAM知识整理系列(三):部分时序参数整理

一、tCL-tRCD-tRP-tRAS(第一时序) 内存是根据行和列寻址的,当请求触发后,最初是tRAS(Active to precharge Delay),预充电后,内存才真正开始初始化RAS(Row Address Strobe)。一旦tRAS激活后,RAS开始进行需要数据的寻址。首先是行地址,然后初始化tRCD(RAS to CAS Delay),周期结束,接着通过CAS(Column Address Strobe)访问所需数据的十六进制地址。其中,从CAS开始到CAS结束,就是CAS延迟(即t

不吃鱼的猫的博客 7万+

业态即战场:零售平台的生意模型与系统设计解构

在这篇文章中,我们从“控货、自营、联营”三种典型零售业态出发,拆解了亚马逊、阿里、京东和本地闪购平台在商品模型设计上的差异与博弈。看似简单的卖货方式背后,其实是平台在“控货权”“商品归属权”上的深层策略博弈:谁掌控商品,谁就掌控数据、流量与利润分配权。本文尝试用一套通俗但不失专业的方式,帮助产品经理和技术伙伴读懂零售平台商品模型的底层逻辑与系统设计演化路径。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 13万+

深入理解计算机系统03——程序的机器级表示

本篇博客主要介绍深入计算机系统书目第三章程序的机器级表示的相关知识。

转载请标明出处,完整项目/代码详见github:https://github.com/yiru1225 4984

RICHARDSON-LUCY 去卷积简介

Lucy去卷积1.泊松过程及联合概率分布2.极大似然估计参考文献 1.泊松过程及联合概率分布 首先假设相机接收光子生成图像的过程符合泊松分布。 因此,一次曝光过程中,某像素位置接收到iii个光子的概率p(i)p(i)p(i)为: p(i)=exp⁡(−λ)⋅λii!\qquad\qquad p(i)=\exp(-\lambda)\cdot\cfrac{\lambda^{i}}{i!}p(i)=exp(−λ)⋅i!λi​ 那么针对一张M∗NM*NM∗N的图像,所有像素的联合概率分布可以描述为: P(I)=∏e

驽马十驾,功在不舍;锲而不舍,金石可镂。 8694

2.数据传送指令

CSAPP重点解读九曲阑干2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频《深入理解计算机系统(CSAPP)》全书学习笔记(详细)操作 源操作数 目的操作数数据传送指令压栈入栈指令,%rsp栈顶指针存放的寄存器算数逻辑操作:一元操作二元操作逻辑操作移位操作特殊操作有道云笔记。

qq_43067403的博客 1314

在 ABAP Cloud 中玩转 CL_ABAP_PARALLEL 并行处理:从原理到实战

ABAP并行处理框架CL_ABAP_PARALLEL解析 本文系统介绍了SAP ABAP环境中实现并行处理的CL_ABAP_PARALLEL框架。该框架通过封装异步RFC和对话进程,为开发者提供了面向对象的API,显著提升大批量数据处理的效率。 文章首先分析了ABAP环境需要并行处理的原因:传统的串行处理在面对百万级数据时效率低下。然后详细介绍了CL_ABAP_PARALLEL的设计思路,它是一个"小型线程池"式的同步并行框架,适用于批量计算场景。此外,文章重点讲解了控制并行任务的关键参

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 339

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

深入理解计算机系统 3.4 LINUX汇编指令

1、数据传送指令 2、压入和弹出栈数据 3、算数和逻辑操作   (1)加载有效地址   (2)一元操作和二元操作   (3)移位操作   (4)特殊的算数操作 4、控制   (1)跳转指令   (2)用条件控制来实现条件分支   (3)用条件传送来实现条件分支

逆的博客 1449

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

深入理解计算机系统第三章

3.3 数据格式 因为是从16位扩展成32位的,所以命名时将16位的类型作为基准,成为word。 字节数 汇编代码后缀 1 b 2 w 4 l 8 q 3.4 访问信息 2条小规则: 生成1字节和2字节高位不变,生成4字节高位置0。 %rsp作为栈指针指明运行时栈结束的位置。 3.4.1 操作数指示符 指令的源数据值可以是常数,或者存储在寄存器和内存中,结果可以存储在寄存器和内存中。 操作数的三种类型: $+十六进制数字:表示立即数 R[ra]R[r_a]R[ra​

m0_51531927的博客 1123

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深入理解计算机系统-第三章-程序的机器级表示-3.4

上一篇博客我们讲了在汇编语言中,如下的几个处理器状态是可见的: 一、程序计数器(在 IA32 中通常称为 PC,用 %eip 表示):指示将要执行的下一条指令在存储器中的地址。 二、整数寄存器文件:包含8个命名的位置,可以存储一些地址或者整数的数据。有的用来记录某些重要的程序状态,有的则用来保存临时数据。 三、条件码寄存器:保存最近执行的算数或逻辑指令的状态信息,它们用来实现控制或数据流中的条件变...

weixin_42082138的博客 865
上一篇: 深入理解计算机系统(3.2)------程序编码以及数据格式
下一篇: 深入理解计算机系统(3.4)------算术和逻辑操作
程序员可乐、
程序员可乐、 新星创作者: Java技术领域 新星创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄12年 8824粉丝 296原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员可乐、

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值