[Intel汇编-MASM]程序中可用的寄存器

来源:互联网 发布:淘宝卖家后台登录 编辑:程序博客网 时间:2024/04/29 22:26

1. (最常用的)通用寄存器:

    1) 最早CPU寄存器个数只有4~8个,发展到现在,CPU寄存器个数已经有几十个了,即使这样,CPU寄存器资源仍然相当宝贵,一定要合理运用;

    2) 先对几个大写英文字母做一些说明:

            E:Extended,即扩展的意思,在这里表示从16位扩展成32位,表示寄存器容量的升级;

            X:即Register的意思,仅仅指寄存器;

            A:Accumulator,即累加的意思;

            B:Base,即基址的意思;

            C:Counter,即计数器的意思;

            D:Data,即数据的意思;

            H:High,即高位;

            L:Low,即低位;

            到此为止:

            AH即16位累加器中的高8位,AL即16位累加器中的低8位,AX即16位的累加器,EAX即从16位累加器扩展而成的32位累加器,其中16位位于32位中的低位;

            BH即高8位基址,BL即低8位基址,BX即16位基址,EBX即扩展后的32位基址;

            CH即高8位计数器,CL即低8位计数器,CX即16位计数器,ECX即扩展后的32位计数器;

            DH即高8位数据寄存器,DL即低8位数据寄存器,DX即16位数据寄存器,EDX即扩展后的32位数据寄存器;


            S:Stack,即栈;

            B:Base,即基址;

            P:Pointer,即指针;

            到此为止:

            SP即Stack Pointer,堆栈指针,16位,不分高位和低位,ESP即扩展成32位的堆栈指针;

            BP即Base Pointer,基址指针,16位,部分高位和低位,EBP即扩展成32位的基址指针; 


            D:Destination,即目标;

            S:Source,即源头;

            I:Index,即索引、下标的意思;

            到此为止:

            DI即Destination Index,目标索引,这里翻译成目标变址,其本质就是数组中相应下标的元素所对应的内存地址,EDI即扩展成32位的目标变址;

            SI即Source Index,源索引,这里翻译成源变址,本质和DI相同,ESI即扩展成32位的源变址;

            !!这里涉及到汇编语言中的特殊操作,即将一个数组复制到另一个数组,而在复制时需要将源数组相应下标的元素复制到目标数组相应下标元素,因此在寻址时就需要用到DI和SI;

    3). 最常用的8大通用寄存器:

!之所以为通用是因为这些寄存器可以由程序员随意访问,没有限制,并且可以存取任意数据(对数据的来源等没有限制),但相比之下一些专用寄存器(比如CS、IP等就不能随意用MOV等指令访问,并且这些专用寄存器有明确的含义和是用规则)!

             累加寄存器,32位EAX,低16位AX,AX中高8位AH,低8位AL,同理           

             基址寄存器,32-EAX,16-BX,8-BH、BL             

             计数寄存器,32-ECX,16-CX,8-CH、CL

             数据寄存器,32-EDX,16-DX,8-DH、DL

             堆栈指针寄存器,32-ESP,16-SP,无8位寄存器

             基址指针寄存器,32-EBP,16-BP,无8位寄存器

             目标变址寄存器,32-EDI,16-DI,无8位寄存器

             源变址寄存器,32-ESI,16-SI,无8位寄存器

             注:8086、8088、80286为16位结构(不包含上述高16位),而80386、80486、Pentium系列都是32位的;

                    !我们所说的80x86是一个系列的,中间的x可以代表系列中任意一个数字,比如当x等于2时就是指80286;

                    各寄存器的功能从名称中就可以大致了解,在以后运用中会加深理解;


