寄存器与七种寻址方式

寄存器与七种寻址方式

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

一、寄存器

总共同拥有14个16位寄存器,8个8位寄存器

 

通用寄存器:

  数据寄存器:

  AH(8位)  AL(8位)  AX(16位)   (AX和AL又称累加器)

  BH(8位)  BL(8位)  BX(16位)   (BX又称基址寄存器,唯一作为存储器指针使用寄存器)  

  CH(8位)  CL(8位)  CX(16位)   (CX用于字符串操作,控制循环的次数,CL用于移位)

  DH(8位)  DL(8位)  DX(16位)   (DX一般用来做32位的乘除法时存放被除数或者保留余数)

 

  指针寄存器:

  SP 堆栈指针 (存放栈顶地址)

  BP 基址指针 (存放堆栈基址偏移)

 

  变址寄存器:主要用于存放某个存储单元地址的偏移,或某组存储单元開始地址的偏移,

  即作为存储器(短)指针使用。作为通用寄存器,它们能够保存16位算术逻辑运算中的操

  作数和运算结果,有时运算结果就是须要的存储单元地址的偏移.

 

  SI 源地址  (源变址寄存器)

  DI 目的地址 (目的变址寄存器)

  

控制寄存器:

  IP 指令指针

  FLAG 标志寄存器

   ① 进位标志 CF,记录运算时最高有效位产生的进位值。

   ② 符号标志 SF,记录运算结果的符号。结果为负时置1,否则置0。

   ③ 零标志  ZF,运算结果为0时ZF位置1,否则置0。

   ④ 溢出标志 OF,在运算过程中,如操作数超出了机器可表示数的范围称为溢出。溢出时OF位置1,否则置0。

   ⑤ 辅助进位标志 AF,记录运算时第3位(半个字节)产生的进位值。

   ⑥ 奇偶标志 PF,用来为机器中传送信息时可能产生的代码出错情况提供检验条件。当结果操作数中1的个数为偶数时置1,否则置0。

 

段寄存器

  CS 代码段  IP

  DS 数据段  

  SS 堆栈段  SP BP

  ES 附加段

 

二、七种寻址方式:

1、马上寻址方式:

操作数就包括在指令中。作为指令的一部分,跟在操作码后存放在代码段。

这样的操作数成为马上数。马上数能够是8位的,也能够是16位的。

比如:

    指令: MOV AX,1234H

      则: AX = 1234H

 

2、寄存器寻址方式:

操作数在CPU内部的寄存器中,指令指定寄存器号。

对于16位操作数,寄存器能够是:AX、BX、CX、DX、SI、DI、SP和BP等。

对于8位操作数,寄存器能够是AL 、AH、BL、BH、CL、CH、DL、DH。

这样的寻址方式因为操作数就在寄存器中,不须要訪问存储器来取得操作数

因而能够取得较高的运算数度。

 

3、直接寻址方式:

操作数在寄存器中,指令直接包括有操作数的有效地址(偏移地址)

注:操作数一般存放在数据段

所以操作数的地址由DS加上指令中直接给出的16位偏移得到。假设採用

段超越前缀,则操作数也可含在数据段外的其它段中。

比如:

MOV AX,[8054]

如(DS) = 2000H,

则运行结果为(AX) = 3050H

(物理地址=20000+8054=28054H)

28054H里的内容为3050H

 

在汇编语言指令中,能够用符号地址取代数值地址

如:MOV AX,VALUE

此时VALUE为存放操作数单元的符号地址。

如写成:MOV AX,[VALUE]也是能够的,两者是等效的。

如VALUE在附加段中,则应指定段超越前缀例如以下:

MOV AX,ES:VALUE 或 MOV AX,ES:[VALUE]

 

4、寄存器间接寻址方式:

操作数在寄存器中,操作数有效地址在SI、DI、BX、BP

这四个寄存器之中的一个中。在普通情况下,假设有效地址在

SI、DI和BX中,则以DS段寄存器中的内容为段值。假设

有效地址在BP中,则以SS段寄存器中的内容为段值

比如:

MOV AX,[SI]

假设(DS) = 5000H (SI) = 1234H

则物理地址 =  50000 + 1234 = 51234H

51234H地址中的内容为:6789H

运行该指令后,(AX) = 6789H

 

5、寄存器相对寻址方式:

操作数在存储器中,操作数的有效地址是一个基址寄存器(BX、BP)

或变址寄存器(SI、DI)的内容加上指令中给定的8位或16位位移量之和

 

    BX  8位 位移量

EA(有效地址) =  BP  + 

    SI  16位 位移量

    DI

在普通情况下,假设SI、DI、或BX中的内容作为有效地址的一部分,那么

引用的段寄存器是DS;假设BP中的内容作为有效地址的一部分,那么引用的

段寄存器是SS。

 

物理地址 = 16d × (DS) + (BX) + 8

           或(SI)或16位位移量

           或(DI)

物理地址 = 16d × (SS) + (BP) + 8位位移量

                       或16位位移量

在指令中给定的8位或16位位移量採用补码形式表示。在计算有效地址时,如

位移量是8位,则被带符号扩展成16位。

比如:

MOV AX,[DI+1223H]

如果,(DS) = 5000H,(DI) = 3678H

则物理地址 = 50000 + 3678 + 1233 = 5489BH

