发布时间:2025-12-10 11:32:39 浏览次数:5
直接寻址的寻址对象为RAM,SFR(特殊功能寄存器)
MOV A,25H; 内部RAM(25H)→A 注意#25H表示操作数,25H表示的是RAM内的存储空间地址,此指令表示将内部RAM的25H地址内数据传给AMOV P0,#45H; 45H→P0MOV 30H,20H;内部RAM(20H)→(30H)通用寄存器包括 A , B, DPTR, R0~R7
以通用寄存器的内容为操作数的寻址方式为寄存器寻址
A既可以寄存器寻址也可以直接寻址,直接寻址时写作ACC
直接寻址和寄存器寻址间的差别:
直接寻址是以操作数所在的字节地址(占用1字节)出现在指令码中
寄存器寻址是寄存器编码出现在指令码中
寄存器寻址优点:
可寄存器寻址的寄存器少,编码位数少(少于3位二进制数),通常操作码和寄存器编码合用1字节
因此寄存器寻址的指令机器码短,执行快
但需要注意的一点是,除了上述所指明的通用寄存器外的其他SFR,一律为直接寻址
MOV A,R0; R0->AMUL AB; A*B->BA 无符号乘法指令 MUL,后面会具体介绍MOV B,R0; R0->BPUSH ACC; A的内容压入堆栈,A在此处为直接寻址以寄存器中的内容为地址,该地址的内容为操作数的寻址方式称为寄存器间接寻址
能用于寄存器间接寻址的寄存器有 R0, R1, DPTR,前面加@表示
寄存器间接寻址的存储器空间包括内部RAM和外部RAM
需要注意的一点是,因为内部RAM有128字节,因此用1字节的R0或R1即可间接寻址整个空间
但外部RAM拥有64KB的存储空间,仅用R0或R1无法寻址整个空间,因此,需要由P2端口提供外部RAM的高8位地址,由R0或R1提供低8位地址。
也可以用16位的DPTR作寄存器间接寻址64KB存储空间
MOV @R0,A; A->以R0内容为地址的内部RAMMOVX A,@R1; 外部RAM(地址为P2 R1)的内容->AMOVX @DPTR,A; A->以DPTR内容为地址的外部RAM注意:在使用间接寻址指令前,需要先给作间址的寄存器赋值由寄存器DPTR或PC(程序计数器,用于存放CPU将执行的下一条指令的地址)中内容加上A累加器内容之和,形成操作数地址的寻址方式称为变址寻址。
变址寻址只能对ROM中的数据做寻址操作
由于ROM是只读存储器,因此变址寻址只有读操作而无写操作。指令操作符为MOVC
MOVC A,@A+DPTR; A+DPTR->A 传给A的应是A+DPTR地址空间内所含的数据MOVC A,@A+PC; (A+PC)->A以当前程序计数器PC的内容为基值,加上指令给出的一字节补码数(偏移量)形成新的PC值
相对寻址只用于修改PC值,主要用于程序的分支转移
SJMP 08H; 当前PC+08H->PC ,指令执行后,转到PC+08H处继续执行程序对位地址中的内容作位操作的寻址方式
单片机内只有内部RAM和SFR部分寄存器单元可位寻址
位寻址是一种直接寻址方式,由指令给出直接位地址。但不同的是,位寻址给出的是位地址,而不是字节地址
注:
位地址-----指向具体的一位
字节地址-----指向具体的一个字节,8位
小结:
在直接寻址的内部RAM和SFR的操作数中,SFR操作数常采用符号字节地址(PSW,TMOD,P0,IE)和符号位地址(C,RS0,EA,P1.1)
对内部RAM,采用直接字节地址/直接位地址
外部存储器及程序存储器只能和A之间进行传送,而不能与内部RAM和SFR之间进行传送。
①访问外部数据存储器指令(4条)
外部RAM可读可写,和A可以互相传送,共4条指令
②访问ROM指令 ROM只能读,不能写 这两条指令常用于查表
MOVC A,@A+PC; (A+PC)->AMOVC A,@A+DPTR; (A+DPTR)->A例如:MOV A,#01H; A=01HMOV DPTR,#M2; M2地址->DPTRMOVC A,@DPTR; (A+DPTR)->A=(01+M2)->AM1: RET; 子程序返回指令M2: DB 66H,77H,88H,99H;定义字节数据程序解读:M2本来应该输出66H 但M2+01,因此送给A 的为77H③堆栈操作
堆栈–暂时存放需保留信息的存储区,地址必须用寄存器SP表示
入栈操作:
PUSH dir; SP+1->SP (dir)->(SP) 指令含义--寄存器SP地址+1,数据地址给SP出栈操作
POP dir; (SP)->(dir),SP-1->SP SP内数据地址给dir 寄存器SP地址-1MOV A,#90H; 操作数90H送AMOV SP,#15; SP地址初值指向15HPUSH ACC; SP->16H ACC->SP 90H->(16H) (16H)=90H 入栈操作 SP+1变为16H A内数据送SP所指向的存储空间 也就是 操作数90H送至(16H)所指向的存储空间PSW中,4个测试标志位
P 奇偶校验位
OV 溢出标志位
CY 进位
AC 辅助进位
① P 仅对A操作的指令有影响
②传送指令,加1、减1指令、逻辑运算指令 不影响CY、OV、AC
③加减运算影响全部4个标志位
④乘除指令使CY=0,当乘积>255/除数为0时,OV=1
每一类运算A对应4个源操作数 @Ri 、dir、Rn、#data
加 ADD进位加 ADDC借位减 SUBB与 ANL 两数逻辑运算法则: 与 有0则0或 ORL 或 有1则1异或 XRL 异或 同为0 异为1 与0异或值不变 与1异或值取反具体指令说明:设A=97H CY=1,有如下指令(具体标志位的变化,请自行换算为二进制,进行计算观察)ADD A,#95H; A=97H+95H=2CH 进位溢出,不存A中,A只有8位 97H+95H=12CHADDC A,#95H; A=97H+95H+CY=12CH+CY=2CH+CY=2DH 此处有进位 CY=1设CY=1 A=95HSUBB A,#62H; A=95H-62H-CY=32H 标志位CY=0,OV=1,P=1,AC=0设A=8BH ADD A,ACC; A=8BH+8BH=16H设A=0FH (20H)=76HORL A,#80H; A=8FH 或运算--有1则1ANL A,20H; A=06H 与运算--有0则0对应源操作数 A,#data
设P1=0FHXPL P1,#0FFH; P1=F0H,此处P1属于直接寻址dir 此处0FH和FFH异或 ,同为0异为1,因此为F0加一指令是内部RAM或寄存器自增1指令
减一指令是内部RAM或寄存器自减1指令
计算完成二进制加法,和也为二进制
但当十进制数相加(BCD码相加),要得到十进制,则要进行十进制调整(BCD码调整)
DA A; 将A中二进制数相加和调整成BCD码指令调整原则:和 低4位大于9或者有半进位,则低4位+6和 高4位大于9或者有进位,则高4位+6指令根据 相加和 及 PSW中标志自行判断,因此该指令应紧跟在 加指令(ADD)之后,至少在 加指令和该指令之间 不能有影响标志位的指令注意: DA A;指令只对 一字节和 进行调整,如为多字节相加,须多次调整且不可对减法结果进行调整例如MOV A,#56H; A=56HMOV B,#17H; B=17HADD A,B; A=A+B=56H+17H=6DH DA A; 56H=0101 0110 17H=0001 0111 6DH= 0110 1101 可以看出有半进位无进位,因此低半字节+6 A=73HSJMP $;循环移位指令长用于位测试、位统计、乘2、除2操作
CPL A; A取反CLR A; A清零RL A; A左环移RR A; A右环移RLC A; A左大环移RRC A; A右大环移例如A=84H 1000 0100RL A; A=09H 0000 1001 左环移例如 A=84H CY=1RRC A; A=C2H 1100 0010 CY=0 环移指令是累加器A和进位标志CY一起进行移位①短转移
AJMP addr11; addr11->PC0~10转移范围:2KB地址范围机器码形式:a10 a9 a8 00001 a7 a6 a5 a4 a3 a2 a1 a0②长转移
LJMP addr16; addr16->PC0~1564KB程序空间全范围转移指令③间接转移
JMP @A+DPTR; A+DPTR->PC例如 A=02H DPTR=2000HJMP @A+DPTR; PC=2002H④无条件相对转移
STMP rel; PC+rel->PC功能:将PC当前 修改为 PC目的,即转到目的地址执行指令转移的偏移量 rel=PC目的-PC当前转移可前可后,rel可正可负 为一字节有符号数(补码表示) -128~+127①累加器为0(非0)转移
JZ rel; A=0 转移(PC+rel->PC),A不等于0,程序顺序执行JNZ rel; A不等于0则转移(PC+rel->PC),A=0,程序顺序执行②减1非0转移
DJNZ Rn,rel; Rn-1->Rn,Rn不等于0,则转移(PC+rel->PC),Rn=0,程序顺序执行DJNZ dir,rel;(dir)-1->(dir),(dir)不等于0,则转移(PC+rel->PC),(dir)=0,程序顺序执行说明:本指令有自动减1功能DJNZ Rn,rel;是2字节指令DJNZ dir,rel;是3字节指令③比较转移指令
CJNE A,dir,rel; A不等于dir ,转移(PC->rel->PC),A=dir,程序顺序执行CJNE A,#data,rel; A不等于#data,转移(PC->rel->PC),A=#data,程序顺序执行CJNE Rn,#data,rel; Rn不等于#data,转移(PC->rel->PC),Rn=#data,程序顺序执行CJNE @Ri,#data,rel; (Ri)不等于#data,转移(PC->rel->PC),Ri#data,程序顺序执行说明: CJNE 指令为3字节指令,做两数相减操作,不回送结果, 影响CY标志若 第一操作数 大于或等于 第二操作数,则标志CY=0,否则CY=1例如:CJNE R7,#34H,$+08H; 设R7=56H,则程序转移到放本条CJNE的指令的首地址($)加08H后的地址单元执行读P1端口上信息,若不为55H,则程序等待,知道P1为55H,程序顺序执行MOV A,#55H;CJNE A,P1,$;④空指令操作
NOP; 用于延时直接位地址表示,如 D4H
用“.”操作符表示,如PSW.4或D0H.4
用位名称表示,如 RS1
用用户自定义名表示,如 ABC BIT D4H; 其中,ABC定义位D4H位位名,BIT为位定义 伪指令
水平有限,博客错误之处,还请各位斧正。
QQ:2521798182