概述
反汇编里rep stos dword ptr es:[edi] 是做什么的?
参考资料:1.http://www.cnblogs.com/awpatp/archive/2012/08/05/2623628.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这个寄存器里。
寄存器
寄存器定义:寄存器是中央处理器内的组成部份。 寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、 数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存 器(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)
最后
以上就是专一蜗牛为你收集整理的(转)汇编中各寄存器的作用的全部内容,希望文章能够帮你解决(转)汇编中各寄存器的作用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复