轩儿的51单片机汇编指令详解

发布时间:2025-12-10 11:32:39 浏览次数:5

51单片机汇编指令

  • 一、寻址方式
    • 1、立即寻址(直接给操作数)
    • 2、直接寻址(给操作数所在地址)
    • 3、寄存器寻址
    • 4、寄存器间接寻址
    • 5、变址寻址
    • 6、相对寻址
    • 7、位寻址
  • 二、数据传送与交换指令
    • 1、传送类指令
      • (1)内部RAM和SFR间传送指令 MOV
      • (2)外部存储器和A累加器之间的传送
    • 2、交换指令
      • (1)字节交换指令 XCH
      • (2)低半字节交换指令 XCHD
      • (3)A的高、低半字节交换 SWAP
  • 三、算术运算和逻辑运算指令
    • 1、算数运算和逻辑运算对标志位的影响
    • 2、以 A 为目的操作数的算数运算和逻辑运算指令
    • 3、以dir为目的操作数的逻辑运算指令 ANL 、ORL、XRL
    • 4、加一、减1指令----INC 、DEC
    • 5、十进制调整指令 DA
    • 6、专对A的指令
    • 7、乘除法指令
      • (1)乘法指令 MUL
      • (2)除法指令 DIV
    • 8、指令应用详解
      • (1)编程将21H单元的低3位和20H单元中的低5位合并为一个字送30H单元,要求将(21H)的低3位放在高位上
      • (2)把在R4,R5中的两字节数取补(高位在R4中)
      • (3)把R7中的无符号数扩大10倍
      • (4)把R1R0和R3R2中的两个4位BCD码数相加,结果送R5R4中,如有进位,则存于进位标志位C中
  • 四、控制转移指令
    • 1、调用指令和返回类指令
      • (1)长调用
      • (2)短调用
      • (3)子程序返回指令
    • 2、转移指令
      • (1)无条件转移指令
      • (2)条件转移指令---均为相对转移指令,rel的计算方法同SJMP rel
  • 五、位操作指令
    • 1、位地址表达方式
    • 2、位清零、置一、取反指令
    • 3、位与,位或指令
    • 4、位传送指令
    • 5、位转移指令

一、寻址方式

1、立即寻址(直接给操作数)

MOV A,#80H; 80H→A 将80H这一数据送给累加器AMOV DPTR,#2000H; 2000H→DPTR 将2000H送给16位寄存器DPTR DPTR分为DPL和DPH 用于存放低八位和高八位数据

2、直接寻址(给操作数所在地址)

直接寻址的寻址对象为RAM,SFR(特殊功能寄存器)

MOV A,25H; 内部RAM(25H)→A 注意#25H表示操作数,25H表示的是RAM内的存储空间地址,此指令表示将内部RAM的25H地址内数据传给AMOV P0,#45H; 45H→P0MOV 30H,20H;内部RAM(20H)→(30H)

3、寄存器寻址

通用寄存器包括 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在此处为直接寻址

4、寄存器间接寻址

以寄存器中的内容为地址,该地址的内容为操作数的寻址方式称为寄存器间接寻址

能用于寄存器间接寻址的寄存器有 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注意:在使用间接寻址指令前,需要先给作间址的寄存器赋值

5、变址寻址

由寄存器DPTR或PC(程序计数器,用于存放CPU将执行的下一条指令的地址)中内容加上A累加器内容之和,形成操作数地址的寻址方式称为变址寻址。

变址寻址只能对ROM中的数据做寻址操作

由于ROM是只读存储器,因此变址寻址只有读操作而无写操作。指令操作符为MOVC

MOVC A,@A+DPTR; A+DPTR->A 传给A的应是A+DPTR地址空间内所含的数据MOVC A,@A+PC; (A+PC)->A

6、相对寻址

以当前程序计数器PC的内容为基值,加上指令给出的一字节补码数(偏移量)形成新的PC值

相对寻址只用于修改PC值,主要用于程序的分支转移

SJMP 08H; 当前PC+08H->PC ,指令执行后,转到PC+08H处继续执行程序

7、位寻址

对位地址中的内容作位操作的寻址方式

单片机内只有内部RAM和SFR部分寄存器单元可位寻址

位寻址是一种直接寻址方式,由指令给出直接位地址。但不同的是,位寻址给出的是位地址,而不是字节地址

注:
位地址-----指向具体的一位
字节地址-----指向具体的一个字节,8位

SETB 20H; 1->20H位 SETB---寄存器置1指令MOV 32H,C; 进位标志位CY(由C表示)->32H位ORL C,5AH; CY或上5AH位->CY ORL"按位或"操作指令,用来测试两个操作数是否同时为0,或者用来置位某些位(置位即或为1)

小结:
在直接寻址的内部RAM和SFR的操作数中,SFR操作数常采用符号字节地址(PSW,TMOD,P0,IE)和符号位地址(C,RS0,EA,P1.1)

