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

来源:互联网 发布:网络视频编码器作用 编辑:程序博客网 时间:2024/05/21 10:30

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

前言

说好的今天去学车,穿上衣服又脱了,谁到了11.哈哈,没啥吊事就接着干呗.本次讲的内容可以成为汇编的基础,因为汇编预言大部分时候在操作一些我们平时看不到的东西,因此本文想告诉大家汇编语言都是在操作什么玩意.或者更准确的说,各种汇编指令都是在操作什么样的对象.

 

汇编层次的对象

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

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

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

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

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

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

 

 

数据的格式

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

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

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

 

 

 

图中已经手的很明白了,需要提醒一点的是,long long intIA32架构中是不支持这种数据格式的,因此也就没有理出他们的后缀.另外,long double 是一种扩展类型,通常采用了12个字节来表示.

 

上图的试图使用的方式很简单,比如mov指令,他是一个数据传送的指令,那么movb就代表传送一个字节的数据,movw就代表传送两个字节的数据,movl就代表传送搜个字节的数据.

 

 

 

寄存器

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

 

 

(这个图示是书中的一张寄存器图示,基于IA32架构给出)

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

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

除了以上的区别之外,对于%eax,%ecx,%edx%ebc,%esi,%edi来说,他们的使用惯例也有些许不同,这个在后面我们将深入探讨.

 

 

操作数指示符

操作数指示符这个称谓是书上给的,其实说白了就是一种取值的标识方式,用来获取参与各种操作的操作数.

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

对于这三种操作数的标识方式,有个图:

 

 

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

由于存储器相对来说,理解起来较困难,举个例子,比如对于4(%esp,%eax,4)这个操作数来说,他代表的是内存地址为4+%esp+4*%eax的存储器区域的值.

 

操作数是大部分都有的,因此上面的这些标示方式,在之后的讲解过程中会常用到,如果到时候出现不明白的地方可以返回来再看看.

 

小小的结一下

可能看了这篇文中之后,单价还是像我一样一知半解,但是没关系,不积跬步无以至千里,慢慢来,随着慢慢的学习,你就慢慢地明白了.

 

0 0
原创粉丝点击