汇编语言寻址方式和寄存器分类

寻址方式和寄存器分类


1.寻址方式:

  • 1.1 .立即寻址:源操作数为立即数(常数)的寻址方式。
  • 如,MOV AX ,10H(AX为目的操作数、10H为源操作数)
  • 注意:目的操作数不能为立即数。

  • 1.2 .寄存器寻址:源操作数和目的操作数都可以是寄存器的寻址方式。
  • 如,
  •         MOV AL ,BH——两者都是寄存器
  •         MOV AX,1000H——目的操作数是寄存器
  •         MOV VAR1,AX——源操作数是寄存器
  • 指令中可以引用的寄存器及其符号名称如下:
     32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。

      8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;

      16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;

  •  

  • 1.3 .直接寻址:指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式
  • 如,MOV AX [1000H] 或 MOV AX ,VAR1
    • MOV AX, 1234H MOV AX, [1234H] ;前者是立即寻址,后者是直接寻址 
    • MOV AX, VARW MOV AX, [VARW] ;两者是等效的,均为直接寻址

      由于数据段的段寄存器默认为DS,如果要指定访问其它段内的数据,可在指令中用段前缀的方式显式地书写出来。
      下面指令的目标操作数就是带有段前缀的直接寻址方式。

      MOV ES:[1000H], AX
  • 假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?

            访问数据段的段寄存器是DS,所以,用DS的值和偏移量1234H相加,得存储单元的物理地址:21234H;取单元21234H的值5213H,并按“高高低低”的原则存入寄存器BX中。

    所以,在执行该指令后,BX的值就为5213H。

  • 1.4 .寄存器间接寻址:操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式
  • 若有效地址用SI、DI和BX等之一来指定,则其默认的段寄存器为DS;

    若有效地址用BP来指定,则其默认的段寄存器为SS(即:堆栈段)。

  • 如何计算物理地址: 
  • 例:        假设有指令:MOV BX,[DI],在执行时,(DS)=1000H,(DI)=2345H,存储单元12345H的内容是4354H。问执行指令后,BX的值是什么?

            寄存器DI的值不是操作数,而是操作数的地址。该操作数的物理地址应由DS和DI的值形成,即: 物理地址=(DS)*16+DI=1000H*16+2345H=12345H。 

    所以,该指令的执行效果是:把从物理地址为12345H开始的一个字的值传送给BX。

    当处理器为16位时,一个字为两个字节,即BX中内容为54H

  • 1.5 .寄存器相对寻址 :操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和
  • 指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。

    例:        假设指令:MOV BX, [SI+100H],在执行它时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是什么?

            源操作数的有效地址EA为: EA=(SI)+100H=2345H+100H=2445H,该操作数的物理地址应由DS和EA的值形成,即:PA=(DS)*16+EA=1000H*16+2445H=12445H。

    所以,该指令的执行效果是:把从物理地址为12445H开始的一个字的值传送给BX

  • 1.6 .基址变址寻址:操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)一个变址寄存器(SI、DI)的内容之和。 
  • 例:        假设指令:MOV BX, [BX+SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。问该指令执行后,BX的值是什么?

            源操作数的有效地址EA为:EA=(BX)+(SI)=2100H+0011H=2111H,该操作数的物理地址应由DS和EA的值形成,即:PA=(DS)*16+EA=1000H*16+2111H=12111H,所以,该指令的执行效果是:把从物理地址为12111H开始的一个字的值传送给BX

  • 1.7 .相对基址变址寻址:操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。 
  • 例:        假设指令:MOV AX, [BX+SI+200H],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0010H,内存单元12310H的内容为1234H。问该指令执行后,AX的值是什么?

            源操作数的有效地址EA为:EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H,该操作数的物理地址应由DS和EA的值形成,即:PA=(DS)*16+EA=1000H*16+2310H=12310H

    所以,该指令的执行效果是:把从物理地址为12310H开始的一个字的值传送给AX。

  • 相对基址加变址寻址方式有多种等价的书写方式,下面的书写格式都是正确的,并且其寻址含义也是一致的。

    MOV AX, [BX+SI+1000H]   MOV AX, 1000H[BX+SI]

    MOV AX, 1000H[BX][SI]    MOV AX, 1000H[SI][BX]

    但书写格式BX [1000+SI]和SI[1000H+BX]等是错误的,即所用寄存器不能在“[“,”]”之外,该限制对寄存器相对寻址方式的书写也同样起作用。

2.寄存器分类:

内部寄存器含14个16位寄存器,按功能可分为三类:8个通用寄存器、4个段寄存器、2个控制寄存器。

通用寄存器:包括(数据寄存器、地址指针寄存器、变址寄存器)

1.数据寄存器(AX,BX,CX,DX)可以分别拆开两个8位寄存器,例:AX---AH和AL

     AX:累加器,所有I/O指令都通过AX与接口传送信息,中间运算结果也多放于AX中。AX中的十六位数全都是存放的数据。

     BX:基址寄存器,在间接寻址中用于存放基地址。BX中的十六位数可能是运算数据也可能是数据存放的地址

     CX:计数寄存器,用于在循环或事操作指令中存放计数值。

     DX:数据寄存器,在间接寻址的I/O指令中存放I/O端口地址;在32位乘除法运算时,存放高16位数

如果是8位寄存器中,只会是运算的数据,绝不可能是地址,因为16体系结构CPU,地址最短也是16位的

2.地址指针寄存器(SP,BP)

      SP:堆栈指针寄存器,其内容位栈顶的偏移地址。只要有堆栈存在,SP一定被专用

      BP:基址指针寄存器,常用于在访问内存时存放内存单元的偏移地址。

         BX表示所寻找的数据在数据段,BP表示数据在堆栈段

3.变址寄存器(SI,DI)

     SI:源变址寄存器

     DI:目标变址寄存器

这两个可以是运算的数据也可以是存放数据的地址

变址寄存器在指令中常用于存放数据在内存中的地址

控制寄存器

IP:指令指针寄存器,其内容为下一条要取的指令的偏移地址。

FLAGS:标志寄存器,存放运算结果的特征

   6个状态标志位(CF,SF,AF,PF,OF,ZF)

CF:进位标志位。加减法运算时,若最高位有进借位则CF=1

OF:溢出标志位,当算数运算的结果超出了有符号数的可表达范围时,OF=1

ZF:零标志位,当运算结果为零时ZF=1

SF:符号标志位,当运算结果的最高数为1时,SF=1

PF:奇偶标志位,运算结果的低8位中“1”的个数为偶数时PF=1

AF:辅助进位标志位,加减操作中,若Bit3向Bit4有进位(错位),AF=1

  3个控制标志位(IF,TF,DF),表示处理器目前的工作状态的

TF:陷阱标志位,也叫跟踪标志位。TF=1时,使CPU处于单步执行指令的工作方式

IF:中断允许编制为。IF=1使CPU可以响应可屏蔽中断请求

DF:方向标志位。在数据事操作时群顶操作的方向。

段寄存器

作用:用来存放相应逻辑段的段基地址

代码段------存放指令代码         CS代码段寄存器,存放代码段的段基地址

数据段------存放操作的数据      DS数据段寄存器,存放数据段的段基地址

附加段------存放操作的数据      ES附加段寄存器,存放数据段的段基地址

堆栈段------存放暂时不用但需要保存的数据    SS堆栈段寄存器,存放堆栈段的段基地址

  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

try again!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值