深入理解计算机系统(3.2)---数据格式、访问信息以及操作数指示符

本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer14.html

引言

  本文的内容其实可以成为汇编语言的基础,因为汇编语言大部分时候是在操作一些我们平时开发看不到的东西,因此本文的目的就是搞清楚,汇编语言都是在操作些什么东西。或者更准确的说,各种汇编指令都是在操作什么样的对象。

汇编层次的对象

  在平时的开发过程中,CPU处理器的状态对开发者是隐藏的,我们看不到CPU当中各个对象的状态。但是在汇编语言中,我们可以清楚的看到这些对象的状态,其中CPU主要包含以下几个对象。

  程序计数器(PC):记录下一条指令的地址。

  整数寄存器文件:共8个,可以存储一些地址或者整数的数据。

  条件寄存器:保存算数或逻辑指令的状态信息,可以实现程序的流程控制。

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

  可以看出,这些都是CPU处理器当中的对象,上一章我们写过一个简单的C程序,相信如果不是看了汇编代码,各位也都看不出来在程序运行过程中,CPU当中这些对象都在做着一些什么样的操作,又在存储着一些什么样的内容。

数据的格式

  在上一章当中,几乎所有的汇编指令后面都有一个字母l,比如movl、addl、subl、pushl等等,这个l的后缀其实就是表示的数据格式,表示我们操作的是32位的数值。

  在计算机从16位扩展到32位,以至于当前的64位来讲,数据格式就一直在变。但是历史总会多少影响着未来的走向,因此我们习惯称16位为“字”,而32位则为“双字”,相应的,64位则为“四字”。

  以下我们以IA32架构为例,来看一下各个数据格式对应的后缀是什么。

  图当中已经介绍的比较清楚,LZ这里就不再废话了。需要一提的就是,long long int在IA32架构中是不支持这种数据格式的,因此就没有列出它的后缀。另外,long double是一种扩展类型,通常采用12个字节来表示。

  上面的图示使用的方式很简单,比如mov指令,它是一个数据传送的指令,那么movb就代表传送一个字节的数据,movw就代表传送两个字节的数据,而movl就代表传送四个字节的数据。

寄存器

  寄存器是CPU当中非常重要的对象,一般情况下,很多临时变量都会存储在这里,就像上一章当中的临时变量t,在优化之后,t将不再进入主存,而只留在寄存器当中。这样可以提高程序运行的速度,因为寄存器的速度要高于主存,而且在寄存器与主存之间传输数据,也是十分耗时间的一件事。

  下面是一张书中的寄存器图示,它基于IA32架构给出。

  可以看到,对于%esp和%ebp寄存器来讲,图中标注了它们分别是栈指针以及帧指针。而对于另外六个寄存器来讲,它们大部分时候是一样的,但是还是有些许的不同。

  比如%eax寄存器,它很多时候用来存储函数的返回值。而对于%eax、%ecx、%edx、%ebx来讲,它们都可以被访问单独的字节。另外需要一提的是,这八个寄存器都可以被访问双字节。

  除了以上的区别之外,对于%eax、%ecx、%edx和%ebx、%esi、%edi来讲,它们的使用惯例也有些许不同,这个在后面我们将深入讨论。这里各位只要大概认识一下这八位神仙就行了。

操作数指示符

  操作数指示符这个称谓是书上给的,但LZ觉得这个概念不太容易理解,操作数指示符其实指的就是一种取值的标识方式,用来获取参与各种操作的操作数。

  这些标识方式一共有三种,一种是$符号后跟一个标准C表示的整数,比如$100,$0x11等等。第二种则是寄存器,当它作为一个操作数的时候,则是取的寄存器当中的数值。另外,对于寄存器来说,也可以选择性的操作4个、2个、1个字节,而并不一定非要操作4个字节。最后一种,则是我们相对来说最熟悉的,就是存储器或者说内存。当它作为一个操作数的时候,会去计算存储器地址的数值,然后去这个地址取相应的数值。

  对于这三种操作数的标识方式,在书中给出了一个表格,这里LZ贴一下。

  第一列是代表的类型,而第一行则是指的立即数,第二行则是指的寄存器,而剩下的都是存储器了。对于立即数和寄存器来讲,比较好理解,就是直接取值或者取寄存器的值。而对于存储器来讲,则有很多种情况,不过我们也可以看出,上面所有的情况,其实都是最后一种的特殊情况。Imm(Eb,Ei,s)是存储器取值的一般形式,比如当Imm为0时,则是倒数第二种取值方式。对于其它的形式,也可以使用同样的方式推算出来。

  由于存储器相对来说,理解起来比较困难一点。因此这里LZ举个简单的例子,比如对于4(%esp,%eax,4)这个操作数来讲,它代表的是内存地址为4+%esp+4*%eax的存储器区域的值。

  操作数是大部分指令都有的,因此上面的这些标识方式,在之后的文章中我们会经常看到,它们将会成为各位猿友很好的朋友。

文章小结

  本章只介绍了一些汇编当中基础的知识,这些内容相对来讲不是特别困难,但却是打开后面神秘大门的钥匙。因此倘若有哪位猿友不是太理解本章的内容的话,LZ希望各位可以从实践入手去理解一下本章的内容。这一点可以结合上一章来看,从上一章给出的汇编代码中寻找数据格式、操作数以及寄存器的部分,这应该是十分轻松的,因为上一章的汇编代码中充斥着这三个部分的内容。

时间: 2024-10-09 03:19:33

深入理解计算机系统(3.2)---数据格式、访问信息以及操作数指示符的相关文章

数据格式,訪问信息以及操作数指示符

