(转)汇编中各寄存器的作用

反汇编里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)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C/Cplusplus学习笔记)