2. 对程序分段:

    1) 当运行程序的时候需要将程序先装入内存,而在程序的内存空间中可以对程序进行分段,一般段与段之间的概念是松散的,即分段是根据人的意愿进行的,通常情况下是在逻辑上对程序分为代码段、数据段等部分,代码段一般用于存放程序的指令,并且是只读的(如果在程序运行阶段指令也可以修改则程序会乱套),而程序操作的数据则是可以修改的,因此数据段是可读可写的;

    2) 分段的方法:和C语言数组很像,要有一个基址(即该段的首地址),同时要有一个偏移指针,用于定位段中的某个字节处,就好比数组的随机访问(arr[15],arr就好比段基(即基址),而15就是那个具体的偏移量);

    3) 分段访问的实际实现方式:物理地址  =  段地址(基地址)×  10H(即左移4位)+  偏移地址

!左移是为了“扩容”:

       因为一开始CPU的长度有限(即寄存器的长度只有16位),对内存寻址的时候(寻址就是用CPU寄存器中的值指定内存单元中某个字节的位置)就只能寻址(2^16字节,CPU中的每一种值对应内存中一个字节的位置)64KB的空间,但通常内存很大,往往超过1MB,因此CPU能力不足,如果单单靠CPU来寻址则内存中会有很大一部分空间浪费,因此就采用对段基进行移位的方式来扩容;

       这样的话就只需要加一个20位的PC(Program Counter,即一个专门用于指向下一条指令的内存访问指针)寄存器来保存通过以上公式获得的地址就可以访问比CPU访问空间大的内存空间了!

    4) 因此可以将起始地址(即段地址)是10H倍数的一段连续的空间都可以看做一个段(但是段的长度不得超过64KB,因为偏移地址还是用一个16位的寄存器存储的),至于段的实际内容(即实际意义,诸如静态全局变量段之类的)完全由程序员自己定义;

    5) 对物理地址的描述方式:

        符号描述:段地址:偏移地址,比如2000:1F60

        文字描述:2000内存段的1F60单元,即实际物理地址为21F60

    6) 产生并传送20位物理地址的示意图:

    

             


          

3. 专用寄存器——段寄存器和指令指针寄存器:

    1) 段寄存器就是专门存放段地址(即段基)的寄存器,其后缀为S(Segment,段)的缩写;

    2) 将一个段地址存入一个段寄存器的过程就定义了一个段,准确地说是定义了一个段的起始;

    3) 段寄存器一共有四个:CS(Code Segment,代码段寄存器)、DS(Data Segment,数据段寄存器)、SS(Stack Segment,栈段寄存器)、ES(Extra Segment,附加段寄存器),这些寄存器都用于存放段基地址;

    4) 段寄存器的访问限制:段寄存器就不像通用寄存器那样可以非常随意的访问,比如CS:IP这两个寄存器共同决定下一条指令在内存中存放的位置,这就非常厉害了!对程序来说至关重要,如果知错了程序就会崩溃,因此对于这样的寄存器就不能直接使用MOV等指令随意的修改,其修改就需要很多规则限定,这些规则之后会具体解释;

并且,这些寄存器都具有非常明确的含义,即表示的是代码段还是数据段可以从名字一眼就看出,并且实际使用的时候也是严格按着这个含义使用的(语法和编译器层面上严格规定),这就不像通用寄存器那么随意了,比如虽然AX是存放累加值的,但也可以存放一个段地址或其它含义的数据,即实际的使用方法可以和它名字描述的不一样,因此称为”通用寄存器“;

    5) CS:IP组合:IP即Instruction Pointer,指令指针寄存器,即代码段CS对应的偏移指针,和CS配合使用,CS:IP共同指示下一条要执行的指令在内存中的位置;

    6) 一般情况下一条指令的执行流程:通过CS:IP的指向从内存中取出下一条执行的指令装入CPU的指令寄存器   --->   执行指令   --->   IP++(即指向下一条指令了),但也有可能通过JMP等跳转指令重新修改CS:IP而该表下一条指令的位置   --->   重复第一步(循环);

当然可能某条执行的指令是退出指令,则程序就会退出(或中断)!

    7) 只能通过一些特殊的指令(如JMP等)才能对CS:IP进行修改,之后会详述;


  

0 0