历史上的今天
返回首页

历史上的今天

今天是:2025年03月20日(星期四)

正在发生

2020年03月20日 | 寄存器与七种寻址方式

2020-03-20 来源:eefocus

一、寄存器


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

推荐阅读

史海拾趣

CST Master Electronic Co Ltd公司的发展小趣事

随着市场的不断发展,CST Master意识到只有不断创新才能在激烈的竞争中立足。公司投入大量资源用于研发,积极探索新技术、新工艺和新材料。经过多次试验和失败,团队终于取得了一项重要的技术突破,推出了一款具有行业领先水平的新产品,赢得了客户的广泛认可。

台湾富晶(FORTUNE)公司的发展小趣事
确保电源供电稳定,无电压波动或断电现象。
ETA Electric Industry Co Ltd公司的发展小趣事

在市场不断拓展的同时,ETA Electric Industry Co Ltd非常注重产品质量管理。他们引入了国际先进的质量管理体系,并严格执行每一项质量控制标准。公司还设立了专门的质量检测部门,对每一批出厂的产品进行严格把关。这种对质量的极致追求,赢得了客户的广泛认可和信赖。

Data Device Corporation公司的发展小趣事

在电子行业中,竞争日益激烈,DDC也面临着诸多挑战。然而,DDC始终保持着清醒的头脑和坚定的信念,积极应对挑战并寻找机遇。通过不断优化产品结构、提高生产效率、降低成本等措施,DDC不断提高自身的竞争力。同时,DDC还积极关注行业发展趋势和市场变化,及时调整战略方向,确保公司能够在激烈的竞争中立于不败之地。

请注意,这些故事是基于DDC公司的发展历程和事实进行的概述,具体的细节和情节可能需要根据实际情况进行补充和调整。

Gigavac LLC公司的发展小趣事

Data Device Corporation(DDC)成立于1964年,总部位于美国纽约。在创立之初,DDC就专注于为军事和商业航空领域提供高质量的数据接口产品。凭借其卓越的技术实力和对市场的敏锐洞察,DDC迅速在电子行业中崭露头角。通过与各大军事机构和航空公司的紧密合作,DDC不断推出符合市场需求的新产品,逐步奠定了自己在行业中的领先地位。

Dexter Research Center Inc公司的发展小趣事

Dexter Research Center Inc.(以下简称Dexter)最初是由一群热衷于电子科技研究的科学家和工程师组成的实验室。他们热衷于探索新的传感器技术,并在实验室环境下取得了多项技术突破。然而,技术的真正价值在于其商业化应用。Dexter意识到这一点,决定将研究成果转化为实际产品,推向市场。经过数年的努力,Dexter成功开发出了一系列高性能、高精度的传感器产品,并受到了市场的热烈欢迎。

问答坊 | AI 解惑

中国汽车电子:锻造核心竞争力1

据中国第一汽车集团公司技术中心(简称一汽技术中心)相关负责人介绍,一汽技术中心主要从事整车、车身、底盘、发动机、零部件等方面的设计、研究和试验检测,在这些方面有着丰富的经验。  这位负责人告诉记者,一汽产品家族形成了5吨-9吨的长头系 ...…

查看全部问答>

功放电路图

JBL专业功放图纸…

查看全部问答>

隔离开关的功能

隔离开关(刀闸)的用途主要是:  (1)用于隔离电源,将高压检修设备与带电设备断开,使其间有一明显可看见的断开点。   (2)隔离开关与断路器配合,按系统运行方式的需要进行倒闸操作,以改变系统运行接线方式。   (3)用以接通或断开小电流电 ...…

查看全部问答>

用MPLAB 编译程序失败了

用MPLAB编译出现下面提示 Clean: Deleting intermediary and output files. Clean: Deleted file \"F:\\pic\\pbq.mcs\". Clean: Done. Executing: \"f:\\\" /q /p16F876A \"pdq.asm\" /l\"pdq.lst\" /e\"pdq.err\" Could not spawn langauge t ...…

查看全部问答>

单片机中的静态RAM 掉电后其数据是否会丢失? 急急

单片机中的静态RAM 掉电后其数据是否会丢失?…

查看全部问答>

STM32103vet6不能读RAM问题?

现象: Connecting ... - Connecting via USB to J-Link device 0 - J-Link firmware: V1.20 (J-Link ARM V8 compiled Dec  1 2009 11:42:48) - JTAG speed: 200 kHz (Auto) - Initializing CPU core (Init sequence) ... ...…

查看全部问答>

高手快来帮帮我吧

本帖最后由 dontium 于 2015-1-23 13:40 编辑 高手快来帮帮我吧,谢谢了!   方正电脑可以识别防真器吗?? 在其他的电脑上可以连通,但是我的电脑就不行。请问:是不是方正电脑不识别防真器吗?通过该那里就可以通过吗??    …

查看全部问答>

急问:为什么我的430总也进入不了LPM3?

我做了一个小程序,在while(1)中最后一句写下如下语句: _BIS_SR(SCG1+SCG0+CPUOFF+GIE); 我认为他应该休眠了,但是用三用表一量,电流在7.3 mA,显然电流太高。于是我连上仿真器一句一句运行,发现CPU在执行完_BIS_SR(SCG1+SCG0+CPUOFF+GIE); 后 ...…

查看全部问答>

跪求:我不相信谁能读懂2812控制电机的一段程序,给出源代码

此程序是控制电机3相通电的开关程序 temp=srd_active[0]+(srd_active[1]*2)+(srd_active[2]*4)+(work_mode*8)+(pwm_mode*16); *ptrACTIVE=temp; 其中srd_active[0]=0 srd_active[1]=0 srd_active[2]=0 work_mode=1 pwm_mode=1 *ptrACTIVE不知道是什 ...…

查看全部问答>