对内部RAM,采用直接字节地址/直接位地址

二、数据传送与交换指令

1、传送类指令

(1)内部RAM和SFR间传送指令 MOV

已知R1=20H,(20H)=55H,现有指令 MOV A,@R1; 此指令中@R1表示以R1内容为地址所指向的存储空间内存放的数据,因此该指令结果为 A=55HMOV A,#30H; 该指令属于直接给操作数,将30H直接赋给A已知(40H)=30H,现有指令 MOV A,40H; 指令将40H指向的内部RAM空间内所含数据送A已知 R0=50H,(50H)=10H,现有指令 MOV 35H,@R0; 指令将以R0内容为地址所指向的颞部RAM内所含数据送至35H所指向的内部RAM存储空间已知R0=50H ,现有指令 M0V @R0,#67H; 将操作数67H赋给以R0内数据为地址指向的内部RAM空间

(2)外部存储器和A累加器之间的传送

外部存储器及程序存储器只能和A之间进行传送,而不能与内部RAM和SFR之间进行传送。

①访问外部数据存储器指令(4条)
外部RAM可读可写,和A可以互相传送,共4条指令

注意 MOVX 用来访问外部RAM存储空间MOVX @Ri,A; A->(P2Ri),因外部RAM为64KB地址空间,因此需要16位,P2存高8位,Ri存低8位MOVX @DPTR,A; A->(DPTR) 将A中数据传至以DPTR内容为地址指向的外部RAM空间MOVX A,@Ri; MOVX A,@DPTR;

②访问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)所指向的存储空间

2、交换指令

(1)字节交换指令 XCH

例如已知 A=FFH R1=30H (30H)=87HXCH A,@R1; A=87H,(30H)=FFH 将A内数据和以R1内容为地址指向的存储空间内数据 进行交换

(2)低半字节交换指令 XCHD

例如已知 A=34H (50H)=96HMOV R1,#50H;XCHD A,@R1; A=36H (50H)=94H

(3)A的高、低半字节交换 SWAP

例如A=0FHSWAP A; A= F0H

三、算术运算和逻辑运算指令

1、算数运算和逻辑运算对标志位的影响

PSW中,4个测试标志位
P 奇偶校验位
OV 溢出标志位
CY 进位
AC 辅助进位

① P 仅对A操作的指令有影响
②传送指令,加1、减1指令、逻辑运算指令 不影响CY、OV、AC
③加减运算影响全部4个标志位
④乘除指令使CY=0,当乘积>255/除数为0时,OV=1

2、以 A 为目的操作数的算数运算和逻辑运算指令

每一类运算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

3、以dir为目的操作数的逻辑运算指令 ANL 、ORL、XRL

对应源操作数 A,#data

设P1=0FHXPL P1,#0FFH; P1=F0H,此处P1属于直接寻址dir 此处0FH和FFH异或 ,同为0异为1,因此为F0

4、加一、减1指令----INC 、DEC

加一指令是内部RAM或寄存器自增1指令
减一指令是内部RAM或寄存器自减1指令

INC A; A+1->AINC @Ri; (Ri)+1->(Ri) Ri内容指向的存储空间数据+1,再存放到此地址空间INC dir; 表内数据+1,再放回表内原地址 dir--表---存放数据的连续地址INC Rn;INC DPTR;DEC A;DEC @Ri;DEC dir;DEC Rn;注:减1指令不支持DPTR

5、十进制调整指令 DA

计算完成二进制加法,和也为二进制