数据格式,訪问信息以及操作数指示符 前言 说好的今天去学车,穿上衣服又脱了,谁到了11点.哈哈,没啥吊事就接着干呗.本次讲的内容能够成为汇编的基础,由于汇编预言大部分时候在操作一些我们平时看不到的东西,因此本文想告诉大家汇编语言都是在操作什么玩意.或者更准确的说,各种汇编指令都是在操作什么样的对象. 汇编层次的对象 在平时开发的过程中,CPU处理器的状态对开发人员是隐藏的,我们看不到CPU其中各个对象的状态.可是在汇编语言中,我们能够清楚的看到这些对象的状态,其中CPU主要包含下面几个对象. 程

深入理解计算机系统(2.1)---信息的存储与值的计算

本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer5.html 引言 我们很难想象,1和0这两个再简单不过的数字,给计算机科学带来了彻底的改变.对于无法与人脑相比的计算机来说,简单的1和0就是最适合它们的数字.不过1个1或者1个0往往代表不了任何意义,它们必须被赋予上下文,才能有具体的含义.比如,如果我们知道1和0是代表的布尔类型的值,那么我们就知道1是true,0是false. 对于二进制所表示的数字来说,主要有三种,即无符号.补码以及浮点

《深入理解计算机系统》3.3数据格式,3.4访问信息

数据格式 字 Intel使用"字"(word)来表示16位数据类型 32位数据类型则为双字(double words) 64位数据类型则为四字(quad words) 汇编指令中有很多指令后带一个自负后缀代表操作数的大小 比如数传送指令: movb(传送字节) movw(传送字) movl(传送双字) 注意 浮点类型的后缀也是l,但是浮点数的运行有另外的寄存器,不会产生歧义 比如 movl  整数运算寄存器,整数运算寄存器 movl  浮点运算寄存器,浮点运算寄存器 访问信息 8个整数

《深入理解计算机系统(第三版)》第二章 信息的表示和处理

<深入理解计算机系统(第三版)>第二章 信息的表示和处理 ??计算机本身是由处理器和存储器子通过系统组成.在核心部分,我们需要方法来表示基本数据类型,比如整数和实数运算的近似值.然后,我们考虑机器级指令如何操作这样的数据,以及编译器又如何将C程序翻译成这样的指令.接下来,研究几种实现处理器的方法,帮助我们更好的了解硬件资源如何被用来执行指令.理解了编译器和机器级代码,我们就能了解如何通过编写C程序以及编译它们来最大化程序的性能.本章主要使我了解了如何表示和执行应用程序,通过一些技巧,来写出安全

《深入理解计算机系统(原书第三版)》pdf

下载地址:网盘下载 内容简介  · · · · · · 和第2版相比,本版内容上*大的变化是,从以IA32和x86-64为基础转变为完全以x86-64为基础.主要更新如下: 基于x86-64,大量地重写代码,首次介绍对处理浮点数据的程序的机器级支持. 处理器体系结构修改为支持64位字和操作的设计. 引入更多的功能单元和更复杂的控制逻辑,使基于程序数据流表示的程序性能模型预测更加可靠. 扩充关于用GOT和PLT创建与位置无关代码的讨论,描述了更加强大的链接技术(比如库打桩). 增加了对信号处理程序

深入理解计算机系统(第二版)----之三:程序的机器级表示

计算机执行机器代码,用字节编码低级的操作,包括处理数据.管理存储器.读写存储设备上的数据,利用网络通信,编译器基于变成语言的原则, 目标机器的指令集合操作系统遵循的原则,经过一系列阶段产生机器代码,gcc c语言编辑器以汇编代码的形式输出,汇编代码是机器代码的文本表示,给出程序的每一条指令.然后gcc调用汇编器和链接器,根据汇编代码生成可执行的机器代码. 本章,近距离观察机器代码和汇编代码. 机器级的实现,被高级语言屏蔽了,用高级语言编写的程序可以在很多不同的机器上编译和执行,而汇编代码则是与特

《深入理解计算机系统(原书第2版)》pdf

下载地址:网盘下载 内容简介  · · · · · · 本书从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性.性能和实用性.全书共12章,主要内容包括信息的表示和处理.程序的机器级表示.处理器体系结构.优化程序性能.存储器层次结构.链接.异常控制流.虚拟存储器.系统级I/O.网络编程.并发编程等.书中提供大量的例子和练习,并给出部分答案,有助于读者加深对正文所述概念和知识的理解. 本书的最大优点是为程序员描述计算机系统的实现细节,帮助其在大脑中构造一个

《深入理解计算机系统(第三版)》第三章

3.1 程序编码 1.计算机系统使用了多种不同形式的抽象,对于机器级编程来说,两种抽象尤为重要: 指令集体系结构(ISA):定义了处理器状态.指令的格式,以及每条指令对状态的影响 机器级程序使用的存储器地址是虚拟地址:提供的存储器模型看上去是一个非常大的字节数组 2.反汇编器使用的指令命名规则与GCC生成的汇编代码使用的有区别.反汇编省略了指令结尾的q,给call和ret指令添加了q后缀. 3.可执行程序反汇编和对.c反汇编产生的代码有差别.对于可执行文件的反汇编,链接器将代码的地址移到了一段不

深入理解计算机系统(中文版第二版)

下载地址:网盘下载 内容简介  · · · · · · 从程序员的视角,看计算机系统! 本书适用于那些想要写出更快.更可靠程序的程序员.通过掌握程序是如何映射到系统上,以及程序是如何执行的,读者能够更好的理解程序的行为为什么是这样的,以及效率低下是如何造成的.粗略来看,计算机系统包括处理器和存储器硬件.编译器.操作系统和网络互连环境.而通过程序员的视角,读者可以清晰地明白学习计算机系统的内部工作原理会对他们今后作为计算机科学研究者和工程师的工作有进一步的帮助.它还有助于为进一步学习计算机体系结构