精华内容
下载资源
问答
  • (转)汇编中各寄存器作用
    2021-07-28 06:13:12

    反汇编里rep stos dword ptr es:[edi] 是做什么的?

    参考资料:1.http://www.cnblogs.com/awpatp/archive/2012/08/05/2623628.html

    2.http://stackoverflow.com/questions/4024492/can-anyone-help-me-interpret-this-simple-disassembly-from-windbg

    3.http://www.cs.ubbcluj.ro/~dadi/ac/doc/ng1cf0a.html

    4.http://www.cs.ubbcluj.ro/~dadi/ac/doc/ng15a5f.html

    汇编当中 dword ptr [ ] 是什么意思?

    dword 双字 就是四个字节

    ptr pointer缩写 即指针

    []里的数据是一个地址值,这个地址指向一个双字型数据

    比如mov eax, dword ptr [12345678] 把内存地址12345678中的双字型(32位)数据赋给eax

    再比如

    MOV EAX, DWORD PTR SS:[EBP-1CH]

    MOV是一个赋值语句,这句话的意思是:将EBP寄存器的值减1CH,然后在SS(堆栈段)寻址,找到EBP-1CH这个地址的值,然后将这个值转换成 DWORD类型,也就是32位,取4字节,然后存在EAX这个寄存器里。

    寄存器 英文名称:Register

    寄存器定义:寄存器是中央处理器内的组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。

    寄存器用途

    1.可将寄存器内的数据 执行算术及逻辑运算;

    2.存于 寄存器内的地址 可用来 指向内存的某个位置,即寻址;

    3.可以用来 读写数据到电脑的周边设备。

    8086 有14个16位寄存器,这14个寄存器按其用途可分为(1)通用寄存器、(2)指令指针、(3)标志寄存器和(4)段寄存器等4类。

    (1)通用寄存器有8个, 又可以分成2组,一组是数据寄存器(4个),另一组是指针寄存器及变址寄存器(4个).

    数据寄存器分为:

    AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据.

    BH&BL=BX(base):基址寄存器,常用于地址索引;

    CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.

    DH&DL=DX(data):数据寄存器,常用于数据传递。

    他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器可以分别寻址,并单独使用。

    另一组是指针寄存器和变址寄存器,包括:

    SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置;

    BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;

    SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;

    DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。

    这4个16位寄存器只能按16位进行存取操作,主要用来形成操作数的地址,用于堆栈操作和变址运算中计算操作数的有效地址。

    (2) 指令指针IP(Instruction Pointer)

    指令指针IP是一个16位专用寄存器,它指向当前需要取出的指令字节,当BIU(总线接口部件,Bus Interface Unit)从内存中取出一个指令字节后,IP就自动加1,指向下一个指令字节。注意,IP指向的是指令地址的段内地址偏移量,又称偏移地址(Offset Address)或有效地址(EA,Effective Address)。

    (3)标志寄存器FR(Flag Register)

    8086有一个18位的标志寄存器FR,在FR中有意义的有9位,其中6位是状态位,3位是控制位。分别是:OF:溢出标志位,DF:方向标志位,IF:中断允许标志位,TF:跟踪标志位,SF:符号标志位,ZF:零标志位,AF:辅助进位标志位,PF:奇偶标志位,CF:进位标志位

    4)段寄存器(Segment Register)

    为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:

    CS(Code Segment):代码段寄存器;

    DS(Data Segment):数据段寄存器;

    SS(Stack Segment):堆栈段寄存器;

    ES(Extra Segment):附加段寄存器。

    当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。

    以上是8086寄存器的整体概况, 自80386开始,PC进入32bit时代,其寻址方式,寄存器大小, 功能等都发生了变化:

    =============================以下是80386的寄存器的一些资料=========================

    寄存器都是32-bits宽。

    A、通用寄存器

    下面介绍通用寄存器及其习惯用法。顾名思义,通用寄存器是那些你可以根据自己的意愿使用的寄存器,修改他们的值通常不会对计算机的运行造成很大的影响。通用寄存器最多的用途是计算。

    EAX:通用寄存器。相对其他寄存器,在进行运算方面比较常用。在保护模式中,也可以作为内存偏移指针(此时,DS作为段寄存器或选择器)

    EBX:通用寄存器。通常作为内存偏移指针使用(相对于EAX、ECX、EDX),DS是默认的段寄存器或选择器。在保护模式中,同样可以起这个作用。

    ECX:通用寄存器。通常用于特定指令的计数。在保护模式中,也可以作为内存偏移指针(此时,DS作为寄存器或段选择器)。

    EDX:通用寄存器。在某些运算中作为EAX的溢出寄存器(例如乘、除)。在保护模式中,也可以作为内存偏移指针(此时,DS作为段寄存器或选择器)。

    同AX分为AH&AL一样,上述寄存器包括对应的16-bit分组和8-bit分组。

    B、用作内存指针的特殊寄存器

    变址寄存器: ESI:通常在内存操作指令中作为“源地址指针”使用。当然,ESI可以被装入任意的数值,但通常没有人把它当作通用寄存器来用。DS是默认段寄存器或选择器。

    变址寄存器: EDI:通常在内存操作指令中作为“目的地址指针”使用。当然,EDI也可以被装入任意的数值,但通常没有人把它当作通用寄存器来用。DS是默认段寄存器或选择器。

    指针寄存器: EBP:这也是一个作为指针的寄存器。通常,它被高级语言编译器用以建造‘堆栈帧'来保存函数或过程的局部变量,不过,还是那句话,你可以在其中保存你希望的任何数据。SS是它的默认段寄存器或选择器。

    指针寄存器: ESP:寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

    BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。

    注意,这三个寄存器没有对应的8-bit分组。换言之,你可以通过SI、DI、BP作为别名访问他们的低16位,却没有办法直接访问他们的低8位。

    C、段选择器

    CPU内部的段寄存器:CS——代码段寄存器(Code Segment Register),其值为代码段的段值;DS——数据段寄存器(Data Segment Register),其值为数据段的段值;ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。

    * 注意 一定不要在初学汇编的阶段把这些寄存器弄混。他们非常重要,而一旦你掌握了他们,你就可以对他们做任意的操作了。段寄存器,或选择器,在没有指定的情况下都是使用默认的那个。这句话在现在看来可能有点稀里糊涂,不过你很快就会在后面知道如何去做。

    D、指令指针寄存器

    EIP 这个寄存器非常的重要。这是一个32位宽的寄存器,同CS一同指向即将执行的那条指令的地址。不能够直接修改这个寄存器的值,修改它的唯一方法是跳转或分支指令。(CS是默认的段或选择器)

    总结:

    4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)

    更多相关内容
  • 寄存器作用

    2021-07-28 07:23:41
    [From]AX/EAX: 累加器,算术通用寄存器,与端口的通讯也用这个...和累加器结合表示双字长的数,其中累加器用于存低位数.[From]http://blog.csdn.net/huangwei1024/archive/2007/01/29/1496560.aspx2.1 寄存器寄存器...

    [From]

    AX/EAX: 累加器,算术通用寄存器,与端口的通讯也用这个寄存器.

    BX/EBX: 基址寄存器.

    CX/ECX: 计数器,结合串处理指令使用.

    DX/EDX: 算术通用寄存器.和累加器结合表示双字长的数,其中累加器用于存低位数.

    [From]http://blog.csdn.net/huangwei1024/archive/2007/01/29/1496560.aspx

    2.1 寄存器组

    寄存器是CPU内部重要的数据存储资源,是汇编程序员能直接使用的硬件资源之一。由于寄存器的存取速度比内存快,所以,在用汇编语言编写程序时,要尽可能充分利用寄存器的存储功能。

    寄存器一般用来保存程序的中间结果,为随后的指令快速提供操作数,从而避免把中间结果存入内存,再读取内存的操作。在高级语言(如:C/C++语言)中,也有定义变量为寄存器类型的,这就是提高寄存器利用率的一种可行的方法。

    另外,由于寄存器的个数和容量都有限,不可能把所有中间结果都存储在寄存器中,所以,要对寄存器进行适当的调度。根据指令的要求,如何安排适当的寄存器,避免操作数过多的传送操作是一项细致而又周密的工作。有关“寄存器的分配策略”在后续课程《编译原理》中会有详细的介绍。

    由于16位/32位CPU是微机CPU的两个重要代表,所以,在此只介绍它们内部寄存器的名称及其主要功能。

    1、 16位寄存器组

    16位CPU所含有的寄存器有(见图2.1中16位寄存器部分):

    4个数据寄存器(AX、BX、CX和DX)

    2个变址和指针寄存器(SI和DI)

    2个指针寄存器(SP和BP)

    4个段寄存器(ES、CS、SS和DS)

    1个指令指针寄存器(IP)

    1个标志寄存器(Flags)

    2、 32位寄存器组

    32位CPU除了包含了先前CPU的所有寄存器,并把通用寄存器、指令指针和标志寄存器从16位扩充成32位之外,还增加了2个16位的段寄存器:FS和GS。

    32位CPU所含有的寄存器有(见图2.1中的寄存器):

    4个数据寄存器(EAX、EBX、ECX和EDX)

    2个变址和指针寄存器(ESI和EDI)

    2个指针寄存器(ESP和EBP)

    6个段寄存器(ES、CS、SS、DS、FS和GS)

    1个指令指针寄存器(EIP)

    1个标志寄存器(EFlags)

    070209104014.gif

    070209104023.gif

    070209104029.gif

    图2.1 CPU寄存器组的示意图

    2.1.2、通用寄存器的作用

    通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。除此之外,它们还各自具有一些特殊功能。汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途,只有这样,才能在程序中做到正确、合理地使用它们。

    表2.1 通用寄存器的主要用途

    寄存器的分类

    寄存器

    主 要 用 途

    数据

    寄存器

    AX

    乘、除运算,字的输入输出,中间结果的缓存

    AL

    字节的乘、除运算,字节的输入输出,十进制算术运算

    AH

    字节的乘、除运算,存放中断的功能号

    BX

    存储器指针

    CX

    串操作、循环控制的计数器

    CL

    移位操作的计数器

    DX

    字的乘、除运算,间接的输入输出

    变址

    寄存器

    SI

    存储器指针、串指令中的源操作数指针

    DI

    存储器指针、串指令中的目的操作数指针

    变址

    寄存器

    BP

    存储器指针、存取堆栈的指针

    SP

    堆栈的栈顶指针

    指令指针

    IP/EIP

    标志位寄存器

    Flag/EFlag

    32位

    CPU的

    段寄存器

    16位CPU的

    段寄存器

    ES

    附加段寄存器

    CS

    代码段寄存器

    SS

    堆栈段寄存器

    DS

    数据段寄存器

    新增加的

    段寄存器

    FS

    附加段寄存器

    GS

    附加段寄存器

    更详细的内容请点击:。

    2.1.3、专用寄存器的作用

    16位CPU内部有一个16位的标志寄存器,它包含9个标志位。这些标志位主要用来反映处理器的状态和运算结果的某些特征。各标志位在标志寄存器内的分布如图2.2所示。

    15

    14

    13

    12

    11

    10

    9

    8

    7

    6

    5

    4

    3

    2

    1

    0

    OF

    DF

    IF

    TF

    SF

    ZF

    AF

    PF

    CF

    31

    17

    16

    15

    14

    13

    12

    11

    10

    9

    8

    7

    6

    5

    4

    3

    2

    1

    0

    VM

    RF

    NT

    IOPL

    OF

    DF

    IF

    TF

    SF

    ZF

    AF

    PF

    CF

    图2.2 16位/32位标志寄存器的示意图

    上面9个标志位可分为二组:运算结果标志位(有背景色的标志位)和状态控制标志位。前者受和结果的影响,后者受一些控制指令执行的影响。

    更详细的内容请点击:。

    有些指令的执行会改变标志位(如:算术运算指令等),不同的指令会影响不同的标志位,有些指令的执行不改变任何标志位(如:MOV指令等),有些指令的执行会受标志位的影响(如:条件转移指令等),也有指令的执行不受其影响。

    程序员要想熟练运用这些标志位,就必须掌握每个标志位的含义、每条指令的执行条件和执行结果对标志位的作用。

    注意:虽然知道每个标志位在标志寄存器内的具体位置是有好处的,但通常情况下,没有这个必要。在使用第5.2.9节中的“”时,系统会自动引用相应标志位的值来决定是否需要“转移”的,所以,不必过分强调标志位在标志寄存器内的具体位置。

    展开全文
  • 【汇编】各个寄存器作用详解

    千次阅读 多人点赞 2017-10-27 19:13:37
    寄存器  英文名称:Register 寄存器定义  寄存器是中央处理器内的组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)...
    寄存器
       英文名称:Register

    寄存器定义

      寄存器是 中央处理器内的组成部份。 寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、 数据和位址。在中央处理器的控制部件中,包含的寄存器有 指令寄存(IR)和 程序计数器(PC)。 在中央处理器的算术及逻辑部件中,包含的寄存器有 累加器( ACC )。
      寄存器是内存阶层中的最顶端, 也是系统获得操作资料的最快速途径。 寄存器通常都是以他们可以保存的位元数量来估量,举例来说,一个 “8 位元寄存器”或 “32 位元寄存器”。寄存器现在都以寄存器档案的方式来实作, 但是他们也可能使用单独的正反器、高速的核心内存、 薄膜内存以及在数种机器上的其他方式来实作出来。 
      寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂 存器群组。更适当的是称他们为 “架构寄存器”。 
      例如,x86 指令及定义八个 32 位元寄存器的集合,但一个实作 x86 指令集的 CPU 可以包含比八个更多的寄存器。
      寄存器是CPU内部的元件,寄存器拥有非常高的读写速度, 所以在寄存器之间的数据传送非常快。

    寄存器用途

      1.可将寄存器内的数据执行算术及逻辑运算;
      2.存于寄存器内的地址可用来指向内存的某个位置,即寻址;
      3.可以用来读写数据到电脑的周边设备。

    数据寄存器

      8086 有14个16位寄存器,这14个寄存器按其用途可分为(1) 通用寄存器、(2)指令指针、(3)标志寄存器和(4) 段寄存器等4类。
       (1)通用寄存器有8个, 又可以分成2组,一组是数据寄存器(4个), 另一组是指针寄存器及变址寄存器(4个).
      数据寄存器分为:
       AH&AL=AX(accumulator):累加寄存器, 常用于运算;在乘除等指令中指定用来存放操作数,另外, 所有的I/O指令都使用这一寄存器与外界设备传送数据.
       BH&BL=BX(base):基址寄存器,常用于地址索引;
       CH&CL=CX(count):计数寄存器,常用于计数; 常用于保存计算值,如在移位指令,循环(loop) 和串处理指令中用作隐含的计数器.
       DH&DL=DX(data):数据寄存器,常用于数据传递。
      他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。 这2组8位寄存器可以分别寻址,并单独使用。
      另一组是指针寄存器和变址寄存器,包括:
       SP(Stack Pointer):堆栈指针,与SS配合使用, 可指向目前的堆栈位置;
       BP(Base Pointer):基址指针寄存器, 可用作SS的一个相对基址位置;
       SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针
       DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。
      这4个16位寄存器只能按16位进行存取操作, 主要用来形成操作数的地址, 用于堆栈操作和变址运算中计算操作数的有效地址。
      ( 2) 指令指针IP(Instruction Pointer)
      指令指针IP是一个16位专用寄存器, 它指向当前需要取出的指令字节, 当BIU从内存中取出一个指令字节后,IP就自动加1, 指向下一个指令字节。注意, IP指向的是指令地址的段内地址偏移量,又称偏移地址( Offset Address)或有效地址(EA,Effective Address)。
       (3)标志寄存器FR(Flag Register)
      
    8086有一个18位的标志寄存器FR, 在FR中有意义的有9位,其中6位是状态位,3位是控制位。
       OF: 溢出标志位OF用于反映有符号数加减运算所得结果是否溢出。 如果运算结果超过当前运算位数所能表示的范围,则称为溢出, OF的值被置为1,否则,OF的值被清为0。
       DF:方向标志DF位用来决定在串操作指令执行时有关指针寄存器 发生调整的方向。 
       IF:中断允许标志IF位用来决定CPU是否响应CPU外部的可 屏蔽中断发出的中断请求。但不管该标志为何值, CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求, 以及CPU内部产生的中断请求。具体规定如下: 
      (1)、当IF=1时, CPU可以响应CPU外部的可屏蔽中断发出的中断请求; 
      (2)、当IF=0时, CPU不响应CPU外部的可屏蔽中断发出的中断请求。 
       TF:跟踪标志TF。该标志可用于程序调试。 TF标志没有专门的指令来设置或清楚。
      (1)如果TF=1,则CPU处于单步执行指令的工作方式, 此时每执行完一条指令, 就显示CPU内各个寄存器的当前值及CPU将要执行的下一条指令
      (2)如果TF=0,则处于连续工作模式。
       SF:符号标志SF用来反映运算结果的符号位, 它与运算结果的最高位相同。在微机系统中, 有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。 运算结果为正数时,SF的值为0,否则其值为1。 
       ZF: 零标志ZF用来反映运算结果是否为0。如果运算结果为0, 则其值为1,否则其值为0。在判断运算结果是否为0时, 可使用此标志位。 
       AF:下列情况下,辅助进位标志AF的值被置为1, 否则其值为0: 
      (1)、在字操作时,发生低字节向高字节进位或借位时; 
      (2)、在字节操作时,发生低4位向高4位进位或借位时。 
       PF:奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。 如果“1”的个数为偶数,则PF的值为1,否则其值为0。 
       CF:进位标志CF主要用来反映运算是否产生进位或借位。 如果运算结果的最高位产生了一个进位或借位,那么,其值为1, 否则其值为0。) 
       4)段寄存器(Segment Register)
      为了运用所有的内存空间,8086设定了四个段寄存器, 专门用来保存段地址:
       CS(Code Segment):代码段寄存器;
       DS(Data Segment):数据段寄存器;
       SS(Stack Segment):堆栈段寄存器;
       ES(Extra Segment):附加段寄存器。
      当一个程序要执行时,就要决定程序代码、 数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。 所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。 所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。 8086以内存做为战场,用寄存器做为军事基地,以加速工作。
      以上是8086寄存器的整体概况, 自80386开始,PC进入32bit时代,其寻址方式, 寄存器大小, 功能等都发生了变化:
      ============================= 以下是80386的寄存器的一些资料============= =========================
      寄存器都是32-bits宽。
      A、通用寄存器 
      下面介绍通用寄存器及其习惯用法。顾名思义, 通用寄存器是那些你可以根据自己的意愿使用的寄存器, 修改他们的值通常不会对计算机的运行造成很大的影响。 通用寄存器最多的用途是计算。 
      EAX:通用寄存器。相对其他寄存器,在进行运算方面比较常用。 在保护模式中,也可以作为内存偏移指针(此时,DS作为段 寄存器或选择器) 
      EBX:通用寄存器。通常作为内存偏移指针使用(相对于EAX、 ECX、EDX),DS是默认的段寄存器或选择器。 在保护模式中,同样可以起这个作用。 
      ECX:通用寄存器。通常用于特定指令的计数。在保护模式中, 也可以作为内存偏移指针(此时,DS作为 寄存器或段选择器)。
      EDX:通用寄存器。在某些运算中作为EAX的溢出寄存器( 例如乘、除)。在保护模式中,也可以作为内存偏移指针(此时, DS作为段 寄存器或选择器)。 
      同AX分为AH&AL一样,上述寄存器包括对应的16- bit分组和8-bit分组。 
      B、用作内存指针的特殊寄存器
      ESI:通常在内存操作指令中作为“源地址指针”使用。当然, ESI可以被装入任意的数值, 但通常没有人把它当作通用寄存器来用。 DS是默认段寄存器或选择器。 
      EDI:通常在内存操作指令中作为“目的地址指针”使用。当然, EDI也可以被装入任意的数值, 但通常没有人把它当作通用寄存器来用。 DS是默认段寄存器或选择器。 
      EBP:这也是一个作为指针的寄存器。通常, 它被高级语言编译器用以建造‘堆栈帧' 来保存函数或过程的局部变量,不过,还是那句话, 你可以在其中保存你希望的任何数据。 SS是它的默认段寄存器或选择器。 
      注意,这三个寄存器没有对应的8-bit分组。换言之, 你可以通过SI、DI、BP作为别名访问他们的低16位, 却没有办法直接访问他们的低8位。 
      C、段选择器:
      实模式下的段寄存器到保护模式下摇身一变就成了选择器。 不同的是,实模式下的“段寄存器”是16-bit的, 而保护模式下的选择器是32-bit的。 
      CS 代码段,或代码选择器。同IP寄存器(稍后介绍) 一同指向当前正在执行的那个地址。 处理器执行时从这个寄存器指向的段(实模式)或内存(保护模式) 中获取指令。除了跳转或其他分支指令之外, 你无法修改这个寄存器的内容。 
      DS 数据段,或数据选择器。这个寄存器的低16 bit连同ESI一同指向的指令将要处理的内存。同时, 所有的内存操作指令 默认情况下都用它指定操作段(实模式)或内存(作为选择器, 在保护模式。这个寄存器可以被装入任意数值, 然而在这么做的时候需要小心一些。方法是,首先把数据送给AX, 然后再把它从AX传送给DS(当然,也可以通过堆栈来做). 
      ES 附加段,或附加选择器。这个寄存器的低16 bit连同EDI一同指向的指令将要处理的内存。同样的, 这个寄存器可以被装入任意数值,方法和DS类似。 
      FS F段或F选择器(推测F可能是Free?)。 可以用这个寄存器作为默认段寄存器或选择器的一个替代品。 它可以被装入任何数值,方法和DS类似。 
      GS G段或G选择器(G的意义和F一样, 没有在Intel的文档中解释)。它和FS几乎完全一样。 
      SS 堆栈段或堆栈选择器。这个寄存器的低16 bit连同ESP一同指向下一次堆栈操作(push和pop) 所要使用的堆栈地址。这个寄存器也可以被装入任意数值, 你可以通过入栈和出栈操作来给他赋值, 不过由于堆栈对于很多操作有很重要的意义,因此, 不正确的修改有可能造成对堆栈的破坏。 
      * 注意 一定不要在初学汇编的阶段把这些寄存器弄混。他们非常重要, 而一旦你掌握了他们,你就可以对他们做任意的操作了。段寄存器, 或选择器,在没有指定的情况下都是使用默认的那个。 这句话在现在看来可能有点稀里糊涂, 不过你很快就会在后面知道如何去做。 
      指令指针寄存器:
      EIP 这个寄存器非常的重要。这是一个32位宽的寄存器 ,同CS一同指向即将执行的那条指令的地址。 不能够直接修改这个寄存器的值, 修改它的唯一方法是跳转或分支指令。(CS是默认的段或选择器) 
      上面是最基本的寄存器。下面是一些其他的寄存器, 你甚至可能没有听说过它们。(都是32位宽):
      CR0, CR2, CR3(控制寄存器)。举一个例子, CR0的作用是切换实模式和保护模式。 
      还有其他一些寄存器,D0, D1, D2, D3, D6和D7(调试寄存器)。 他们可以作为调试器的硬件支持来设置条件断点。 
      TR3, TR4, TR5, TR6 和 TR? 寄存器(测试寄存器)用于某些条件测试

    最近在学汇编,看到这篇文章,文章的原出处已经查不出来了,但觉得不错,所以转出来,当作备份学习。

    4个数据寄存器(EAX、EBX、ECX和EDX)
    2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
    6个段寄存器(ES、CS、SS、DS、FS和GS)
    1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)

    1、数据寄存器
    数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。

    4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种”可分可合”的特性,灵活地处理字/字节的信息。
    寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、 除、输入/输出等操作,它们的使用频率很高; 寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作 中,当移多位时,要用CL来指明移位的位数;
    寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
    2、变址寄存器
    32位CPU有2个32位通用寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
    寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。
    3、指针寄存器
    32位CPU有2个32位通用寄存器EBP和ESP。其低16位对应先前CPU中的SBP和SP,对低16位数据的存取,不影响高16位的数据。
    寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
    它们主要用于访问堆栈内的存储单元,并且规定:
    BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;
    SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
    4、段寄存器
    段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成
    的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
    CPU内部的段寄存器:
    CS——代码段寄存器(Code Segment Register),其值为代码段的段值;
    DS——数据段寄存器(Data Segment Register),其值为数据段的段值;
    ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
    SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;
    FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
    GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。

    在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的。有关规定简单描述如下:
    实方式: 前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为”段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。
    保护方式: 在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为”选择子”(Selector)的某个值。
    5、指令指针寄存器
    32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。
    指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。所以,在理解它们的功能时,不考虑存在指令队列的情况。
    在实方式下,由于每个段的最大范围为64K,所以,EIP中的高16位肯定都为0,此时,相当于只用其低16位的IP来反映程序中指令的执行次序。
    6、标志寄存器
    一、运算结果标志位
    1、进位标志CF(Carry Flag)
    进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
    2、奇偶标志PF(Parity Flag)
    奇偶标志PF用于反映运算结果中”1″的个数的奇偶性。如果”1″的个数为偶数,则PF的值为1,否则其值为0。
    利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
    3、辅助进位标志AF(Auxiliary Carry Flag)
    在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
    (1)、在字操作时,发生低字节向高字节进位或借位时;
    (2)、在字节操作时,发生低4位向高4位进位或借位时。
    对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。
    4、零标志ZF(Zero Flag)
    零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
    5、符号标志SF(Sign Flag)
    符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
    6、溢出标志OF(Overflow Flag)
    溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。”溢出”和”进位”是两个不同含义的概念,不要混淆。如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。
    二、状态控制标志位
    状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。
    1、追踪标志TF(Trap Flag)
    当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。
    2、中断允许标志IF(Interrupt-enable Flag)
    中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:
    (1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
    (2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
    CPU的指令系统中也有专门的指令来改变标志位IF的值。
    3、方向标志DF(Direction Flag)
    方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。具体规定在第5.2.11节——字符串操作指令——中给出。在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。
    三、32位标志寄存器增加的标志位
    1、I/O特权标志IOPL(I/O Privilege Level)
    I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。该字段指定了要求执行I/O指令的特权级。如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。
    2、嵌套任务标志NT(Nested Task)
    嵌套任务标志NT用来控制中断返回指令IRET的执行。具体规定如下:
    (1)、当NT=0,用堆栈中保存的值恢复EFLAGS、CS和EIP,执行常规的中断返回操作;
    (2)、当NT=1,通过任务转换实现中断返回。
    3、重启动标志RF(Restart Flag)
    重启动标志RF用来控制是否接受调试故障。规定:RF=0时,表示”接受”调试故障,否则拒绝之。在成功执行完一条指令后,处理机把RF置为0,当接受到一个非调试故障时,处理机就把它置为1。
    4、虚拟8086方式标志VM(Virtual 8086 Mode)
    如果该标志的值为1,则表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态

    展开全文
  • 寄存器作用

    千次阅读 2017-10-09 01:01:00
    寄存器作用 ============   通用寄存器 EAX 累加(Accumulator)寄存器 AX(AH、AL) 常用于乘、除法和函数返回值 EBX 基址(Base)寄存器 BX(BH、BL) 常做内存数据的指针, 或者说常以它为基址来访问内存. ECX ...

    各寄存器的作用

    ============
     
    通用寄存器
    EAX累加(Accumulator)寄存器AX(AH、AL)常用于乘、除法和函数返回值
    EBX基址(Base)寄存器BX(BH、BL)常做内存数据的指针, 或者说常以它为基址来访问内存.
    ECX计数器(Counter)寄存器CX(CH、CL)常做字符串和循环操作中的计数器
    EDX数据(Data)寄存器DX(DH、DL)常用于乘、除法和 I/O 指针
    ESI来源索引(Source Index)寄存器SI常做内存数据指针和源字符串指针
    EDI目的索引(Destination Index)寄存器DI常做内存数据指针和目的字符串指针
    ESP堆栈指针(Stack Point)寄存器SP只做堆栈的栈顶指针; 不能用于算术运算与数据传送
    EBP基址指针(Base Point)寄存器BP只做堆栈指针, 可以访问堆栈内任意地址, 经常用于中转 ESP 中的数据, 也常以它为基址来访问堆栈; 不能用于算术运算与数据传送
    指令指针寄存器
    EIP指令指针(Instruction Pointer)寄存器总是指向下一条指令的地址; 所有已执行的指令都被它指向过.
    标志寄存器
    EFLAGS

    标志(Flag)寄存器:
    EFLAGS 中的 32 位被分成 0-31 个二进制位分别使用;
    第 0、2、4、6、7、11 位是状态标志位;
    第 10 位是字符串操作控制标志位;
    其他标志位一般不用或无权使用
     

    0CF进位(Carry)标志目标无法容纳无符号算术运算的结果, 需要进位或借位时被设置; 可用 STC 指令设置, CLC 指令取消.
    1   
    2PF奇偶(Parity)标志低 8 位中有偶数个 1 时被设置
    3   
    4AF辅助(Auxiliary)标志使用 BCD 码运算导致 3 位到 4 位产生进位时被设置
    5   
    6ZF零(Zero)标志运算结果为 0 时被设置
    7SF符号(Sign)标志运算结果为负数时被设置
    8   
    9   
    10DF方向(Direction)标志字符串操作是从高位到低位时被设置; 可用 STD 指令设置, CLD 指令取消.
    11OF溢出(Overflow)标志因有符号运算的结果太宽而导致数据丢失时被设置
    ...   
    31   
    ...     


    其中的 EAX、ECX、EDX 三个寄存器相对自由些, 所以练习时用它们较多.

    没理会段寄存器: CS、DS、SS、ES、FS、GS, 是因在 Win32 保护模式下编程它们不再重要了.

    还有 FPU、MMX 系列寄存器, 等用到再说吧.
     
     
    4个数据寄存器(EAX、EBX、ECX、EDX)
    2个变址和指针寄存器(ESI、EDI)
    2个指针寄存器(ESP、EBP)
    6个段寄存器(ES、CS、SS、DS、FS、GS)
    1个指令指针寄存器(EIP)
    1个标志寄存器(EFL)
     
    1、数据寄存器
    数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
    4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
    寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、 除、输入/输出等操作,它们的使用频率很高; 寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作 中,当移多位时,要用CL来指明移位的位数;
    寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也 可用于存放I/O的端口地址。在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
     
    2、变址寄存器
    32位CPU有2个32位通用寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
    寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。
     
    3、指针寄存器
    32位CPU有2个32位通用寄存器EBP和ESP。其低16位对应先前CPU中的SBP和SP,对低16位数据的存取,不影响高16位的数据。
    寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
    它们主要用于访问堆栈内的存储单元,并且规定:
    BP为基指针(Base Pointer)寄存器,通过它减去一定的偏移值,来访问栈中的元素;
    SP为堆栈指针(Stack Pointer)寄存器,它始终指向栈顶。
    说明:因栈的生长方向是从高地址向低地址生长,所以,进栈时,sp自减;出栈时,sp自增;
     
    4、段寄存器
    段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成
    的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
    CPU内部的段寄存器:
    CS——代码段寄存器(Code Segment Register),其值为代码段的段值;
    DS——数据段寄存器(Data Segment Register),其值为数据段的段值;
    ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
    SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;
    FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
    GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
    在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的。有关规定简单描述如下:
    实方式: 前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为”段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。
    保护方式: 在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为”选择子”(Selector)的某个值。
     
    5、指令指针寄存器
    32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。
    指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。所以,在理解它们的功能时,不考虑存在指令队列的情况。
    在实方式下,由于每个段的最大范围为64K,所以,EIP中的高16位肯定都为0,此时,相当于只用其低16位的IP来反映程序中指令的执行次序。
     
    6、标志寄存器
    asm
    一、运算结果标志位
    1、进位标志CF(Carry Flag)
    进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
    2、奇偶标志PF(Parity Flag)
    奇偶标志PF用于反映运算结果中”1″的个数的奇偶性。如果”1″的个数为偶数,则PF的值为1,否则其值为0。
    利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
    3、辅助进位标志AF(Auxiliary Carry Flag)
    在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
    (1)、在字操作时,发生低字节向高字节进位或借位时;
    (2)、在字节操作时,发生低4位向高4位进位或借位时。
    对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。
    4、零标志ZF(Zero Flag)
    零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
    5、符号标志SF(Sign Flag)
    符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
    6、溢出标志OF(Overflow Flag)
    溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。”溢出”和”进位”是两个不同含义的概念,不要混淆。如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。
    二、状态控制标志位
    状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。
    1、追踪标志TF(Trap Flag)
    当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。
    2、中断允许标志IF(Interrupt-enable Flag)
    中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:
    (1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
    (2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
    CPU的指令系统中也有专门的指令来改变标志位IF的值。
    3、方向标志DF(Direction Flag)
    方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。具体规定在第5.2.11节——字符串操作指令——中给出。在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。
    三、32位标志寄存器增加的标志位
    1、I/O特权标志IOPL(I/O Privilege Level)
    I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。该字段指定了要求执行I/O指令的特权级。如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。
    2、嵌套任务标志NT(Nested Task)
    嵌套任务标志NT用来控制中断返回指令IRET的执行。具体规定如下:
    (1)、当NT=0,用堆栈中保存的值恢复EFLAGS、CS和EIP,执行常规的中断返回操作;
    (2)、当NT=1,通过任务转换实现中断返回。
    3、重启动标志RF(Restart Flag)
    重启动标志RF用来控制是否接受调试故障。规定:RF=0时,表示”接受”调试故障,否则拒绝之。在成功执行完一条指令后,处理机把RF置为0,当接受到一个非调试故障时,处理机就把它置为1。
    4、虚拟8086方式标志VM(Virtual 8086 Mode)
    如果该标志的值为1,则表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。
     
     

    eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器。如果用C语言来解释,可以把这些寄存器当作变量看待。

     

    比方说:add eax,-2 ;   //可以认为是给变量eax加上-2这样的一个值。

    这些32位寄存器有多种用途,但每一个都有“专长”,有各自的特别之处。

    EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。

    EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址。

    ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。

    EDX 则总是被用来放整数除法产生的余数。

    ESI/EDI分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.

    EBP是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码:

    push ebp ;保存当前ebp
    mov ebp,esp ;EBP设为当前堆栈指针
    sub esp, xxx ;预留xxx字节给函数临时变量.
    ...

    这样一来,EBP 构成了该函数的一个框架, 在EBP上方分别是原来的EBP, 返回地址和参数. EBP下方则是临时变量. 函数返回时作 mov esp,ebp/pop ebp/ret 即可.

    ESP 专门用作堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节。

    esp:寄存器存放当前线程的栈顶指针
    ebp:寄存器存放当前线程的栈底指针
    eip:寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。

    一般寄存器:AX、BX、CX、DX
    AX:累積暫存器,BX:基底暫存器,CX:計數暫存器,DX:資料暫存器

    索引暫存器:SI、DI 
    SI:來源索引暫存器,DI:目的索引暫存器 

    堆疊、基底暫存器:SP、BP 
    SP:堆疊指標暫存器,BP:基底指標暫存器 

    EAX、ECX、EDX、EBX:為ax,bx,cx,dx的延伸,各為32位元 
    ESI、EDI、ESP、EBP:為si,di,sp,bp的延伸,32位元

     

    栈的基本模型

     

    参数N

    ↓高地址

    参数…

    函数参数入栈的顺序与具体的调用方式有关

    参数 3

    参数 2

    参数 1

    EIP

    返回本次调用后,下一条指令的地址

    EBP

    保存调用者的EBP,然后EBP指向此时的栈顶。

    临时变量1

     

    临时变量2

     

    临时变量3

     

    临时变量…

     

    临时变量5

    ↓低地址

     
     
     
     
     
     
    指令功能
    AAA调整加
    AAD调整除
    AAM调整乘
    AAS调整减
    ADC进位加
    ADD
    AND
    ARPL调整优先级
    BOUND检查数组
    BSF位右扫描
    BSR位左扫描
    BSWAP交换字节
    BT位测试
    BTC位测试求反
    BTR位测试清零
    BTS位测试置一
    CALL过程调用
    CBW转换字节
    CDQ转换双字
    CLC进位清零
    CLD方向清零
    CLI中断清零
    CLTS任务清除
    CMC进位求反
    CMOVA高于传送
    CMOVB低于传送
    CMOVE相等传送
    CMOVG大于传送
    CMOVL小于传送
    CMOVNA不高于传送
    CMOVNB不低于传送
    CMOVNE不等传送
    CMOVNG不大于传送
    CMOVNL不小于传送
    CMOVNO不溢出传送
    CMOVNP非奇偶传送
    CMOVNS非负传送
    CMOVO溢出传送
    CMOVP奇偶传送
    CMOVS负号传送
    CMP比较
    CMPSB比较字节串
    CMPSD比较双字串
    CMPSW比较字串
    CMPXCHG比较交换
    CMPXCHG486比较交换486
    CMPXCHG8B比较交换8字节
    CPUIDCPU标识
    CWD转换字
    CWDE扩展字
    DAA调整加十
    DAS调整减十
    DEC减一
    DIV
    ENTER建立堆栈帧
    HLT
    IDIV符号整除
    IMUL符号乘法
    IN端口输入
    INC加一
    INSB端口输入字节串
    INSD端口输入双字串
    INSW端口输入字串
    JA高于跳转
    JB低于跳转
    JBE不高于跳转
    JCXZ计数一六零跳转
    JE相等跳转
    JECXZ计数三二零跳转
    JG大于跳转
    JL小于跳转
    JMP跳转
    JMPE跳转扩展
    JNB不低于跳转
    JNE不等跳转
    JNG不大于跳转
    JNL不小于跳转
    JNO不溢出跳转
    JNP非奇偶跳转
    JNS非负跳转
    JO溢出跳转
    JP奇偶跳转
    JS负号跳转
    LAHF加载标志低八
    LAR加载访问权限
    LDS加载数据段
    LEA加载有效地址
    LEAVE清除过程堆栈
    LES加载附加段
    LFS加载标志段
    LGDT加载全局描述符
    LGS加载全局段
    LIDT加载中断描述符
    LMSW加载状态字
    LOADALL加载所有
    LOADALL286加载所有286
    LOCK
    LODSB加载源变址字节串
    LODSD加载源变址双字串
    LODSW加载源变址字串
    LOOP计数循环
    LOOPE相等循环
    LOOPNE不等循环
    LOOPNZ非零循环
    LOOPZ为零循环
    LSL加载段界限
    LSS加载堆栈段
    LTR加载任务
    MONITOR监视
    MOV传送
    MOVSB传送字节串
    MOVSD传送双字串
    MOVSW传送字串
    MOVSX符号传送
    MOVZX零传送
    MUL
    MWAIT 
    NEG求补
    NOP
    NOT
    OR
    OUT端口输出
    OUTSB端口输出字节串
    OUTSD端口输出双字串
    OUTSW端口输出字串
    POP出栈
    POPA全部出栈
    POPF标志出栈
    PUSH压栈
    PUSHA全部压栈
    PUSHF标志压栈
    RCL进位循环左移
    RCR进位循环右移
    RDMSR读专用模式
    RDPMC读执行监视计数
    RDSHR 
    RDTSC读时间戳计数
    REP重复
    REPE相等重复
    REPNE不等重复
    RET过程返回
    RETF远过程返回
    RETN近过程返回
    ROL循环左移
    ROR循环右移
    RSM恢复系统管理
    SAHF恢复标志低八
    SAL算术左移
    SALC 
    SAR算术右移
    SBB借位减
    SCASB扫描字节串
    SCASD扫描双字串
    SCASW扫描字串
    SETA高于置位
    SETB低于置位
    SETE相等置位
    SETG大于置位
    SETL小于置位
    SETNA不高于置位
    SETNB不低于置位
    SETNE不等置位
    SETNG不大于置位
    SETNL不小于置位
    SETNO不溢出置位
    SETNP非奇偶置位
    SETNS非负置位
    SETO溢出置位
    SETP奇偶置位
    SETS负号置位
    SGDT保存全局描述符
    SHL逻辑左移
    SHLD双精度左移
    SHR逻辑右移
    SHRD双精度右移
    SIDT保存中断描述符
    SLDT保存局部描述符
    SMI 
    SMINT 
    SMINTOLD 
    SMSW保存状态字
    STC进位设置
    STD方向设置
    STI中断设置
    STOSB保存字节串
    STOSD保存双字串
    STOSW保存字串
    STR保存任务
    SUB
    SYSCALL系统调用
    SYSENTER系统进入
    SYSEXIT系统退出
    SYSRET系统返回
    TEST数测试
    UD0未定义指令0
    UD1未定义指令1
    UD2未定义指令2
    UMOV 
    VERW校验写
    WAIT
    WBINVD回写无效高速缓存
    WRMSR写专用模式
    WRSHR 
    XADD交换加
    XBTS 
    XCHG交换
    XLAT换码
    XOR异或
    XSTORE 



    指令功能
    EMMS媒体空MMX状态
    F2XM1浮点栈顶绝对值
    FADD浮点加
    FADDP浮点加出栈
    FBLD浮点加载十数
    FBSTP浮点保存十数出栈
    FCHS浮点正负求反
    FCLEX浮点检查错误清除
    FCMOVB浮点低于传送
    FCMOVBE浮点不高于传送
    FCMOVE浮点相等传送
    FCMOVNB浮点不低于传送
    FCMOVNBE浮点高于传送
    FCMOVNE浮点不等传送
    FCMOVNU浮点有序传送
    FCMOVU浮点无序传送
    FCOM浮点比较
    FCOMI浮点比较加载标志
    FCOMIP浮点比较加载标志出栈
    FCOMP浮点比较出栈
    FCOMPP浮点比较出栈二
    FCOS浮点余弦
    FDECSTP浮点栈针减一
    FDISI浮点检查禁止中断
    FDIV浮点除
    FDIVP浮点除出栈
    FDIVR浮点反除
    FDIVRP浮点反除出栈
    FENI浮点检查禁止中断二
    FFREE浮点释放
    FFREEP浮点释放出栈
    FIADD浮点加整数
    FICOM浮点比较整数
    FICOMP浮点比较整数出栈
    FIDIV浮点除整数
    FIDIVR浮点反除
    FILD浮点加载整数
    FIMUL浮点乘整数
    FINCSTP浮点栈针加一
    FINIT浮点检查初始化
    FIST浮点保存整数
    FISTP浮点保存整数出栈
    FISTTP 
    FISUB浮点减整数
    FISUBR浮点反减整数
    FLD浮点加载数
    FLD1浮点加载一
    FLDCW浮点加载控制器
    FLDENV浮点加载环境
    FLDL2E浮点加载L2E
    FLDL2T浮点加载L2T
    FLDLG2浮点加载LG2
    FLDLN2浮点加载LN2
    FLDPI浮点加载PI
    FLDZ浮点加载零
    FMUL浮点乘
    FMULP浮点乘出栈
    FNCLEX浮点不检查错误清除
    FNDISI浮点不检查禁止中断
    FNENI浮点不检查禁止中断二
    FNINIT浮点不检查初始化
    FNOP浮点空
    FNSAVE浮点不检查保存状态
    FNSTCW浮点不检查保存控制器
    FNSTENV浮点不检查保存环境
    FNSTSW浮点不检查保存状态器
    FPATAN浮点部分反正切
    FPREM浮点部分余数
    FPREM1浮点部分余数二
    FPTAN浮点部分正切
    FRNDINT浮点舍入求整
    FRSTOR浮点恢复状态
    FSAVE浮点检查保存状态
    FSCALE浮点比例运算
    FSETPM浮点设置保护
    FSIN浮点正弦
    FSINCOS浮点正余弦
    FSQRT浮点平方根
    FST浮点保存
    FSTCW浮点检查保存控制器
    FSTENV浮点检查保存环境
    FSTP浮点保存出栈
    FSTSW浮点检查保存状态器
    FSUB浮点减
    FSUBP浮点减出栈
    FSUBR浮点反减
    FSUBRP浮点反减出栈
    FTST浮点比零
    FUCOM浮点无序比较
    FUCOMI浮点反比加载标志
    FUCOMIP浮点反比加载标志出栈
    FUCOMP浮点无序比较出栈
    FUCOMPP浮点无序比较出栈二
    FWAIT浮点等
    FXAM浮点检查
    FXCH浮点交换
    FXTRACT浮点分解
    FYL2X浮点求L2X
    FYL2XP1浮点求L2XP1
    MOVED媒体双字传送
    MOVEQ媒体四字传送
    PACKSSDW媒体符号双字压缩
    PACKSSWB媒体符号字压缩
    PACKUSWB媒体无符号字压缩
    PADDB媒体截断字节加
    PADDD媒体截断双字加
    PADDSB媒体符号饱和字节加
    PADDSIW 
    PADDSW媒体符号饱和字加
    PADDUSB媒体无符号饱和字节加
    PADDUSW媒体无符号饱和字加
    PADDW媒体截断字加
    PAND媒体与
    PANDN媒体与非
    PAVEB 
    PCMPEQB媒体字节比等
    PCMPEQD媒体双字比等
    PCMPEQW媒体字比等
    PCMPGTB媒体字节比大
    PCMPGTD媒体双字比大
    PCMPGTW媒体字比大
    PDISTIB 
    PMACHRIW 
    PMADDWD 
    PMAGW 
    PMULHRIW 
    PMULHRWC 
    PMULHW 
    PMVGEZB 
    PMVLZB 
    PMVNZB 
    PMVZB 
    POR媒体或
    PSLLD媒体双字左移
    PSLLQ媒体四字左移
    PSLLW媒体字左移
    PSRAD媒体双字算术右移
    PSRAW媒体字算术右移
    PSRLD媒体双字右移
    PSRLQ媒体四字右移
    PSRLW媒体字右移
    PSUBB媒体截断字节减
    PSUBSB媒体符号饱和字节减
    PSUBSIW 
    PSUBSW媒体符号饱和字减
    PSUBUSB媒体无符号饱和字节减
    PSUBUSW媒体无符号饱和字减
    PSUBW媒体截断字减
    PUNPCKHBW媒体字节高位解压
    PUNPCKHDQ媒体双字高位解压
    PUNPCKHWD媒体字高位解压
    PUNPCKLBW媒体字节低位解压
    PUNPCKLDQ媒体双字低位解压
    PUNPCKLWD媒体字低位解压



    Delphi 2010 VCL、JCL 源码中用到的汇编指令(只是粗略统计):

    按名称排序使用次数按使用频率排序使用次数
    ADC15MOV4053
    ADD659PUSH1505
    AND162CMP1372
    BSF8POP1187
    BSR7JE952
    BSWAP12CALL847
    BT13JMP771
    BTC9ADD659
    BTR10JNE503
    BTS10TEST452
    CALL847SUB400
    CDQ6DEC332
    CLD10LEA288
    CMP1372RET280
    CPUID3INC261
    CWD1JZ252
    DB241OR248
    DD189DB241
    DEC332DD189
    DIV40JNZ167
    DW63MOVZX166
    ELSE2AND162
    END2FLD154
    F2XM16SHR131
    FABS7JB101
    FADD9JG92
    FADDP15JA86
    FBSTP3REP83
    FCHS5JBE81
    FCLEX5XCHG79
    FCOM7JLE79
    FCOMP7FSTP76
    FCOMPP3LODSB74
    FCOS4JL72
    FDIV11FWAIT72
    FDIVP5NEG70
    FDIVRP11DW63
    FFREE13LOCK61
    FIADD6STOSB58
    FIDIV2STOSW54
    FILD32MOVSX53
    FIMUL4FLDCW52
    FINCSTP1FLD152
    FISTP30SHL48
    FLD154JAE48
    FLD152DIV40
    FLDCW52JGE35
    FLDL2E6REPNE33
    FLDLG22LODSW33
    FLDLN29IMUL32
    FLDZ8FMUL32
    FMUL32FILD32
    FMULP26JNS31
    FNCLEX11FISTP30
    FNINIT2FXCH28
    FNSTCW20FMULP26
    FNSTSW6JS24
    FPATAN15SBB22
    FPREM3FSTSW22
    FPTAN4LOOP20
    FRNDINT14FNSTCW20
    FSCALE8FSTCW18
    FSIN3NOT17
    FSINCOS7JECXZ17
    FSQRT15FYL2X17
    FST5MUL16
    FSTCW18JNC16
    FSTP76SAHF15
    FSTSW22ROR15
    FSUB11FSQRT15
    FSUBP5FPATAN15
    FSUBR2FADDP15
    FSUBRP4ADC15
    FTST4FRNDINT14
    FWAIT72FFREE13
    FXAM1BT13
    FXCH28SAR12
    FXTRACT1ROL12
    FYL2X17RCL12
    FYL2XP11JO12
    HLT1BSWAP12
    IMUL32REPE11
    INC261FSUB11
    INT8FNCLEX11
    JA86FDIVRP11
    JAE48FDIV11
    JB101WAIT10
    JBE81CLD10
    JC6BTS10
    JE952BTR10
    JECXZ17SETC9
    JG92FLDLN29
    JGE35FADD9
    JL72BTC9
    JLE79INT8
    JMP771FSCALE8
    JNA1FLDZ8
    JNC16BSF8
    JNE503PUSHFD7
    JNG2FSINCOS7
    JNL1FCOMP7
    JNS31FCOM7
    JNZ167FABS7
    JO12BSR7
    JRCXZ2NOP6
    JS24JC6
    JZ252FNSTSW6
    LEA288FLDL2E6
    LEAVE1FIADD6
    LOCK61F2XM16
    LODSB74CDQ6
    LODSW33STOSD5
    LOOP20POPFD5
    MOV4053FSUBP5
    MOVSB1FST5
    MOVSX53FDIVP5
    MOVZX166FCLEX5
    MUL16FCHS5
    NEG70SHRD4
    NOP6PUSHF4
    NOT17POPF4
    OR248FTST4
    PAUSE3FSUBRP4
    POP1187FPTAN4
    POPF4FIMUL4
    POPFD5FCOS4
    PUSH1505RCR3
    PUSHF4PAUSE3
    PUSHFD7FSIN3
    RCL12FPREM3
    RCR3FCOMPP3
    REP83FBSTP3
    REPE11CPUID3
    REPNE33STD2
    RET280SETNZ2
    ROL12SETE2
    ROR15JRCXZ2
    SAHF15JNG2
    SAL1FSUBR2
    SAR12FNINIT2
    SBB22FLDLG22
    SETC9FIDIV2
    SETE2END2
    SETNC1ELSE2
    SETNZ2STC1
    SHL48SHLD1
    SHLD1SETNC1
    SHR131SAL1
    SHRD4MOVSB1
    STC1LEAVE1
    STD2JNL1
    STOSB58JNA1
    STOSD5HLT1
    STOSW54FYL2XP11
    SUB400FXTRACT1
    TEST452FXAM1
    WAIT10FINCSTP1
    XCHG79CWD1
     
     
    名称  功能 操作数操作码模数寄存器1寄存器2
    或内存
    位移量立即数符号方向芯片
    型号
    16位32位
    MOV传送累加08<=8[位移16]$A08086$67
    MOV传送累加08<=8[位移32]$A0386$67
    MOV传送累加16<=16[位移16]$A18086$6667
    MOV传送累加16<=16[位移32]$A1386$67$66
    MOV传送累加32<=32[位移16]$A1386$66$67
    MOV传送累加32<=32[位移32]$A1386$6667
    MOV传送累加8=>8[位移16]$A28086$67
    MOV传送累加8=>8[位移32]$A2386$67
    MOV传送累加16=>16[位移16]$A38086$6667
    MOV传送累加16=>16[位移32]$A3386$67$66
    MOV传送累加32=>32[位移16]$A3386$66$67
    MOV传送累加32=>32[位移32]$A3386$6667
    MOV传送寄:段=>寄16$8C11308086$66
    MOV传送寄:段=>寄32$8C1130386$66
    MOV传送寄:段<=寄16$8E11318086
    MOV传送寄:段<=寄32$8E1131386
    MOV传送寄:控制器=>寄32$0F201130386
    MOV传送寄:调试器=>寄32$0F211130386
    MOV传送寄:任务器=>寄32$0F241130386
    MOV传送寄:控制器<=寄32$0F221131386
    MOV传送寄:调试器<=寄32$0F231131386
    MOV传送寄:任务器<=寄32$0F261131386
    MOV传送寄8=>寄8$88111308086
    MOV传送寄16=>寄16$89111308086$66
    MOV传送寄32=>寄32$8911130386$66
    MOV传送寄8<=寄8$8A111318086
    MOV传送寄16<=寄16$8B111318086$66
    MOV传送寄32<=寄32$8B11131386$66
    MOV传送寄:段<=[寄16]$8E00518086$67
    MOV传送寄:段<=[寄32]$8E0051386$67
    MOV传送寄8<=[寄16]$8A001518086$67
    MOV传送寄8<=[寄32]$8A00151386$67
    MOV传送寄16<=[寄16]$8B001518086$6667
    MOV传送寄16<=[寄32]$8B00151386$67$66
    MOV传送寄32<=[寄16]$8B00151386$66$67
    MOV传送寄32<=[寄32]$8B00151386$6667
    MOV传送寄:段<=[寄16+位移8]$8E015918086$67
    MOV传送寄:段<=[寄32+位移8]$8E01591386$67
    MOV传送寄8<=[寄16+位移8]$8A0115918086$67
    MOV传送寄8<=[寄32+位移8]$8A011591386$67
    MOV传送寄16<=[寄16+位移8]$8B0115918086$6667
    MOV传送寄16<=[寄32+位移8]$8B011591386$67$66
    MOV传送寄32<=[寄16+位移8]$8B011591386$66$67
    MOV传送寄32<=[寄32+位移8]$8B011591386$6667
    MOV传送寄:段<=[寄16+位移16]$8E105918086$67
    MOV传送寄:段<=[寄32+位移32]$8E10591386$67
    MOV传送寄8<=[寄16+位移16]$8A1015918086$67
    MOV传送寄8<=[寄32+位移32]$8A101591386$67
    MOV传送寄16<=[寄16+位移16]$8B1015918086$6667
    MOV传送寄16<=[寄32+位移32]$8B101591386$67$66
    MOV传送寄32<=[寄16+位移16]$8B101591386$66$67
    MOV传送寄32<=[寄32+位移32]$8B101591386$6667
    MOV传送寄8<=数8$C6110003108086
    MOV传送寄16<=数16$C7110003108086$66
    MOV传送寄32<=数32$C711000310386$66
    MOV传送寄8<=数8$B090108086
    MOV传送寄16<=数16$B890108086$66
    MOV传送寄32<=数32$B89010386$66
    MOV传送寄:段=>[寄16]$8C00508086$67
    MOV传送寄:段=>[寄32]$8C0050386$67
    MOV传送寄8=>[寄16]$88001508086$67
    MOV传送寄8=>[寄32]$8800150386$67
    MOV传送寄16=>[寄16]$89001508086$6667
    MOV传送寄16=>[寄32]$8900150386$67$66
    MOV传送寄32=>[寄16]$8900150386$66$67
    MOV传送寄32=>[寄32]$8900150386$6667
    MOV传送寄:段=>[寄16+位移8]$8C015908086$67
    MOV传送寄:段=>[寄32+位移8]$8C01590386$67
    MOV传送寄8=>[寄16+位移8]$880115908086$67
    MOV传送寄8=>[寄32+位移8]$88011590386$67
    MOV传送寄16=>[寄16+位移8]$890115908086$6667
    MOV传送寄16=>[寄32+位移8]$89011590386$67$66
    MOV传送寄32=>[寄16+位移8]$89011590386$66$67
    MOV传送寄32=>[寄32+位移8]$89011590386$6667
    MOV传送寄:段=>[寄16+位移16]$8C105908086$67
    MOV传送寄:段=>[寄32+位移32]$8C10590386$67
    MOV传送寄8=>[寄16+位移16]$881015908086$67
    MOV传送寄8=>[寄32+位移32]$88101590386$67
    MOV传送寄16=>[寄16+位移16]$891015908086$6667
    MOV传送寄16=>[寄32+位移32]$89101590386$67$66
    MOV传送寄32=>[寄16+位移16]$89101590386$66$67
    MOV传送寄32=>[寄32+位移32]$89101590386$6667
    MOV传送8[寄16]<=数8$C6000005108086$67
    MOV传送8[寄32]<=数8$C600000510386$67
    MOV传送16[寄16]<=数16$C7000005108086$6766
    MOV传送16[寄32]<=数16$C700000510386$67$66
    MOV传送32[寄16]<=数32$C700000510386$66$67
    MOV传送32[寄32]<=数32$C700000510386$6766
    MOV传送8[寄16+位移8]<=数8$C60100059108086$67
    MOV传送8[寄32+位移8]<=数8$C6010005910386$67
    MOV传送16[寄16+位移8]<=数16$C70100059108086$6766
    MOV传送16[寄32+位移8]<=数16$C7010005910386$67$66
    MOV传送32[寄16+位移8]<=数32$C7010005910386$66$67
    MOV传送32[寄32+位移8]<=数32$C7010005910386$6766
    MOV传送8[寄16+位移16]<=数8$C61000059108086$67
    MOV传送8[寄32+位移32]<=数8$C6100005910386$67
    MOV传送16[寄16+位移16]<=数16$C71000059108086$6766
    MOV传送16[寄32+位移32]<=数16$C7100005910386$67$66
    MOV传送32[寄16+位移16]<=数32$C7100005910386$66$67
    MOV传送32[寄32+位移32]<=数32$C7100005910386$6766
    MOVSB传送字节串$A48086
    MOVSW传送字串$A58086$66
    MOVSD传送双字串$A5386$66
    MOVSX符号传送寄16<=寄8$0FBE1113386$66
    MOVSX符号传送寄32<=寄8$0FBE1113386$66
    MOVSX符号传送寄32<=寄16$0FBF1113386$66
    MOVSX符号传送寄16<=8[寄16]$0FBE0015386$6667
    MOVSX符号传送寄16<=8[寄32]$0FBE0015386$67$66
    MOVSX符号传送寄32<=8[寄16]$0FBE0015386$66$67
    MOVSX符号传送寄32<=8[寄32]$0FBE0015386$6667
    MOVSX符号传送寄32<=16[寄16]$0FBF0015386$66$67
    MOVSX符号传送寄32<=16[寄32]$0FBF0015386$6667
    MOVSX符号传送寄16<=8[寄16+位移8]$0FBE01159386$6667
    MOVSX符号传送寄16<=8[寄32+位移8]$0FBE01159386$67$66
    MOVSX符号传送寄32<=8[寄16+位移8]$0FBE01159386$66$67
    MOVSX符号传送寄32<=8[寄32+位移8]$0FBE01159386$6667
    MOVSX符号传送寄32<=16[寄16+位移8]$0FBF01159386$66$67
    MOVSX符号传送寄32<=16[寄32+位移8]$0FBF01159386$6667
    MOVSX符号传送寄16<=8[寄16+位移16]$0FBE10159386$6667
    MOVSX符号传送寄16<=8[寄32+位移32]$0FBE10159386$67$66
    MOVSX符号传送寄32<=8[寄16+位移16]$0FBE10159386$66$67
    MOVSX符号传送寄32<=8[寄32+位移32]$0FBE10159386$6667
    MOVSX符号传送寄32<=16[寄16+位移16]$0FBF10159386$66$67
    MOVSX符号传送寄32<=16[寄32+位移32]$0FBF10159386$6667
    MOVZX零传送寄16<=寄8$0FB61113386$66
    MOVZX零传送寄32<=寄8$0FB61113386$66
    MOVZX零传送寄32<=寄16$0FB71113386$66
    MOVZX零传送寄16<=8[寄16]$0FB60015386$6667
    MOVZX零传送寄16<=8[寄32]$0FB60015386$67$66
    MOVZX零传送寄32<=8[寄16]$0FB60015386$66$67
    MOVZX零传送寄32<=8[寄32]$0FB60015386$6667
    MOVZX零传送寄32<=16[寄16]$0FB70015386$66$67
    MOVZX零传送寄32<=16[寄32]$0FB70015386$6667
    MOVZX零传送寄16<=8[寄16+位移8]$0FB601159386$6667
    MOVZX零传送寄16<=8[寄32+位移8]$0FB601159386$67$66
    MOVZX零传送寄32<=8[寄16+位移8]$0FB601159386$66$67
    MOVZX零传送寄32<=8[寄32+位移8]$0FB601159386$6667
    MOVZX零传送寄32<=16[寄16+位移8]$0FB701159386$66$67
    MOVZX零传送寄32<=16[寄32+位移8]$0FB701159386$6667
    MOVZX零传送寄16<=8[寄16+位移16]$0FB610159386$6667
    MOVZX零传送寄16<=8[寄32+位移32]$0FB610159386$67$66
    MOVZX零传送寄32<=8[寄16+位移16]$0FB610159386$66$67
    MOVZX零传送寄32<=8[寄32+位移32]$0FB610159386$6667
    MOVZX零传送寄32<=16[寄16+位移16]$0FB710159386$66$67
    MOVZX零传送寄32<=16[寄32+位移32]$0FB710159386$6667 
     
     
     
    相比高级语言中的栈结构,在汇编指令层面栈的任务更加复杂—生命周期必须与汇编指令行的切换正确对应。
     
    这里写图片描述

    图片说明:内存地址,汇编指令都为简写,用的十进制,栈空间1个格子大小是4*8=32位(对应32位操作系统),指令行长度都简化为1字节。为了突出建栈与撤栈的过程示意,函数都没有参数。栈空间也简化了,局部变量和参数都没有在其中。 实际执行顺序一列中对汇编指令行作用的进一步解释,左边为寄存器或栈空间地址,右边为其中的值。

    寄存器%esp既是栈指针,总是指向最下方第一个空着的栈空间地址。当栈栈指针向上移动后,下方的栈空间就相当于被释放掉了。 
    %ebp寄存器在此机制中相当重要,它存储着当前函数在栈中所被分配的局部空间的起始地址。在释放栈的过程中,leave指令将会移动栈指针至%ebp存储的内存地址的位置,再反过来将此起始位置中存储的值,既上一层调用函数的起始地址,存到%ebp中,为下一次进一步释放做准备,并进一步向上移动栈指针,为ret命令做准备。在此机制中,当前函数在栈中所被分配的局部空间的起始地址的前一格内存(既是+32bit)中存储的是上一层调用函数指令call的下一行指令的内存位置,leave之后的ret指令将会控制指令行流水线跳到此处。

    一些指令的简单说明: 
    push为入栈命令。 
    pop为出栈命令。 
    栈命令都跟伴随栈指针的移动。 
    mov在此过程中将一个寄存器中的值移到另一个寄存器。 
    call可以理解为goto。并将它的下一行指令地址存到栈中。 
    leave为mov+pop。为退出栈机制的重要一环。 
    ret也可以理解为goto。并移动栈指针。

    汇编指令行对应的源码应为:

    void main(){
        //一些计算
        f1();
        //继续计算
    }
    void f1(){
        //一些计算 f2(); //继续计算return; } void f2(){ //一些计算return; }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    感觉这东西有点烧脑,花了一下午时间终于整个捋顺了整个流程。 
    想理解好此过程,理解每个指令的作用,必须结合指令行地址,栈地址和寄存器一起来分析,否则很容易被绕晕。

     
     
    汇编代码: rep stos dword ptr es:[edi]

    在网上查了相关资料显示:
    /************************************************************/
    lea     edi,[ebp-0C0h] 
    mov     ecx,30h 
    mov     eax,0CCCCCCCCh 
    rep stos dword ptr es:[edi]
    rep指令的目的是重复其上面的指令.ECX的值是重复的次数.
    STOS指令的作用是将eax中的值拷贝到ES:EDI指向的地址.


    如果设置了direction flag, 那么edi会在该指令执行后减小, 
    如果没有设置direction flag, 那么edi的值会增加.

     

    REP可以是任何字符传指令(CMPS, LODS, MOVS, SCAS, STOS)的前缀. 
    REP能够引发其后的字符串指令被重复, 只要ecx的值不为0, 重复就会继续. 
    每一次字符串指令执行后, ecx的值都会减小.

    stos((store into String),意思是把eax的内容拷贝到目的地址。
    用法:stos dst,dst是一个目的地址,例如:stos dword ptr es:[edi]。dword ptr前缀告诉stos,一次拷贝双字(4个字节)的数据到目的地址。为什么一次非要拷贝双字呢?这和eax寄存器有关,到底神马关系,慢慢道来。。
    执行stos之前必须往eax(32为寄存器)放入要拷贝的数据。上图中,eax的内容是cccccccc,不用说都明白int3中断。
    这段代码是初始化堆栈和分配局部变量用的,往分配好的局部变量空间放入int3中断的原因是:防止该空间里的东东被意外执行。


    /************************************************************/

    想了想,没怎么明白,于是直接写了个函数,来加深一下印象:
    /************************************************************/
    #include <stdio.h>
    int main()
    {
     int i;
     int result=0;

     _asm{
      mov edi,edi
      mov edi,edi
     }

     for (i=0;i<20;++i)
      result+=2;
     return result;
    }
    /************************************************************/
    其中,
     _asm{
      mov edi,edi
      mov edi,edi
     }
    是没有任何作用的,只是为了让我们在反汇编时好定位代码的位置。

     

    然后用OD打开,找到我们的代码处:
    /************************************************************/


    /************************************************************/

    LEA: 目标地址传送指令: 将一个近地址指针写入到指定的寄存器。
    区别MOV传送指令:MOV传送的是地址所指的内容,而LEA只是地址。

    另外,在二进制中,0xCC 对应的就是汇编的:int 3指令(中断).

     
     
     
    ptr -- pointer (既指针)得缩写。
         汇编里面 ptr 是规定 的 字 (既保留字),是用来临时指定类型的。

      (可以理解为,ptr是临时的类型转换,相当于C语言中的强制类型转换)

    如 mov ax,bx ;  是把BX寄存器“里”的值赋予AX,由于二者都是寄存器,长度已定(word型),所以没有必要加“WORD”   
    mov ax,word ptr [bx];   是把内存地址等于“BX寄存器的值”的地方所存放的数据,赋予ax。由于只是给出一个内存地址,不知道希望赋予ax的,是byte还是word,所以可以用word明确指出;如果不用,既(mov ax, [bx];   )则在8086中是默认传递一个字,既两个字节给ax。

    总结,既有寄存器时可以,且一般不用ptr;没有时一定要用(防止当两个操作数的宽度不一样)。

     

    分类如下:


    (1)通过寄存器名指明要处理的数据的尺寸。(既有寄存器,可以不用ptr来限制了,系统会自动分析的)
    例如:
    下面的指令中,寄存器指明了指令进行的是字操作:
    mov ax,1
    mov bx,ds:[0]       这个的意思是段内的偏移地址是0,段地址是DS。详情请看本人其他日记
    mov ds,ax
    mov ds:[0],ax
    inc ax
    add ax,1000
    下面的指令中,寄存器指明了指令进行的是字节操作(因为是al):
    mov al,1
    mov al,bl
    mov al,ds:[0]
    mov ds:[0],al
    inc al
    add al,100
    (2)在没有寄存器名存在的情况下,既都是在内存,得用操作符 X ptr 指明内存单元的长度,X在汇编指令中可以为byte,word或者DWORD。要不然内存是片连续的区域,操作就乱了。
    例如:
    下面的指令中,用word ptr 指明了指令访问的内存单元是一个字单元:
    mov word ptr ds:[0],1
    inc word ptr [bx]
    inc word ptr ds:[0]
    add word ptr [bx],2
    下面的指令中,用byte ptr 指明了指令访问的内存单元是一个字节单元:
    mov byte ptr ds:[0],1
    inc byte ptr [bx]
    inc byte ptr ds:[0]
    add byte ptr [bx],2
       在没有寄存器参与的内存单元访问指令中,用word prt 或byte ptr 显性地指明所要访问的内存单元的长度是很必要的。否则,CPU无法得知所要访问的单元,还是字节单元。假如我们用Debug查看内存的结果如下:
    2000:1000 FF FF FF FF FF FF ......
    那么指令:
    mov ax,2000H
    mov ds,ax
    mov byte ptr [1000H],1
    将使内存中的内容变为:
    2000: 1000 01 FF FF FF FF FF ......
    而指令:
    mov ax,2000H
    mov ds,ax
    mov word ptr [1000H],1
    将使内存中的内容变为:
    2000:1000 01 00 FF FF FF FF ......
       这是因为 mov byte ptr [1000H],1访问的是地址为 ds:1000H 的字节单元,修改的是ds:1000H 单元的内容;而mov word ptr [1000H],1 访问的是地址为 ds:1000H 的字单元,修改的是 ds:1000H 和 ds:1001H 两个单元的内容。
    (3) 其他方法
       有些指令默认了访问的是字单元还是字节单元,比如:push [1000H] 就不用指明访问的是字单元还是字节单元,因为push指令只进行字操作。

     

    补充

    ptr也可以是是临时的类型转换,

    cmp word ptr[si],'#'
    是用si所指向的内存的连续两个字节与#比较
    要是改成
    cmp byte ptr[si],'#'
    那就是用si指向的那个存储单元的内容(一个字节)与#比较了

    jmp near ptr opd
    是无条件转移指令,转移到段内的标号opd所标识的位置(临时说明成近类型)
    若是
    jmp far ptr opd
    那就是转移到另外一个代码段的opd所标识的位置了(远类型)


        总结:

    不管用在什么位置,ptr的作用就是临时指定类型
    可以放在ptr前面的类型有byte(字节)、word(字)、dword(双字)、qword(四字)、tbyte(十字节)、far(远类型)和near(近类型)

     

    展开全文
  • 寄存器,寄存器是什么意思

    千次阅读 2021-07-28 06:43:33
    寄存器,寄存器是什么意思寄存器定义寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器...
  • 寄存器是什么 有什么作用

    千次阅读 2016-11-16 10:32:41
    寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。 寄存器的用途: 1.可将寄存器内的数据执行算术及逻辑运算。 2.存于寄存器内的地址可用来指向内存的某个位置,即...
  • EAX、ESP、EBP等寄存器作用

    千次阅读 2021-01-20 15:21:18
    一般寄存器:AX、BX、CX、DX AX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器 索引暂存器:SI、DI SI:来源索引暂存器,DI:目的索引暂存器 堆叠、基底暂存器:SP、BP SP:堆叠指标暂存器,BP:基底指标暂存器...
  • ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据。  状态寄存器中有些位是当前没有使用的,但在ARM将来版本中有可能使用这些位,因此用户程序不要使用这些位。  程序不能通过直接修改CPSR中T的控制位...
  • 寄存器分类及基本作用

    千次阅读 2020-08-15 13:58:50
    一般用于算数、逻辑运算以及与外设传送信息等 BX(基址寄存器) 常用作存放存储器地址 CX(计数器) 一般作为循环和串操作等朱令中的隐含计数器 DX(数据寄存器) 常用来存放双字长的数据的高16位,或存放外设端口...
  • DMA的寄存器介绍

    2020-11-13 02:49:26
     ZDMA控制寄存器主要用于设置DMA的通道。S3C44B0包括两个ZDMA控制寄存器:ZDCON0和ZDCON1,其含义如表1所示。  表1 ZDMA控制寄存器描述  (2)ZDMA初始源/目的地址和计数寄存器以及当前源/目的地址和计数器...
  • CS和IP寄存器作用及执行分析

    千次阅读 2021-04-21 21:23:13
    我们在刚开始学习汇编或者操作系统时,会被一些寄存器搞得晕头转向,可能是我比较笨吧,抽象能力比较差,对于CS和IP寄存器的概念是知道,但是不知道他们的作用。 CS和IP寄存器概念 书本上的解释如下: CS是代码段...
  • 几种常见的寄存器作用

    千次阅读 2020-03-24 21:59:48
    EDX、EAX、ECX、EBX寄存器作用 一般寄存器:AX、BX、CX、DX AX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器 索引暂存器:SI、DI SI:来源索引暂存器,DI:目的索引暂存器 堆叠、基底暂存器:SP、BP SP:堆...
  • 使用嵌入式hal构建用于移位寄存器的平台不可知驱动程序 什么有效 通过具有8个输出的串行输入并行输出移位寄存器控制输出 链接移位寄存器多达128个输出 去做 添加并行输出串行输入移位寄存器支持 例子 use shift_...
  • ICAP的配置寄存器

    2021-01-19 23:04:42
    ICAP必须从输入口写入20个字节用于启动多引导重配置。表描述了⒛个字节的含义。... 这两个寄存器用于设置外部BPIFash或SPIFash多引导起始地址。  (2) 命令寄存器(CMD)。  这个寄存器将允许FPGA进行多引导重启动。
  • 125K芯片3933寄存器配置工具,工程使用经验总结,直接出配置结果用于工程设计。
  • r0-r15寄存器作用

    千次阅读 2020-03-26 21:07:06
    在子程序调用之间,可以将 r0-r3 用于任何用途。 被调用函数在返回之前不必恢复 r0-r3。如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。 r4-r11 被用来存放函数的局部变量。如果被调用函数使用了...
  •  数码寄存器用于寄存一组二进制代码,广泛用于各类数字系统。  【例】 设计-个8位寄存器的VHDL程序,并使用MAX+p1us Ⅱ进行仿真。  仿真结果如图所示。  如图 8位寄存器REG的仿真图 :
  • 根据“ARM-thumb 过程调用标准”: r0-r3 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。...如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。...
  • 外设帧PF2主要用于CAN模块的控制寄存器。3个外设帧映射的地址空间如图所示,所有数字量I/O控制寄存器都映射到外设帧1映射的地址空间,表给出了GPIO控制寄存器的功能及其操作地址。  图 外设帧存储空间映射关系 ...
  • mpu9250寄存器手册

    2017-10-25 11:19:00
    mpu9250寄存器手册英文版,主要用于对mpu9250编程时对寄存器操作。
  • STM32新手入门-什么是寄存器

    千次阅读 多人点赞 2022-03-28 17:01:21
    存储器 Block0 内部区域功能划分 储存器 Block1 内部区域功能划分 储存器 Block2 内部区域功能划分 Block2 用于设计片内的外设,根据外设的总线速度不同,Block 被分成了 APB 和 AHB两部分,其中 APB 又被分为 APB1...
  • 寄存器到底是个什么东西?

    千次阅读 多人点赞 2019-11-16 17:18:38
    一. 什么是寄存器?什么是寄存器映射? 给有特定功能的内存单元取一个别名,这个别名就是我们常说的寄存器,取名的过程就叫寄存器映射。 你用define宏定义去操作的,其实就是最底层的内存地址,只不过我们操作的...
  • 汇编中各寄存器作用

    千次阅读 2020-09-29 01:03:22
    4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要...
  • 寄存器控制LED闪亮,用于了解寄存器控制
  • 什么是通用寄存器

    千次阅读 2021-12-24 16:57:02
    通用寄存器(General-Purpose Register)一般是指处理器最常使用的整数通用寄存器,可用于保存整数数据、地址等。8086处理器只有8个通用寄存器,数量有限。 8086 处理器的 8 个 16 位通用寄存器,分别被命名为:AX、...
  • 什么是段寄存器,数据寄存器

    千次阅读 2020-04-01 12:18:19
    寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。 2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边...
  • 而有的寄存器位只读,一般是用于STM32外设的某种工作状态的,由STM32硬件自动生效,程序通过读取那些寄存器位来判断外设的工作状态。 4、位功能说明 位功能是寄存器说明中最重要的部分,它详细介绍了寄存器每一个位...
  • c51特殊功能寄存器定义及作用

    千次阅读 2021-05-22 04:05:33
    “Hello world”程序 c51特殊功能寄存器定义与作用 在开始讲对C51单片机中特殊寄存器(SPR)的定义前,先简单介绍下我们在进行51单片机开发时经常看到的两个关键字“sbit”和”sfr“: sfr用于将一个单片机的特殊...
  •  数码寄存器用于寄存一组二进制代码,广泛用于各类数字系统。  【例】 设计-个8位寄存器的VHDL程序,并使用MAX+p1us Ⅱ进行仿真。  仿真结果如图所示。  如图 8位寄存器REG的仿真图 来源:ks99
  • 文章目录一、通用寄存器(GPR)二、EFLAGS寄存器(标志寄存器)三、指令指针寄存器(EIP)四、段寄存器(Segment Register) 通用寄存器(General Purpose Registers,32位,8个) 段寄存器(Segment Registers,16...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 241,789
精华内容 96,715
关键字:

寄存器的作用是用于