寄存器与七种寻址方式

寄存器与七种寻址方式

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

一、寄存器

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


相关推荐

  • 只通过com.alibaba.fastjson.JSONArray实现okHttp下String转换JSONArray

    只通过com.alibaba.fastjson.JSONArray实现okHttp下String转换JSONArray我的Android不能导入常见的那六个包,会严重报错。我改了很久很久还是不能解决错误,也就不能使用net.sf包中的JSONArray直接使用newJSONArray(str)。给像我一样不能导入包的同学介绍一种方法importcom.alibaba.fastjson.JSONArray;importcom.alibaba.fastjson.JSONObject;Stri…

    2022年6月20日
  • PHP+644是什么,多多自走棋644什么意思

    PHP+644是什么,多多自走棋644什么意思本次给大家带来的是多多自走棋的644相关介绍,很多玩家都不清楚644是什么,这里给大家进行解释,并且会介绍644阵容是什么,应该怎么应对,希望能帮助到各位感兴趣的玩家~多多自走棋644是什么什么是644新版本小伙伴们说的最多的就是644,这套阵容如何无敌,如何变态,如何无解等等。要如何针对与反制644就要先从了解他开始,644就是由6洞洞+4冰川+4萨满三个羁绊效果组合而成。从羁绊拼凑可…

    2022年6月22日
  • NVIC寄存器组

    NVIC寄存器组在STM32中用到了Cortex-M3定义的三组寄存器,有关这三组寄存器的说明不在STM32的技术手册中,需要参考ARM公司发布的Cortex-M3TechnicalReferenceManual(r2p0)。在STM32的固件库中定义了三个结构体与这三个寄存器组相对应,这三个结构体与ARM手册中寄存器的对应关系如下: 一、NVIC寄存器组STM32的固件库

    2022年5月12日
  • pythonrequests代理ip_python使用requests模块使用ip代理池

    pythonrequests代理ip_python使用requests模块使用ip代理池importjsonimporttelnetlibimportrequestsimportrandom#代理ip列表proxy_url=”https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list”#写入可用ip代理池文件路径ip_pool_file=”verified_proxies.json”#用…

    2022年5月26日
  • OutputStreamWriter_input用法

    OutputStreamWriter_input用法InputStreamReader和OutputStreamWriter类用法简介。一、InputStreamReader类InputStreamReader将字节流转换为字符流。是字节流通向字符流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。构造方法:InputStreamReaderisr=newInputStreamRead…

    2022年9月26日
  • 大数据ETL详解

    大数据ETL详解

    2021年10月28日

发表回复

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

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