数据格式,訪问信息以及操作数指示符
前言
说好的今天去学车,穿上衣服又脱了,谁到了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 int在IA32架构中是不支持这样的数据格式的,因此也就没有理出他们的后缀.另外,long double 是一种扩展类型,通常採用了12个字节来表示.
上图的试图使用的方式非常easy,比方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)是存储器取值的一般形式,比方当Imm为0时,则是倒数另外一种取值方式.对于其它的形式,也能够使用相同的方式推算出来.
因为存储器相对来说,理解起来较困难,举个样例,比方对于4(%esp,%eax,4)这个操作数来说,他代表的是内存地址为4+%esp+4*%eax的存储器区域的值.
操作数是大部分都有的,因此上面的这些标示方式,在之后的解说过程中会经常使用到,假设到时候出现不明确的地方能够返回来再看看.
小小的结一下
可能看了这篇文中之后,单位价格还是像我一样一知半解,可是没关系,不积跬步无以至千里,慢慢来,随着慢慢的学习,你就慢慢地明确了.