寄存器与七种寻址方式

寄存器与七种寻址方式

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

一、寄存器

总共同拥有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]

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • jboss版本查询_趣步2.0.7版本下载

    jboss版本查询_趣步2.0.7版本下载JBoss在2006年被RedHat收购。在各种J2EE应用服务器中,JBoss是最受欢迎而且功能最为强大的应用服务器。不过JBoss从8.0开始改名为WildFly,这个新名称在我看来似乎并不朗朗上口。在折腾JavaEE的配置时,新增一个Server,发现JBoss最多只到JBossv5.0,官网上明明已经更新到7.1了,为何这里只显示这么古老的版本,而且我用的是Eclipse

  • 一个普通Android程序员的2018总结2019计划

    一个普通Android程序员的2018总结2019计划承接去年总结:一个普通Android程序员的20182018:总结这一年继续分三个方面吧:职场篇:这一年发生了很多事,上家公司团队经营问题,最终结果是团队解散,期间发生一系列事情,参照一个普通一个Android程序员的心酸历程(2018.5.1)。然后修整两个月,找到了现在这家公司,公司目前规模不大,但各方面管理和上家公司天壤之别,至少目前我工作过的公司里面,算是最好的了,工资不是很高,…

  • java 网页提示被阻止怎么办,应用程序已被java安全阻止怎么办

    java 网页提示被阻止怎么办,应用程序已被java安全阻止怎么办我们经常会通过浏览器来浏览各种网页,然而有时候会遇到各种提示,例如就有不少具体步骤如下:1、完成JAVA版本更新,然后刷新有问题的网页页面,以排除JAVA版本问题引起JAVA安全阻止;2、从开始菜单中打开控制面板,我们需要进入控制面板来修改相应的配置;3、进入控制面板后,在控制面板中找到JAVA选项,如果找不到可将查看方式切换到大图标或图标即可;4、在JAVA控制面板中打开安全选项,并找到例外站点…

  • 推荐几个代码自动生成器,神器!!!「建议收藏」

    20个代码生成框架老的代码生成器的地址:https://www.cnblogs.com/skyme/archive/2011/12/22/2297592.html以下是大家推荐的最近很火爆的代码生成器神器。如果有更好的希望大家多多留言,我会及时补充上去。————————-更新补充———————————…

  • nginx重启命令windows(nginx前台启动命令)

    nginx-sreload:修改配置后重新加载生效nginx-sreopen:重新打开日志文件nginx-t-c/path/to/nginx.conf测试nginx配置文件是否正确关闭nginx:nginx-sstop:快速停止nginxquit:完整有序的停止nginx其他的停止nginx方式:ps-ef|grepn…

  • java voliate关键字_java中voliate关键字有什么用?

    java voliate关键字_java中voliate关键字有什么用?1、保证内存可见性内存可见性,即线程A对volatile变量的修改,其他线程获取的volatile变量都是最新的。说到内存可见性就必须要提到Java的内存模型,如下图所示:如上图所示,所有线程的共享变量都存储在主内存中,每一个线程都有一个独有的工作内存,每个线程不直接操作在主内存中的变量,而是将主内存上变量的副本放进自己的工作内存中,只操作工作内存中的数据。当修改完毕后,再把修改后的结果放回到主内…

发表回复

您的电子邮箱地址不会被公开。

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