但当十进制数相加(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 $;

6、专对A的指令

循环移位指令长用于位测试、位统计、乘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一起进行移位

7、乘除法指令

(1)乘法指令 MUL

MUL AB; A×B->BA说明:本指令实现8位无符号乘法。A、B各放一个8位乘数,指令执行后,16位积的高8位在B中,低8位在A中例如A=50H B=A0HMUL AB; A×B=3200H A=00H B=32H

(2)除法指令 DIV

DIV AB; A÷B->商在A中,余数在B中本指令实现两个8位无符号数除法,A放被除数,B放除数,指令执行后,A中为商,B为余数。 若除数B=00H,则指令执行后,溢出标志OV=1,且A,B内容不变例如 A=28H B=12HDIV AB; A÷B=02H...04H A=02H B=04H例如 A=08H,B=09HDIV AB; A=00H B=08H

8、指令应用详解

(1)编程将21H单元的低3位和20H单元中的低5位合并为一个字送30H单元,要求将(21H)的低3位放在高位上

详解:因为要求分别将20H的低5位和21H的低3位送30H单元,因此可以通过 ANL (与运算,有0则0)取所需位,其他位置0,然后通过 SWAP(A高低字节交换指令)以及RL (左环移)将21H低3位变换至高3位,最后通过ORL(或运算,有1则1)将所需字节合并MOV 30H,20H; (20H)内容送(30H)ANL 30H,#1FH; 1FH=0001 1111 保留低5位MOV A,21H; 将(21H)内容送A,等待数据处理SWAP A; 对A的高低4位进行交换RL A; 低3位变到高3位位置 RL左环移1位ANL A,#0E0H; 1110 0000 保留高3位 此处E0H写为0E0H,是16进制的写法格式ORL 30H,A; 和(30H)低5位合并SJMP $; 动态停机

(2)把在R4,R5中的两字节数取补(高位在R4中)

详解:正数的补码=原码,负数的补码=反码+1。此题让求补码,因此R4,R5中存放的两字节数为负数。因此需要别将低字节放入A中,对A进行取反操作,再+1后,成为低字节补码。然后将高字节放入A中,进行取反后加上,低字节反码+1后产生的进位(高字节取反后 无须 +1)。CLR C; CY清0 //此指令不清楚有何作用MOV A,R5; 低字节入ACPL A; 低字节取反ADD A,#O1H; 低字节+1MOV R5,A; 低字节补码入R5MOV A,R4; 高字节 入ACPL A; 高字节 取反ADDC A,#00H; 高字节 加 低位进位 此处是加低位可能产生的进位MOV R4,A; 高字节补码入 R4SJMP $; 动态停机

(3)把R7中的无符号数扩大10倍

详解,将R7中无符号数和乘数10分别存入A、B中,调用无符号乘法指令MUL进行计算,并将分别存放乘积的高8位和低8位的B和A中的数,送给R7和R6MOV A,R7;MOV B,#0AH;MUL AB;MOV R7,A;MOV R6,B;SJMP $;

(4)把R1R0和R3R2中的两个4位BCD码数相加,结果送R5R4中,如有进位,则存于进位标志位C中

详解:使用ADD 加指令进行BCD码数相加,然后使用DA 对BCD码进行十进制调整,将最后结果放入R5R4中CLR C; 清进位MOV A,R0; ADD A,R2; 低字节相加DA A; 十进制调整MOV R4,A; 低字节结果送R4MOV A,R1;ADDC A,R3; 进位加 高字节相加DA A; 十进制调整MOV R5,A; 高字节结果送R5SJMP $; 动态停机

四、控制转移指令

1、调用指令和返回类指令

(1)长调用

LCALL addr16; addr16->PC0~15说明:该指令功能是:保护断点,即当前PC(本指令的下一条将执行指令的首地址)压入堆栈,子程序入口地址addr16送PC,程序跳转至子程序执行本指令为64KB地址范围的调用子程序指令,子程序可在64KB地址空间的任意处。本指令的机器码为 3字节

(2)短调用

ACALL addr11; addr11->PC0~10功能:保护断点,当前PC入堆栈;addr11->PC0~10 PC 11~15原值不变本指令为2KB地址范围内的调子程序指令设addr11各位为 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0则ACALL指令操作码为 a10 a9 a8 10001 a7 a6 a5 a4 a3 a2 a1 a0其中10001 是ACALL指令的操作码

(3)子程序返回指令

RET; 从调用子程序返回功能:从栈顶弹出断点到PC,从子程序返回主程序RETI;从中断服务程序返回功能:从栈顶弹出断点到PC,并恢复中断优先级状态触发器,从中断服务返回主程序

2、转移指令

(1)无条件转移指令

①短转移

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

(2)条件转移指令—均为相对转移指令,rel的计算方法同SJMP rel

①累加器为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; 用于延时

五、位操作指令

1、位地址表达方式

直接位地址表示,如 D4H

用“.”操作符表示,如PSW.4或D0H.4

用位名称表示,如 RS1

用用户自定义名表示,如 ABC BIT D4H; 其中,ABC定义位D4H位位名,BIT为位定义 伪指令

2、位清零、置一、取反指令

清0CLR C; 0->CYCLR bit; 0->bit置1SETB C; 1->CYsetb bit; 1->bit取反CPL C; CY取反CPL bit; bit 取反

3、位与,位或指令

与 ANL C,bit; CY与上(bit)->CYANL C,/bit; CY与上(bit)的取反->CY或ORL C,bit; CY或上(bit)->CYORL C,/bit; CY或上(bit)的取反->CY

4、位传送指令

MOV C,bit; (bit)->CYMOV bit,C; CY->bit

5、位转移指令

JC rel; CY=1,则转移(PC->rel->PC),否则顺序执行JNC rel; CY=0,则转移(PC->rel->PC),否则顺序执行JB bit,rel; (bit)=1,则转移(PC->rel->PC),否则顺序执行JNB bit rel; (bit)=0,则转移(PC->rel->PC),否则顺序执行JBC bit,rel; (bit)=1,则转移(PC->rel->PC),且该位清0,否则程序无法顺序执行

水平有限,博客错误之处,还请各位斧正。
QQ:2521798182

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477