寄存器与七种寻址方式

寄存器与七种寻址方式

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

一、寄存器

总共同拥有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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql更改表名语句命令

    mysql更改表名语句命令renametabletablename1totablename2;

    2022年6月1日
    32
  • Lamp架构_lamp部署

    Lamp架构_lamp部署lamp(Web应用软件组合)Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。随着开源潮流的蓬勃发展,开放源代码的LAMP已经与J2EE和.Net商业软件形成三足鼎立之势,并且该软件开发的项目在软件方…

    2022年10月16日
    2
  • 【Java 8 新特性】Java LocalDate 转 Date

    【Java 8 新特性】Java LocalDate 转 DateJavaLocalDate转Date1.使用LocalDate.atTime2.使用LocalDate.atStartOfDay3.使用LocalDateTime.of4.使用Timestamp.valueOf完整示例参考文献在这一页,我们将提供如何将java.time.LocalDate转换成java.util.Date。LocalDate表示一个格式为yyyy-MM-dd的日期,如2019-05-08。我们可以使用以下方法和构造函数来创建一个Date对象。1.Date.f

    2022年10月4日
    2
  • Java基础测试「建议收藏」

    Java基础测试「建议收藏」Java测试 1.概述Java中标示符是什么? 一、不能以数字开头,由字母、下划线、美元符号组成。二、不能把java关键字和保留字作为标识符。三、标识符没有长度限制。四、标识符对大小写敏感。  2.Java中运算符有哪些? java中的运算符可以分为以下几种类型1.算术运算符      (+,-,*,/,%)2.比较(关系)算符  (>,&l…

    2022年7月8日
    31
  • DbVisualizer解决中文乱码问题

    DbVisualizer解决中文乱码问题DbVisualizer解决中文乱码问题

    2022年4月23日
    730
  • 动态规划:最长上升子序列(二分算法 nlogn)「建议收藏」

    动态规划:最长上升子序列(二分算法 nlogn)「建议收藏」解题心得:1、在数据量比较大的时候n^2会明显超时,所以可以使用nlogn的算法,此算法少了双重循环,用的lower_bound(二分法)。2、lis中的数字并没有意义,仅仅是找到最小点lis[0]和最大点lis[len],其中,在大于lis[len]时len++,在小于lis[len]时可以将arr[i]在lis中的数进行替换掉。所以此算法主要是在不停的找最合适的起点和最合适的终点。

    2022年6月11日
    36

发表回复

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

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