1、寻址方式 数据传送类指令 算术运算类指令 逻辑操作类指令 控制转移类指令 位操作指令 常用伪指令,第 章 MCS 51 指令系统,本章内容,Single Chip Microcomputer,内容提要:,3-1 汇编语言与寻址方式,3-2 数据传送类指令,3-3 算术运算类指令,3-4 逻辑运算类指令,3-5 控制转移类指令,3-6 位操作类指令,3-7 汇编语言的汇编过程,3-8 汇编语言的程序设计及应用,高级语言:,3-1 汇编语言与寻址方式,一、汇编语言程序设计的意义 什么是程序? 完成某项特定任务的指令的集合。 计算机按程序一条一条地依次执行指令,从而完成指定任务。 要让计算机完成各项
2、任务,就应设计各种程序。,汇编语言:,机器语言:,程序设计语言:,用二进制代码表示指令和数据。,用助记符表示指令操作功能,用标号表示操作对象。,独立于机器,面向过程,接近自然语言和数学表达式.,汇编语言程序的每一条语句都与计算机的某一条指令对应,所以必需熟悉指令系统。 指令 = 操作码 + 操作数 操作码表示了该指令所能执行的操作功能。 操作数表示参加操作的数的本身或操作数所在的地址。MCS-51指令格式:,标号:,操作码助记符,第一操作数,,第二操作数,;注释,指令概述,指令按字节长度可以分为三种:,指令格式,指令的格式:,例如: MOV A,R0,例如:MOV A,30H,例如:MOV D
3、PTR,#2010H,二、MCS-51系列单片机的指令系统 111条指令,共分五大类: 数据传送类;(29条) 算术运算类;(24条) 逻辑运算类;(24条) 控制转移类;(17条)位操作类。(17条),指令中操作数的描述符号:Rn 工作寄存器R0 R7Ri 间接寻址寄存器R0、R1Direct 直接地址,包括内部128B RAM单元地址、26个SFR地址。#data 8位常数#data 16 16位常数addr 16 16位目的地址addr 11 11位目的地址rel 8位带符号的偏移地址DPTR 16位外部数据指针寄存器bit 可直接位寻址的位,A 累加器B 寄存器BC 进、借位标志位,或
4、位累加器 间接寄存器或基址寄存器的前缀/ 指定位求反(x) x中的内容(x) x中的地址中的内容 当前指令存放的地址,三、寻址方式(找信方式),我的信在他那!找信去!,注:找信是寻找信的“地址”!,你能说出第二封信的“地址”吗?,目的地,#XXH,操作数,MOV P1, #55H,MOV A, #01H,#55H,目的地,信,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,目的地,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,内部RAM 或SFR区,操作数,XXH,MOV P1, 20H,20H,目的地,20H,注:寻址是寻操作数的
5、“地址”!,直接给出地址 20H直接寻址,目的地,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,寄存器,目的地,操作数,XXH,MOV P1, A,寄存器,R0-R7A B DPTR,你能说出为什么叫寄存器寻址吗?,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,MOV P1, R0,目的地,寄存器,操作数,3AH,内部RAM,3AH,65H,3AH,R0R1DPTR,目的地,2号,信在2号箱子里,1号,你能说出1号箱子和2号箱子分别对应内存中哪一部分吗?,寻址比较,MOV P1,R0,MOV P1,R0,MOV P1,20H,MO
6、V P1,#20H,MOV P1,R0,寻址比较,MOV P1,R0,MOV P1,R0,MOV P1,20H,MOV P1,#20H,MOV P1,R0,寻址比较,MOV P1,R0,MOV P1,R0,MOV P1,20H,MOV P1,#20H,MOV P1,20H,寻址比较,MOV P1,R0,MOV P1,R0,MOV P1,20H,MOV P1,#20H,MOV P1,#20H,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,MOVC A, A+DPTR,目的地,寄存器,操作数,内部RAM,3AH,65H,3AH,基址寄存器 12H,变址寄存器 34H
7、,内部RAM,46H,65H,A,DPTRPC,46H,目的地,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,XXH,位寻址,操作数,SJMP 54H,PC,+,54H,PC,2002H,2002H =2056H,PC,2056H,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,1,0 0 0 0 0 0 0 0,想一想: 如果想使27H单元的第3位置1,该怎么办呢?,位寻址地址表,例:SETB 3DH,3D,3C,3B,3F,3E,3A,39,38,27H,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,SE
8、TB 3DH,0 0 0 0 0 0 0,1,0,二、指令系统,1、指令描述约定,3-2 数据传送类指令,一、内部RAM数据传送类 1、一般数据传送指令,目的地址 源地址,数 据,MOV A,#20H,20H,A,1.1 数据传送指令(29条) 8位数据传送指令(15条),MOV ,,,MOV,1.1 数据传送指令(29条) 16位数据传送指令(1条),MOV DPTR,#data16,外部数据传送指令(4条),MOVX ,,,MOVX,回忆前述操作数描述符:A,direct,Rn,Ri,#data,DPTR等。 经排列组合可写出下列指令: MOV A,Rn ;(A) (Rn)以下类似。,MO
9、V A,direct MOV A,Ri MOV A,#data MOV Rn,A MOV Rn,direct MOV Rn,#data,MOV direct,Rn MOV direct,direct MOV direct,Ri MOV direct,#data MOV Ri,A MOV Ri, direct MOV Ri,#data MOV DPTR,#data16 ;唯一的16位数据传送指令。 上述指令不影响任何标志位,但PSW的P位除外。,(direct),(A),MOV direct,A ;,上述指令不影响任何标志位,但PSW的P位除外。 注意:MOV Rn,Rn MOV Ri, RiM
10、OV Rn, RiMOV #data, A等等指令是非法指令。,哇!好容易出错啊!,源操作数及目的操作数不可同时出现工作寄存器! 源操作数及目的操作数不可同时出现相同类型的SFR! 立即数不可作为目的操作数!,(2) (direct),2、栈操作指令 PUSH direct POP direct 不影响任何标志位。 PUSH direct 指令执行中,机器自动进行两步操作: (1) (SP)+ 1,例1、设(SP) = 09H,(DPTR)= 0123H,分析:执行 PUSH DPLPUSH DPH 后,各单元中的内容。,(SP),(SP),(SP)= 0BH (0AH)= 23H (0BH)
11、= 01H,POP direct 指令执行中,机器也自动进行两步操作: (1)(direct) (SP) (2)(SP) (SP) 1 例2、设(SP)= 0BH,(0BH)= 01H,(0AH)= 23H执行 POP DPHPOP DPL后,各单元中的内容。,(SP)= 09H (DPH)= 01H (DPL)= 23H,结论:1)PUSH 与 POP 操作过程刚好相反;2)进、出栈规则:先进后出,后进先出。应注意指令书写先后顺序;3)可用于“保护现场,恢复现场”。,1)字节交换指令(3条),交换指令(5条),,,A,XCH,2)低半字节交换指令(1条),XCHD A , Ri,3)累加器A
12、中高4位和低4位交换(1条),SWAP A,3、字节交换指令 XCH A,Rn XCH A,direct 整字节交换 XCH A,Ri XCHD A,Ri SWAP A 半字节交换 不影响任何标志位。,* 外部RAM数据传送 MOVX A,Ri MOVX A, DPTR MOVX Ri, A MOVX DPTR,A 执行过程中会使/WR、/RD有效。,例3、试编写一程序段,实现将外RAM 0FAH单元中的内容传送到外RAM 04FFH单元中。,解: MOV DPTR,#04FFHMOV R0,#0FAHMOVX A,R0MOVX DPTR, A,三、 查表指令 与ROM之间的数据传送。 MOV
13、C A,A + DPTR MOVC A, A + PC 执行后会使/PSEN有效。 MOVC 含义是传送常数。 以DPTR 为基地址的指令,可在ROM 的64KB范围内查表; 而以PC为基地址的指令只能在(PC)+ 1为中心上、下256B范围内查表。,例4、设(A)= 一个BCD码常数,试用查表法获得其相应的ASCII码。,解法II: MOVC A,A+PCTAB:DB 30H,31H,32H,33HDB 34H,35H,36H,37H,解法I: MOV DPTR,#TABMOVC A,.A+DPTRTAB:DB 30HDB 31HDB 32H,33H,34H,35H ,CY 进位/借位标志;
14、位累加器C。 AC 辅助进/借位标志;用于十进制调整。 F0 用户定义标志位;软件置位/清零。 OV 溢出标志; 硬件置位/清零。 P 奇偶标志;A中1的个数为奇数 P = 1;否则 P = 0。 RS1、RS0 寄存器区选择控制位。0 0 : 0区 R0 R70 1 : 1区 R0 R71 0 : 2区 R0 R71 1 : 3区 R0 R7,P,RS0,RS1,OV,F0,AC,CY,PSW 程序状态标志,单片机的工作过程,取指过程,例: MOV A,#09H 74H 09H ;把09H送到累加器A中,执行过程,PC=,0000H,0 1 1 1 0 1 0 0,0 0 0 0 1 0 0
15、 1,(PC),(PC),0001H,0002H,0000H,外部控制总线CB,取指过程,(PC),执行过程,你知道PC的作用吗?,例: MOV A,09H ;把(09H)送到累加器A中,E5H 09H,1、将内RAM 30H单元的内容传送到外RAM 3000H单元中。 2、将ROM 0100H单元的内容传送到内RAM 40H单元中。 3、将外RAM 0070H单元的内容传送到R5中。 4、用3种方法实现内RAM 60H和61H单元内容的互换。 5、设片内RAM中(59H)=50H,执行下列程序段 MOV A,59H MOV R0,A MOV A,#0 MOV R0,A MOV A,#25H
16、MOV 51H,A MOV 52H,#70H 问A=? (50H)=? (51H)= ? (52H)=? 6、欲将片外RAM中0357H单元的内容传送给A,判断下列指令或程序段的正误。 MOVX A,3057H ( ) MOV DPTR,#3057H ( )MOVX A,DPTR MOV P2,#03H ( )MOV R0,#57HMOVX A,R0 MOV P2,#03H ( )MOV R2,#57HMOVX A,R2,direct,3.3 算术运算类指令(24条) 加法指令(8条),A ,,Rn,Ri,#data,ADD,direct,A ,,Rn,Ri,#data,ADDC,减法指令(4
17、条),direct,A ,,Rn,Ri,#data,SUBB,ADDC A , B (A+B+CYA ),SUBB A , B (A B CYA ),包括:加、 减、乘、除;加一、减一。 一、加法指令 ADD A,Rn ;(A) (A)+ (Rn)以下类同。 ADD A,direct ADD A,Ri ADD A,#data 无符号数相加时:若C = 1,说明有溢出(其值 255)。 带符号数相加时:若OV = D7cD6c = 1,说明有溢出。,ADDC A,Rn ;(A) (A)+(Rn)+(C); 以下类同。 ADDC A,direct ADDC A,Ri ADDC A,#data上述四
18、条指令多用于多字节数相加。,INC A ;(A) (A)+1 ,以下类同。 INC Rn INC direct INC Ri INC DPTR,INC A ;(A) (A)+1 ;以下类同。 INC Rn INC direct INC Ri INC DPTR,例1、设(R0)= 7EH; (7EH)= FFH ; (7FH)= 40H执行:INC R0INC R0INC R0 后,DA A ;二 十进制调整指令。 执行过程中,CPU能根据加法运算后,累加器中的值和PSW中的AC及C标志位的状况自动选择一个修正值(00H、06H、60H、66H)与原运算结果相加,进行二十进制调整。,选择修正值的
19、规则:,BCD码: 0011 0100,BCD码调整指令(1条),DA A,注意:DA A指令只能跟在ADD或ADDC加法指令后,不适用于减法指令。,0001 1000,0001 0110,BCD码,0010 1110,差6,例2、设(A) = 56为56的压缩的BCD码数,(R3)= 67,(CY)=1执行 ADDC A,R3DA A结果为 : (A)=24, CY=1注意:1)DA指令只能跟在加法指令后面使用;2)调整前参与运算的两数是BCD码数;,例3、两个4位BCD码相加,一个存放在(31H)(30H);另一个存放在(33H)(32H);和数拟回存在(31H)(30H)中,试编程实现之
20、。 解: MOV R0,#30H INC R0MOV R1,#32H INC R1MOV A,R0 MOV A,R0ADD A,R1 ADDC A,R1DA A DA AMOV R0,A MOV R0,A,二、减法指令 SUBB A,Rn ;(A) (A)(Rn)(C),以下类同。 SUBB A,direct SUBB A,Ri SUBB A,#data 注意:减法之前先清零C;产生的借位或者溢出标志 类似加法指令。 DEC A ;(A) (A)1 ,以下类同。 DEC Rn DEC Ri DEC direct,例4、设(R0)=7FH,在内RAM中,(7EH)=00H,(7FH)=40H执行
21、: DEC R0 DEC R0DEC R0结果为 :(R0)= 7EH,(7EH)=0FFH,(7FH)=3FH。,加1减1指令,三、乘法和除法指令 乘法: MUL AB ;(A)(B),积的低8位在A中,积的; 高8位在B中; C总为0。除法: DIV AB ;(A)(B),商在A中,余数在B中。; 若(B)= 0 ,则结果不定,(OV)= 1,;(C)= 0。,例5、试将A中的二进制数转换为3位BCD码,其中,百位数存放于31H单元,十位数和个位数压缩后存于30H单元中。,解: MOV B,#100DIV ABMOV 31H,AMOV A,#10XCH A,BDIV ABSWAP AADD
22、 A,BMOV 30H,A,3-4 逻辑运算类指令,共分两大类:单字节逻辑操作,双字节逻辑操作,共24条。 一、单字节逻辑操作指令 CLR A ;(A) = 0 不影响标志位,除了P,单周期指令 CPL A A中8位按位求反。不影响标志位,除了P,单周期指令 循环左移、右移指令: RL A RLC A RR A RRC A 注:左移一位相当于乘2;右移一位相当于除2。,A.0,A.7,A.0,A.7,A.0,A.7,A.0,A.7,CY,CY,RL ARR ARLC ARRC A,注意:执行带进位的循环移位指令之前,必须给CY置位或清零。,循环移位指令,二、双字节逻辑操作指令 “与操作”: A
23、NL A,Rn ; (A) (A)(Rn),以下类同。 ANL A,direct ANL A,Ri ANL A,#data ANL direct,A ANL direct,#data例1、(P1)= 35H,使其高4位输出0,低4位不变。 解; ANL P1,#0FH此做法称为“屏蔽”位。,“或操作”: ORL A,Rn ; (A) (A)(Rn),以下类同。 ORL A,direct ORL A,Ri ORL A,#data ORL direct,A ORL direct,#data,例2、将A中的低3位送入P1中,并且保持P1中高5位不变。 ANL A,#07H ANL P1,#0F8H
24、ORL P1,A ;(P1)= P17P16P15P14P13A2A1A0 这称为“数位组合”。,“异或操作”: XRL A,Rn ; (A) (A)(Rn),以下类同。 XRL A,direct XRL A,Ri XRL A,#data XRL direct,A XRL direct,#data 例3、设(P1)= 0B4H = 10110100B,执行:XRL P1,#00110001B 结果按# 0 0 1 1 0 0 0 1 取反,即:(P1)= 1 0 0 0 0 1 0 1 B = 85H 这称为“指定位取反”。,3-5 控制转移类指令,作用:改变程序计数器PC的值,从而改变程序执
25、行方向。 分为四大类:无条件转移指令;条件转移指令;调用指令; 返回指令。,无条件转移指令(4条),1) 长转移指令:LJMP AAAAH ; AAAAHPC,PC=0000H,PC=AAAAH,假设执行该指令前,PC的值为0000H。,注意:该指令可以转移到64 KB程序存储器中的任意位置。,PC高5位 (保持不变),PC低11位,操作码(第一字节),操作数(第二字节),11位转移地址的形成示意图,程序计数器PC,2)绝对转移指令/短跳转指令,AJMP addr11 ; PC+2PC, addr11 PC.10PC.0,PC,2002H,2003H,0000H,0001H,2004H,200
26、5H,2006H,PC,PC,PC,2006H,2003H,PC,0002H,PC,3)相对转移指令,例: SJMP 03H ? SJMP 2006H,03H就是当前PC值 与目的PC值相对差,PC,SJMP rel ; 短转移,相对寻址。 转移目的地址 = (PC)+ 2 + rel,Rel为有符号整数,127128。但,实际使用中写成 SJMP addr16,汇编时会自动转换成rel。,JMP A + DPTR ;间接转移,散转移指令。 转移目的地址 = (A) + (DPTR) 本指令不影响标志位,不改变 A 及DPTR中的内容。常用于多分支程序结构中,可在程序运行过程中动态地决定程序分
27、支走向。,例1、设A中为键值,试编写按键值处理相应事件的程序段。,解: MOV DPTR,#KYEGMOV B,#03HMUL ABJMP A + DPTRKYEG: LJMP KYEG0LJMP KYEG1,二、条件转移指令 实现按照一定条件决定转移的方向,分三类:判零转移指令比较转移指令循环转移指令,JZ rel : 若(A)= 0 ,则转移,否则顺序执行。JNZ rel : 若(A) 0,则转移,否则顺序执行。转移目的地址 = (PC)+ 2 + rel不影响任何标志位。,1、判零转移JZ relJNZ rel,例1、将外RAM的一个数据块(首地址为DATA1)传送到内部数据RAM(首地
28、址为DATA2),遇到传送的数据为零时停止传送,试编程。,解: MOV R0,#DATA2MOV DPTR,#DATA1LOOP1: MOVX A,DPTRJZ LOOP2MOV R0,AINC R0INC DPTRSJMP LOOP1 LOOP2: SJMP LOOP2,2、比较转移指令 功能:比较二个字节中的值,若不等,则转移。 CJNE A,#data,rel CJNE A,direct,rel CJNE Ri,#data,rel CJNE Rn,#data,rel,该类指令具有比较和判断双重功能,比较的本质是做减法运算,用第一操作数内容减去第二操作数内容,但差值不回存。 转移目的地址
29、= (PC)+ 3 + rel 若第一操作数内容小于第二操作数内容,则(C)= 1,否则(C)= 0。,该类指令可产生三分支程序:即,相等分支;大于分支;小于分支。,例2、设P1口的P1.0 P1.3为准备就绪信号输入端,当该四位为全1时,说明各项工作已准备好,单片机可顺序执行,否则,循环等待。,解: MOV A,P1ANL A,#0FHCJNE A,#0FH,WAIT ;P1.0 P1.3不为全1时,返回WAITMOV A,R2,WAIT:,3、循环转移指令 DJNZ Rn,rel ;(二字节指令) DJNZ direct,rel ;(三字节指令) 本指令也为双功能指令,即减1操作和判断转移
30、操作。 第一操作数内容减1后,若差值不为零,则转移;否则顺序执行。 转移目的地址 = (PC)+ 2或3 + rel,例3、将8031内部RAM的40H 4FH单元置初值#A0H #AFH。#10H,#10H,LCALL addr16 ;长调用ACALL addr11 ;短调用,绝对调用,LCALL addr16 ;转移范围64KB,不影响标志位。执行 中自动完成如下过程: (PC) (PC) + 3(SP) (SP)+ 1(SP) (PC7 0), 保护断点地址低字节;(SP) (SP)+ 2(SP) (PC15 8),保存断点地址高字节;(PC) addr16 ,目的地址送PC,转子程序。
31、,三、调用指令,执行结果:(SP)= 09H, (09H)= 21H,(08H)= 03H,(PC)= 3456H,转移范围与(PC)+ 2在同一个2KB内。不影响任何标志 位,执行中机器自动完成下列过程:(PC) (PC)+ 2(SP) (SP)+ 1(SP) (PC7 0)(SP) (SP)+ 2(SP) (PC15 8)(PC10 0) addr10 0,ACALL addr11 :,三、返回指令 从子程序返回主程序。RET ;调用子程序返回;RETI ;中断子程序返回。,(PC15 8)(SP) (SP) 1(PC7 0) (SP)(SP) (SP) 2,其机器自动操作过程如下:,比较
32、两种返回指令含义上的异同点:RET返回地址事先已知,而RETI的返回地址在程序执行中产生的,不固定。不影响标志位,但PSW不能恢复到中断前的状态。,(SP),例3、设(SP)= 0BH,(0AH)= 23H,(0BH)= 01H执行: RET,空操作指令 NOP ;空操作 不执行任何操作,仅仅使(PC)+ 1,继续执行下条令, 不影响标志位,在ROM中占一个字节。用于延时调整。,3-6 位操作类指令,包括:位传送指令、条件转移指令、位运算指令。 位操作由单片机内布尔处理器来完成。 位地址的四种表示: 1)使用直接位地址表示;如20H、30H、33H等; 2)使用位寄存器名来表示;如C、OV、F
33、0等; 3)用字节寄存器名后加位数来表示;如PSW.4、P0.5、ACC.3等;4)字节地址加位数来表示;如20.0、30.4、50.7等。,一、位传送指令 MOV C,bit MOV bit,C 功能:(C) (bit);或(bit) (C),二、位状态控制指令 CLR bit ;(bit) 0 SETB bit ;(bit) 1 CPL bit ;(bit) (/ bit),例1、编程通过P1.0线连续输出256个高低电平宽度均为5个机器周期长的方波。,00H,NOP NOP,ANL C,bit ;(C) (C)(bit)ANL C,/ bit ;(C) (C)(/ bit),ORL C,
34、bit ;(C) (C)(bit)ORL C,/bit ;(C) (C)(/bit),三、位逻辑操作指令,例2、用软件实现下图所示的P1.0 P1.3间的逻辑运算。,解: MOV C,P1.1ORL C,P1.2ANL C,P1.0MOV P1.3,C,P1.1,P1.2,P1.0,P1.3,四、布尔条件转移指令 有5条,分别对C和直接位地址进行测试, 并根据其状态执行转移。 1、判布尔累加器转移 JC rel ;(C)= 1,转移,否则顺序执行。 JNC rel ;(C)= 0,转移,否则顺序执行。 不影响标志。转移地址 :(PC) (PC)+2+ rel,JZ rel : 若(A)= 0
35、,则转移,否则顺序执行。 JNZ rel : 若(A) 0,则转移,否则顺序执行。,解: MOV A,30HCJNE A,40H,LOOP1SETB 7FHSJMP $LOOP1: JC LOOP2MOV 20H,AMOV 21H,40HSJMP $LOOP2: MOV 20H,40HMOV 21H,A SJMP $,例3、比较内部RAM的30H和40H单元中的二个无符号数的大小,将大数存入20H单元,小数存入21H单元,若二数相等,则使内RAM的第127位置1。,2、判位变量转移 JB bit,rel ;(bit)= 1,则转移,否则顺序执行。 JBC bit,rel ;(bit)= 1,则
36、转移,否则顺序执行,; 且无论(bit)是否等于1,均使该位清零。 JNB bit,rel ;(bit)= 0,则转移,否则顺序执行。; 不影响标志。,例4、试判断A中的正负,若为正数,存入20H单元;若为负数则存入21H单元。,解: JB ACC.7,LOOPMOV 20H,ASJMP $LOOP:MOV 21H,ASJMP $,51单片机汇编指令特点:,执行时间短。一个机器周期指令有64条,2个时间周期指令有45条,而4个机器周期指令仅有2条(即乘法和除法指令);指令编码字节少。单字节的指令有49条,双字节的指令有45条,三字节的指令仅有17条;位操作指令丰富。这是80c51单片机面向控制
37、特点的重要保证。,数据传送指令实现计算机内不同存储区域之间的信息传递。MCS-51指令系统中共有29条数据传送指令,不同存储单元之间的数据传递如图所示。,3-7 汇编语言及汇编过程,一、汇编程序功能,源程序 (汇编指令程序),目标程序 (机器码指令程序),汇编指令与机器码指令有一一对应的关系。 汇编程序是一种翻译程序,将源程序翻译成目标程序。,二、汇编程序的汇编过程汇编有两种方法:手工汇编、机器汇编。,1、手工汇编: 第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出; 第二次汇编:标号代真,将字符标号用所计算出的具体地址值或偏移量代换。,源程序,目标程序,地址,ORG 1000HSTA
38、RT:MOV R0,2FH MOV R2,#00H MOV A,R0 MOV R3,A INC R3 SJMP NEXT LOOP:INC R0 CJNE R0,#44H,NEXT INC R2 NEXT:DJNZ R3,LOOP MOV 2AH,R2 SJMP $ END,第一次汇编,第二次汇编,1000 A82F 1002 7A00 1004 E6 1005 FB 1006 0B 1007 80NEXT 1009 08 100A B644NEXT 100D 0A 100E DBLOOP 1010 8A2A 1012 80FE,A82F 7A00 E6 FB 0B 8005 08 B6440
39、1 0A DBF9 8A2A 80FE,2、机器汇编 两次扫描过程。 第一次扫描:检查语法错误,确定符号名字;建立使用的全部符号名字表;每一符号名字后跟一对应值(地址或数)。 第二次扫描:是在第一次扫描基础上,将符号地址转换成地址(代真);利用操作码表将助记符转换成相应的目标码。,三、伪指令伪指令是告诉汇编程序,如何汇编源程序的指令。伪指令既不控制机器的操作,也不能被汇编成机器代码, 故称为伪指令。,1、起始地址伪指令 ORG ORG addr16用于规定目标程序段或数据块的起始地址,设置在程序开始处。2、汇编结束伪指令 END告诉汇编程序,对源程序的汇编到此结束。一个程序中只出现一 次,在末
40、尾。,3、赋值伪指令 EQU 告诉汇编程序,将汇编语句操作数的值赋予本语句的标号。格式: 标号名称 EQU 数值或汇编符号“标号名称”在源程序中可以作数值使用,也可以作数据地址、位地址使用。 先定义后使用,放在程序开头。 4、定义字节伪指令 DB告诉汇编程序从指定的地址单元开始,定义若干字节存储单元并赋初值。格式: 标号: DB 字节数据或字节数据表 5、定义字伪指令 DW从指定地址开始,定义若干个16个位数据,高八位存入低地址;低八位存入高地址。,例、 ORG 1000HPIOI:DW 7654H,40H,12,6、数据地址赋值伪指令 DATA将表达式指定的数据地址赋予规定的字符名称格式:
41、字符名称 DATA 表达式 注:该指令与EQU指令相似,只是,可先使用后定义,放于程序开头、结尾均可。,(1000H)=76H (1001H)=54H (1002H)=00H (1003H)=40H (1004H)=00H (1005H)=0CH,7、定义空间伪指令 DS从指定地址开始,保留由表达式指定的若干字节空间作为备用空间。格式: 标号: DS 表达式 例2、 ORG 1000HDS 0AHDB 71H,11H,11H ;从100AH开始存放;71H、11H、11H。,注:DB、DW、DS 只能用于程序存储器;而不能用于数据存储器。,8、位地址赋值伪指令 BIT 将位地址赋予规定的字符名
42、称。 格式: 字符名称 BIT 位地址,例3、 X1 BIT P1.2,3-8 汇编语言程序的基本结构及应用举例,程序编写做到:占用存储空间少;运行时间短; 程序的编制、调试及排错所需时间短;结构清晰,易读、易于移植。,按结构化程序设计思想,任何复杂程序都可由 顺序结构、 分支结构、 循环结构 等构成。,一、顺序程序举例 例1、设在外RAM的60H单元存有1个字节代码,要求将其分解成两个4位字段,高4位存入原单元的低4位,其低4位存入61H单元的低4位,且要求这两个单元的高4位均为0,试编制完整程序。,分析:,# # # # ¥ ¥ ¥ ¥, , ¥ ¥ ¥ ¥,解: 核心指令 ANLORG
43、1000HMODE:MOV DPTR,#0060HMOVX A,DPTRMOV B,AANL A,#0F0HSWAP AMOVX R0,AANL B,#0FHMOV A,BINC R0MOVX R0,AEND,二、分支结构与分支程序设计 结构:根据不同的条件,进行相应的处理。 通常用条件转移指令形成简单分支结构。 如: 判(A) = Z 或 NZ ,转移判(CY)= 1 或 0 ,转移判(bit)=1 或 0 ,转移CJNE 比较不相等转移,例2、设a存放在累加器A中,b存放在寄存器B中,要求按下式计算Y值,并将结果Y存于累加器A 中,试编写程序。a-b (a0)Y = a+b (a 0),解
44、:本题关键是判a是正数,还是负数;由ACC.7便知。ORG 1000HBR: JB ACC.7,MINUSCLR CSUBB A,BSJMP DONEMINUS: ADD A,BDONE: SJMP END,例3、设有两个16位无符号数NA,NB分别存放在8031单片机内部RAM的40H、41H及50H、51H单元中,当NA NB时,将内部RAM的42H单元清0;否则,将该单元置成全1,试编程。 解法I:因为无16位数的比较指令,所以,只能用8位数的比较指令。(画出流程框图),解: ORG 2000HCMP:MOV A,51HCJNE A,41H,CMP1MOV A,50HCJNE A,40H
45、,CMP1SJMP NHIGHECMP1:JNC HIGHENHIGHE:MOV 42H,#0FFHSJMP DONEHIGHE:MOV 42H,#00HDONE:SJMP END,小结:1、汇编程序有哪三种基本结构?2、构成分支程序,常用到哪些判断语句?,顺序程序 每条指令只执行一次; 分支程序 根据不同条件,会跳过一些指令,而转去 执行另一些指令 共同点:每条指令至多执行一次。但是,实际中有时要求某程 序段多次重复执行,需要采用循环结构。,循环结构不但使程序简练,而且大大节省存储空间。 循环程序包含四部分: 、初始化部分 (循环计数器、变量置初值) 、循环处理部分(主体,需要重复执行的部分
46、) 、循环控制部分(修改地址指针、修改变量、检测循环结束条件) 、循环结束部分(对结果分析、处理,存放结果),先处理,后判断:,先判断,后处理:,多重循环设计 循环体中还包含着一个或多个循环结构,即双重或多重循环。 例2、设8031使用12MHz晶振,试设计延迟100ms的延时程序。,内循环延时: (1 + 2 CTR)T = 500us(假设)则CTR = 250实际延时:1 + 2 250 1us = 501us外循环延时:T +(501 + 2T) CTS = 100ms = 100 000us所以 , CTS = 198.8 取 199实际延时:1 + (501 + 2)199 = 100.98ms,