5489BH地址中的内容:55AAH

运行该指令后AX = 55AAH

以下指令中,源操作数採用寄存器相对寻址,引用的段寄存器是SS: MOV BX,[BP-4]

以下指令中,目的操作数採用寄存器相对寻址,引用的段寄存器是ES: MOV ES:[BX+5],AL

指令:MOV AX,[SI+3]与MOV AX,3[SI]是等价的

 

6、基址加变址寻址方式:

操作数在寄存器中,操作数的有效地址由:

基址寄存器之中的一个的内容与变址寄存器之中的一个的内容相加

   BX   SI

即: EA =    + 

   BP   DI

在普通情况下,假设BP之内容作为有效地址的一部分,则以SS之内容为段值,否则已DS

为段值。

比如:

MOV AX,[BX][DI]

如:(DS)=2100H,

   (BX)=0158H,

   (DI)=10A5H

则EA=0158 + 10A5 = 11FD

物理地址=21000 + 11FD = 221FDH

221FDH地址中的内容:1234H

运行该指令后AX = 1234H

 

以下指令中,目的操作数採用基址加变址寻址,

引用的段寄存器是DS: MOV DS:[BP+SI],AL

 

以下指令中,源操作数採用基址加变址寻址,

引用的段寄存器ES: MOV AX,ES:[BX+SI]

 

这样的寻址方式使用与数组或表格处理。用基址寄存器存放数组首地址,而用变地寄存器

来定位数组中的各元素,或反之。因为两个寄存器都可改变,所以能更加灵活地訪问数

组或表格中的元素。

以下的两种表示方法是等价的:

MOV AX,[BX+DI]

MOV AX,[DI][BX]

 

7、相对基址加变址寻址方式:

操作数在存储器中,操作数的有效地址因为基址寄存器之中的一个的内容与变址寄存器之中的一个的

内容及指令中给定的8位或16位位移量相加得到。

         BX    SI    8位

即: EA =     +     +      位移量

   BP    DI    16位

在普通情况下,假设BP中的内容作为有效地址的一部分,则以SS段寄存器中的内容为段

值,否则以DS段寄存器中的内容为段值。

在指令中给定的8位或16位位移量採用补码形式表示。

在计算有效地址时,假设位移量是8位,那么被带符号扩展成16位。

当所得的有效地址操作FFFFH时,就取其64K的模

比如:

MOV AX,[BX+DI-2]

如果,(DS) = 5000H, (BX) = 1223H, DI = 54H, (51275) = 54H, (51276) = 76H

物理地址= 50000 + 1223 + 0054 + FFFE(-2 各位取反末位加一) = 51275H

运行该指令后 (AX) = 7654H

 

相对基址加变址这样的寻址方式的表示方法多种多样,下面四种方法均是等价的:

MOV AX,[BX+DI+1234H], MOV AX,1234H[BX][DI]

MOV AX 1234H[BX+DI],  MOV AX,1234H[DI][BX]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118537.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android游戏引擎_开源可视化规则引擎

    Android游戏引擎_开源可视化规则引擎1、AngleAngle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGLES技术开发。该引擎全部用Java代码编写,并且可以根据自己的需要替换里面的实现,缺陷在于文档不足,而且下载的代码中仅仅包含有少量的示例教程。最低运行环境要求不详。项目地址:http://code.google.com/p/angle/2、Rokonrokon是一

    2022年9月19日
    1
  • CentOs7查看系统已有的用户和用户组「建议收藏」

    CentOs7查看系统已有的用户和用户组「建议收藏」查看用户:cut-d:-f1/etc/passwd 查看用户组:cut-d:-f1/etc/group 删除xiaoluo这个用户:userdel-rxiaoluo

    2022年10月19日
    3
  • git添加用户名和邮箱「建议收藏」

    git添加用户名和邮箱「建议收藏」想了解更多数据结构以及算法题,可以关注微信公众号“数据结构和算法”,每天一题为你精彩解答。也可以扫描下面的二维码关注

    2025年8月28日
    4
  • AndroidJNI 通过C++调用JAVA

    1. JNIEnv对象    对于本地函数   JNIEXPORT void JNICALL Java_video1_TestNative_sayHello(JNIEnv * env, jobject obj)   {        cout   }           JNIEnv类型代表Java环境。通过这个JNIEnv*指针,就可以对Java端的代码进行操作。如,创建Java类得对象,调用J

    2022年3月11日
    42
  • maven报错was cached in the local repository, resolution will not be reattempted until the update inter

    maven报错was cached in the local repository, resolution will not be reattempted until the update inter

    2021年5月13日
    255
  • iterator迭代器详解_c++迭代器iterator

    iterator迭代器详解_c++迭代器iterator迭代器 Iterator动机模式定义实例结构要点总结笔记动机在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象.我们希望在不暴露其内部结构地同时.可以让外部客户代码透明地访问其中包含地元素;同时这种”透明遍历”也为”同一种算法在多种集合对象上进行操作”提供了可能.使用面向对象技术将这种便利机制抽象为”迭代对象”为”应对变化中地集合对象”提供了一种优雅地方式模式定义提供了一种方法顺序访问一个聚合对象中地各个元素,而又不暴露(稳定)该对象地内部表示.实例结构要点总结迭代抽象

    2022年8月11日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号