1、2019/7/24,汇编语言与汇编程序,1,第二章 汇编语言与汇编程序,单片机原理及应用,2019/7/24,汇编语言与汇编程序,2,学习要求 了解MCS-51汇编语言指令的形式,掌握指令的格式 掌握MCS-51单片机指令的寻址方式 掌握MCS-51汇编语言指令的分类及其使用 掌握常用的伪指令,2019/7/24,汇编语言与汇编程序,3,指令系统概述,汇编:源程序翻译成机器语言的过程 机器语言:二进制代码,CPU能够直接识别、并执行其操作 汇编语言:用助记符表示的语句;源程序 C51语言:语法同标准C语言。 开发效率高,可读性强,是目前使用最为广泛的单片机开发语言。 一条C语言通常需要由多条机
2、器语言组成。,2019/7/24,汇编语言与汇编程序,4,汇编语言的指令格式? 标号:操作码助记符 (目的操作数),(源操作数);注释 换行表示一条指令结束。例如: LOOP: MOV A, #40H ;取参数MOV R0, A,1.标号:指令的符号地址。 2.操作码助记符:指明指令功能。 3.操作数:指令操作对象。 数据、地址、寄存器名及约定符号。 4.注释行:说明指令在程序中的作用。 操作码和操作数是指令主体。,2019/7/24,汇编语言与汇编程序,5,1. 寻址方式,寻址方式,就是指如何找到存放被操作数据的位置(地址)的方法。,2019/7/24,汇编语言与汇编程序,6,立即寻址,由指
3、令直接给出操作数:8位和16位。数值前加“#”表示;若十六进制英文字母AF前加0,MOV A,#0B0H,速递快信,B0H,2019/7/24,汇编语言与汇编程序,7,直接寻址,指令直接给出操作数地址的寻址方式。,MOV A,3AH,XXH,F0H,2019/7/24,汇编语言与汇编程序,8,寄存器寻址,以通用寄存器的内容为操作数的寻址方式。 注:A和B既是通用寄存器,又是具有直接地址的特殊功能寄存器。,寄存器,MOV A,R1,10H,2019/7/24,汇编语言与汇编程序,9,寄存器间接寻址,以寄存器中的内容为地址,该地址中的内容为操作数的寻址方式。 寄存器前加,XXH,MOV A,R1,
4、可寻址内部RAM128B,寻址外部RAM,仅用于堆栈操作,34H,2019/7/24,汇编语言与汇编程序,10,变址寻址,操作数为程序存储器的地址,该地址是由DPTR或PC加上累加器A的内容形成的16位地址 只有读操作而无写操作,PC/DPTR 1000H,A 30H,变址寄存器,1000H+30H,65,MOVC A,A+DPTR MOVC A,A+PC JMP A+DPTR,2019/7/24,汇编语言与汇编程序,11,位寻址,对位地址中的内容作位操作的寻址方式 位寻址只能对有位地址的空间(20H-2FH和SFR的可寻址位)作寻址操作。,0,MOV C,37H,0,2019/7/24,汇编
5、语言与汇编程序,12,寻址空间,2019/7/24,汇编语言与汇编程序,13,判断以下指令源操作数的寻址方式,MOV A,#88H PUSH ACC POP ACC MOV 28H,R4 MOVX A,DPTR MOVC A,A+DPTR MOV A,R0 MOVX A,R0 CLR C SETB 00H,立即寻址 直接寻址 寄存器间接寻址 寄存器寻址 寄存器间接寻址 变址寻址 寄存器间接寻址 寄存器间接寻址 位寻址 位寻址,2019/7/24,汇编语言与汇编程序,14,2. 常用指令,MCS-51单片机共有111条指令,按功能分类,可分为5大类: 数据传送类指令(共29条) 算术操作类指令(
6、共24条) 逻辑操作类指令(共24条) 控制程序转移类指令(共17条) 布尔变量操作类指令(共17条),2019/7/24,汇编语言与汇编程序,15,(1) 数据传送类指令,累加器A,直接地址 direct,立即数 #data,寄存器 R0R7,寄存器间接 R0、R1,数据指针 DPTR,入、出栈 SP,入,出,位累加器C,1,1,2019/7/24,汇编语言与汇编程序,16,2019/7/24,汇编语言与汇编程序,17,传送:把源地址单元的内容传输到目的地址单元中去,源地址单元内容不变 数据传送指令不影响标志位 1. 以A为目的操作数MOV A,dir MOV A,#data MOV A,R
7、n MOV A,Ri 例:R120H,(20H)55H, 指令 MOV A,R1 ;执行后,A55H,2019/7/24,汇编语言与汇编程序,18,2.以Rn为目的操作数MOV Rn,dir MOV Rn,#data MOV Rn,A 例: (40H)30H, 指令 MOV R7,40H 执行后,R730H,3.以直接地址为目的操作数MOV dir1,dir2MOV dir,#data MOV dir,A MOV dir,Rn MOV dir,Ri 例:R0=50H,(50H)=10H, 指令 MOV 35H, R0 执行后,(35H)10H,2019/7/24,汇编语言与汇编程序,19,4.
8、 以寄存器间接地址为目的操作数MOV Ri,dir MOV Ri,#data MOV Ri,A 5. 查表指令(读程序存储器)MOVC A,(A+DPTR) MOVC A,(A+PC) 例:A20H,DPTR2000H,指令 MOVC A,(A+DPTR) 执行后,程序存储器2020H单元中的内容送入A。,2019/7/24,汇编语言与汇编程序,20,例:,MOV A,#30H MOV 4FH,A MOV R0,#20H MOV R0,4FH MOV 21H,20H,习题:用两种寻址方式实现,将片内RAM60H单元的数据传送给累加器A。,解:MOV A,#60H(),MOV R0,#60H M
9、OV A,R0 (),;A= 30H ;(4FH)= 30H ;R0= 20H ;(20H)= 30H ;(21H)= 30H,MOV R0,60H MOV A,R0(),MOV A,60H (),顺序执行下列指令序列,求每一步执行结果。,2019/7/24,汇编语言与汇编程序,21,说 明:,只有指令表中的指令才有对应指令代码,计算机才能执行。编程时,不能随意创造发明指令。,1. 一条指令中不能同时出现两个工作寄存器: 非法指令: MOV R1,R2 MOV R2,R0,2. 间址寄存器只能使用 R0、R1。 非法指令: MOV A,R2,3. SFR区只能直接寻址,不能用寄存器间接寻址。
10、非法指令:MOV R0,#80H MOV A,R0,2019/7/24,汇编语言与汇编程序,22,6. 访问外部数据RAMMOVX DPTR,A MOVX A,DPTR MOVX A,Ri MOVX Ri,A 例:DPTR2000H, 外部RAM中(2000H)=18H指令 MOVX A, DPTR ; 执行后,A18H例:P210H,R150H,A64H,指令 MOVX R1,A 执行后,外部RAM中(1050H)64H 7. 堆栈操作指令入栈 PUSH dir 出栈 POP dir,2019/7/24,汇编语言与汇编程序,23,8. 交换指令 (1)字节交换 XCH A,Rn XCH A,
11、Ri XCH A,dir (2)半字节交换 XCHD A,Ri (3)累加器A低4位与高4位交换SWAP A 例:A=80H, R0=32H, (32H)=FFH,指令 XCHD A, R0; 执行后, A=8FH, (32H)=F0H例:A35H, 指令 SWAP A ; 执行后, A=53H 9. 16位数据传送指令MOV DPTR,#data16,2019/7/24,汇编语言与汇编程序,24,例:将片内RAM 2AH和2BH单元中的低半字节拼成新字节,其中2BH单元的低半字节作为新字节的高半字节。,58H,MOV A,#0,MOV R0,#2AH,MOV R1,#2BH,XCHD A,R
12、0,SWAP A,XCHD A,R1,XCH A,20H,2019/7/24,汇编语言与汇编程序,25,例 解释下列语句,并指出该程序段的功能MOV R0,#61HMOV R0,#0XCH A,50HXCHD A,R0SWAP AMOV 60H,A 功能:将(50H)内的压缩BCD码转换呈非压缩BCD码送61H,62H,2019/7/24,汇编语言与汇编程序,26,练习:,说明程序执行过程中,SP的内容及堆栈中内容的改变过程。MOV SP,#30HMOV A,#20HMOV B,#30HPUSH APUSH B POP APOP B,;SP=30H ;A=20H ;B=30H ;SP=31H
13、(31H)=20H ;SP=32H (32H)=30H ;A=30H SP=31H ;B=20H SP=30H,2019/7/24,汇编语言与汇编程序,27,习题:找出指令错误并改正:,1MOV A,#1000H 2MOVX A,1000H 3MOVC A,1000H 4MOVX 60H,A 5MOV R0,60H MOV 61H,R0 6. XCH R1,R2 7. MOVX DPTR,#2000H 8. MOVX 60H,DPTR,;A1000H(A装1个字节数) ;A片外RAM(DPTR、Ri) ;A片外ROM(DPTR、PC) ;片内RAM(60H)A(应为MOV) ;片内RAM:(6
14、1H)(60H) (片内RAM可直接寻址) ;R1R2(必须有A参加) ;DPTR2000H(应为MOV) ;片内RAM片外RAM(必须有A参加),2019/7/24,汇编语言与汇编程序,28,(2) 算术操作指令,执行加、减、乘、除运算。有些算术指令执行的结果将使Cy,Ac,OV置位或复位,并影响累加器A的P 加法指令 (1)不带进位加法指令ADD A,#data ADD A,dir ADD A,Rn ADD A,Ri,1)对标志位的影响: Cy:若D7有进位,则置1; AC:若D3有进位,则置1; OV:CyCs=1,则置1 2)溢出规律:无符号数: 若Cy=1, 则溢出有符号数: 若OV
15、=1, 则溢出,2019/7/24,汇编语言与汇编程序,29,(2)加1指令INC A INC dir INC Ri INC Rn INC DPTR 除INC A会影响P外,其余均不影响各标志位,(3)带进位加法指令 ADDC A,dir ADDC A,#data ADDC A,Rn ADDC A,Ri 例:A的内容为C3H,R0的内容为AAH,Cy1。 指令 ADDC A,R0 执行后,A=6EH, Ac=0, Cy=1, OV=1,2019/7/24,汇编语言与汇编程序,30,MOV A,20H ADD A,23H MOV 26H,A MOV A,21H ADDC A,24H MOV 27
16、H,A MOV A ,22H ADDC A,25H MOV 28H,A MOV A,#0 ADDC A,#0 MOV 29H,A,程序功能: 3字节无符号数相加。 被加数放在内部RAM 20H22H。加数放在内部RAM 23H25H。结果放到内部RAM 26H29H。,2019/7/24,汇编语言与汇编程序,31,减法指令 (1)带借位减法指令SUBB A,dir SUBB A,#data SUBB A,Rn SUBB A,Ri 例: A=0C9H, R1=54H, Cy=1, 指令SUBB A, R1 ;执行后,A74H, Cy=0, OV=1 (2)减1指令DEC A DEC dir DE
17、C Ri DEC Rn,2019/7/24,汇编语言与汇编程序,32,二十进制调整指令DA A ;把A中按二进制相加后的结果调整成按BCD数相加的结果例: A=56BCD, B=67BCD, 执行指令 ADDC A, BDA A结果,A=23BCD,Cy=1 乘法指令MUL A, B 例:A50H, B0A0H, 指令 MUL A, B 执行后,A00H(低), B32H(高), OV=1, Cy=0 除法指令DIV A, B 例:A0FBH, B12H, 指令DIV A, B执行后 , A0DH(商), B11H(余数), OV=0, Cy=0,2019/7/24,汇编语言与汇编程序,33,
18、CLR CMOV A,#9AHSUBB A,60HADD A,61HDA AMOV 62H,A (1)已知:(60H)=24H,(61H)=72H,运行后,(62H)= ? (2)程序段执行何种操作,48H,2019/7/24,汇编语言与汇编程序,34,MOV A,40HSWAP AANL A,#0FHMOV B,#10MUL ABANL 40H,#0FHADD A,40HMOV 40H,A 问: 程序段执行何种操作?,2019/7/24,汇编语言与汇编程序,35,(3) 逻辑操作指令,1. 逻辑与ANL A,dir ANL A,#data ANL A,Rn ANL A,Ri ANL dir,
19、A ANL dir,#data可用于清“0”,2. 逻辑或ORL A,dir ORL A,#data ORL A,Rn ORL A,Ri ORL dir,A ORL dir,#data可用于置位,2019/7/24,汇编语言与汇编程序,36,3. 逻辑异或 “求反”XRL A,dir XRL A,#data XRL A,Rn XRL A,Ri XRL dir,A XRL dir,#data,4. 求反CPL A ; A中的内容按位取反 5. 清0CLR A ;A中的各位均为0,6. 循环移位RL A ;累加器A中的内容循环左移一位RR A ;累加器A中的内容循环右移一位RLC A ;A中内容连
20、同进位Cy循环左移一位RRC A ;A中内容连同进位Cy循环右移一位,2019/7/24,汇编语言与汇编程序,37,影响标志的指令,2019/7/24,汇编语言与汇编程序,38,(4)布尔变量操作,布尔处理器中,进位标志C相当于一般CPU中的累加器,通过C完成位的传送和逻辑运算 位地址范围:20H-2FH和SFR中的可寻址位 位地址的表达:例PSW中的位5 直接地址方式:0D5H 点操作符方式:PSW.5 位名称方式:F0 用户定义名方式:伪指令 bit USER bit F0定义后,允许用USER代替F0,2019/7/24,汇编语言与汇编程序,39,3. 位求反指令CPL C CPL bi
21、t 4.位传送指令 MOV C,bit MOV bit,C,1. 清0指令CLR C ;0CCLR bit ;0bit 2. 置位指令SETB C ;1CSETB bit ;1bit,5. 位逻辑“与”ANL C,bit ;(Cy) (Cy)(bit)ANL C,/bit ;(Cy) (Cy)( / bit) 6. 位逻辑“或”ORL C,bit ;(Cy) (Cy)(bit)ORL C,/bit ;(Cy) (Cy)(/bit),2019/7/24,汇编语言与汇编程序,40,3 伪指令,协助汇编,不产生相对应的操作码 1.常量 数值常量:N进制数,ASCII码如A 符号常量:由EQU定义,赋
22、值伪指令 例 AA EQU R3 给标号变量(AA)赋以数值或变量(R3)例, X1 EQU 2000H MAIN: MOV DPTR,#X1,2019/7/24,汇编语言与汇编程序,41,2.标号 指令标号 标号:操作码助记符 (目的操作数),(源操作数) 数据标号:DB和DW定义常数和变量DB DW 把项或项表的数值存入标号开始的连续单元中 DB的项是一个字节;例: DB 12H,A DW的项是一个字(两个字节),主要用来定义地址例: DW 1234H,5678H 存放在程序ROM中,2019/7/24,汇编语言与汇编程序,42,位置计数器LC,“$”:记录当前汇编地址 3.ORG:汇编起
23、始地址定位伪指令,用来规定目的程序的起始地址ORG nn ;nn为十进制或十六进制数指令地址 机器码 源程序ORG 0000H0000H 02 00 30 LJMP 0030HORG 0030H 0030H 78 30 MAIN: MOV R0,#30H0032H E6 MOV A,R0 4. END:汇编程序结束伪指令用在程序的末尾,表示程序结束,2019/7/24,汇编语言与汇编程序,43,ORG 0070H PWORD: MOV DPTR, #7000HMOVX A,DPTRANL A, #0FHSWAP AMOV B, AINC DPTRMOVX A,DPTRANL A, #0FHOR
24、L A, BINC DPTRMOVX DPTR, AEND,2019/7/24,汇编语言与汇编程序,44,4 指令的时序单片机以晶体振荡器的振荡周期(外部引入的时钟周期)为最小的时序单位以外接晶振为12MHz为例 振荡周期1/fosc=1/12MHz=0.0833us 状态周期2/fosc=2/12MHz=0.167us 机器周期12/fosc=12/12MHz=1us 指令周期(14)机器周期14 us,2019/7/24,汇编语言与汇编程序,45,5 小 结,指令格式标号:操作码助记符(目的操作数),(源操作数);注释 7种寻址方式立即寻址,直接寻址,寄存器寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址 5类系统指令数据传送指令,算术操作指令,逻辑操作指令,控制转移指令,布尔变量操作指令 作业习题2-5, 2-15,