zoukankan      html  css  js  c++  java
  • 数据格式,訪问信息以及操作数指示符

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

    前言

    说好的今天去学车,穿上衣服又脱了,谁到了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个字节来表示.

    上图的试图使用的方式非常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)是存储器取值的一般形式,比方当Imm0,则是倒数另外一种取值方式.对于其它的形式,也能够使用相同的方式推算出来.

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

    操作数是大部分都有的,因此上面的这些标示方式,在之后的解说过程中会经常使用到,假设到时候出现不明确的地方能够返回来再看看.

    小小的结一下

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

  • 相关阅读:
    CocoaPods常用的命令行以及安装方法
    成长轨迹51 【ACM算法之路 百炼poj.grids.cn】【字符串处理】【2744:子串】
    成长轨迹52 【ACM算法之路 百炼poj.grids.cn】【字符串处理】【2743:字符串判等】
    成长轨迹56 【ACM算法之路 百炼poj.grids.cn】【枚举】【2811:熄灯问题】
    嵌入式成长轨迹1 【嵌入式环境及基础】【嵌入式Linux软件开发入门】【linux基础命令】
    成长轨迹54 【ACM算法之路 百炼poj.grids.cn】【枚举】【2739:计算对数】
    嵌入式展望与学习路线
    嵌入式成长轨迹2【嵌入式环境及基础】【嵌入式Linux软件开发入门】【Shell脚本基础】
    成长轨迹53 【ACM算法之路 百炼poj.grids.cn】【枚举】【2747、2810、2692、2977】
    嵌入式学习轨迹
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6978572.html
Copyright © 2011-2022 走看看