通用寄存器的主要用途

整理自:

http://www.cnblogs.com/huzhongzhong/archive/2011/08/01/2123743.html

http://nannan408.iteye.com/blog/982942


一、汇编语言中,为什么SI和DI不能同时使用汇编
其实你可以想一下,这两个寄存器的意思,SI源变址寄存器,DI目地变址寄存器,既然是变址寄存器,那么他们肯定是在某个地址的基础上进行偏移变化,由此我们就得出了需要基址寄存器。
你要是把这两个寄存器同时使用,那你地址变化的基址都没有,你该怎么变化呢?你在谁的基础上变化(也就是地址偏移)?
对于这些汇编中的规定,其实有时并不需要书上详细的介绍,我们都应该可以从中推导出这些规则,书上的那些介绍个人认为只是用来验证我们的推测的。或是对我们所掌握的知识的进行检测,用来说明我们所掌握的是对的!


1:数据寄存器,一般称之为通用寄存器组

     8086 有8个8位数据寄存器,
     这些8位寄存器可分别组成16位寄存器:
     AH&AL=AX:累加寄存器,常用于运算;
     BH&BL=BX:基址寄存器,常用于地址索引;
     CH&CL=CX:计数寄存器,常用于计数;
     DH&DL=DX:数据寄存器,常用于数据传递。

   2:地址寄存器/段地址寄存器

     为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:
     CS(Code Segment):代码段寄存器;
     DS(Data Segment):数据段寄存器;
     SS(Stack Segment):堆栈段寄存器;
     ES(Extra Segment):附加段寄存器。

3:特殊功能的寄存器

     IP(Instruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;
     SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。
     BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;
     SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;
     DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。
二、si,di使用的例子
SIDI是8086CPU中和bx功能相近的寄存器,SIDI不能够分成两个8位寄存器来使用.


通用寄存器的主要用途


寄存器的分类 寄存器

主 要 用 途

数据

 

寄存器

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  附加段寄存器
这张表用来参照。
(1)在8086CPU中只有这四个寄存器可以在[...]中进行内存单元的寻址。
比如,下面的指令都是正确的:
mov ax,[bx]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp]
mov ax,[bp+si]
mov ax,[bp+di]
而下面都是错误的:
mov ax,[cx]
mov ax,[ax]
mov ax,[dx]
mov ax,[ds]
(2).在[...]中,这四个寄存器可以单独出现,或者只能以四种组合出现:bx和si、bx和di、bp和si、bp和di。
比如下面都是正确的
mov ax,[bx]
mov ax,[si]
mov ax,[di]
mov ax,[bp]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp+si]
mpv ax,[bp+di]
mov ax,[bx+si+idata]
mov ax,[bx+si+idata]
mov ax,[bp+si+idata]
mov ax,[bp+di+idata]
下面就是错误的
mov ax,[bx+bp]
mov ax,[si+di]
(3)只要在[....]中使用寄存器bp,而指令汇总没有显示给出段地址,段地址就默认在ss中。 比如下面的指令。
mov ax,[bp] 含义:(ax)=((ss)*16+(bp))
mov ax,[bp+idata] 含义:(ax)=((ss)*16+(bp)+idata)
mov ax,[bp+si] 含义:(ax)=((ss)*16+(bp)+(si))
mov ax,[bp+si+idata] 含义:(ax)=((ss)*16+(bp)+(si)+idata)


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值