寄存器与七种寻址方式

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]

关键字:寄存器与  寻址方式 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492284.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:单片机的几种寻址方式
下一篇:直接寻址、间接寻址、立即寻址

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430F149按键中断寄存器配置
  P1IFG = 0X00;   //中断标志清零    P2DIR = 0XFF;  P2OUT = 0XFF;  _EINT();} #pragma vector = PORT1_VECTOR__interrupt void PORT1_ISR(void){  __delay_cycles(50000);  if((P1IN&0X02) == 0)    P2OUT = ~P2OUT;  __delay_cycles(50000);}其中,配置P1端口的中断时要用到的寄存器
发表于 2020-03-17
msp430寄存器地址与宏定义位置
这里以gpio代码为例说明如何在代码库与user guide中查看寄存器地址。#include <msp430f6638.h>/* main.c */int main(void) {    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer    P2DIR |= BIT7;    int sgn0=-1;    long index = 0;    long time_unit = 25;//ms    while(1){   
发表于 2020-03-17
msp430寄存器地址与宏定义位置
命令行读写i2c寄存器操作
写命令格式:寄存器地址 长度  数据读命令格式:# echo “寄存器地址” > getreg# cat getreg1.使能寄存器# adb shell "echo "0x01,0x01,{0xff}" > /sys/bus/i2c/devices/1-20/setreg"2.禁掉寄存器# adb shell "echo "0x01,0x01,{0x00}” > /sys/bus/i2c/devices/1-20/setreg" 3.读寄存器# adb shell "echo "0x01"
发表于 2020-03-15
PIC头文件——寄存器位地址定义代码解析
编译工具:MPLAB X IDE v4.15单片机型号:PIC16F1938MPLAB开发环境中,包含各种PIC系列单片机的头文件,我在理解头文件中关于寄存器位地址定义时绕了些弯路,所以特意写出来加强记忆。以LATA寄存器为例:在pic16f1938.h头文件中,关于LATA寄存器的定义如下// Register: LATAvolatile unsigned char           LATA                @ 0x10C;// bit and bitfield
发表于 2020-03-14
任务3:直接应用寄存器点亮LED
本系列教程以AVR单片机为对象,介绍单片机的快速开发方法。参考教材:《单片机技术及应用项目教程》 栾秋平 电子工业出版社 2019.6 第1版本文介绍直接应用寄存器点亮LED的方法。一、单片机控制LED发光的基本方法二、应用PORTC寄存器控制LED闪烁//加入包含文件#include "../include.h" //定义系统常量 //定义全局变量 //主程序int main(void){ //定义局部变量 //目标板初始化,该函数会自动初始化相应的外设文件 TARGET_Init(); //初始化全局变量 //在上电时,执行的相应操作 DDRC = 0xFF
发表于 2020-03-13
任务3:直接应用寄存器点亮LED
单片机C51汇编指令之寻址方式学习心得
寻址方式,后面应该会继续更新。如有错误,望大家指出。
发表于 2020-03-20
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved