第三章 MCS-51单片机指令系统及汇编语言程序设计内容提要:
§ 3-1 汇编语言与指令系统简介
§ 3-2 数据传送类指令
§ 3-3 算术运算类指令
§ 3-4 逻辑运算类指令
§ 3-5 控制转移类指令
§ 3-6 位操作类指令
§ 3-7 汇编语言的汇编过程§ 3-8 汇编语言的程序设计及应用高级语言,
§ 3-1 汇编语言与指令系统简介一、汇编语言程序设计的意义什么是程序?
完成某项特定任务的指令的集合。
计算机按程序一条一条地依次执行指令,从而完成指定任务。
要让计算机完成各项任务,就应设计各种程序。
汇编语言,
机器语言,
程序设计语言:
用二进制代码表示指令和数据。
用助记符表示指令操作功能,用标号表示操作对象。
独立于机器,面向过程,接近自然语言和数学表达式,
汇编语言程序的每一条语句都与计算机的某一条指令对应,所以必需熟悉指令系统。
指令 = 操作码 + 操作数操作码 ——表示了该指令所能执行的操作功能 。
操作数 ——表示参加操作的数的本身或操作数所在的地址。
MCS-51指令格式:
[标号,] 操作码助记符 [第一操作数 ] [,第二操作数 ] [;注释 ]
二,MCS-51系列单片机的指令系统
111条 指令,共分 五大类,
数据传送类;( 29条)
算术运算类;( 24条)
逻辑运算类;( 24条)
控制转移类;( 17条)
位操作类。( 17条)
指令中操作数的描述符号,
Rn —— 工作寄存器 R0 ~ R7
Ri —— 间接寻址寄存器 R0,R1
Direct —— 直接地址,包括内部 128B RAM单元地址、
26个 SFR地址。
#data —— 8位常数
#data 16 —— 16位常数
addr 16 —— 16位目的地址
addr 11 —— 11位目的地址
rel —— 8位带符号的偏移地址
DPTR —— 16位外部数据指针寄存器
bit —— 可直接位寻址的位
A —— 累加器
B —— 寄存器 B
C —— 进、借位标志位,或位累加器
@ —— 间接寄存器或基址寄存器的前缀
/ —— 指定位求反
( x) —— x中的内容
(( x)) ——x中的地址中的内容
$ —— 当前指令存放的地址三、寻址方式寻找操作数存放单元的地址的方式,共 6种方式。
1、立即数寻址所要找的操作数是一二进制数或十进制数,出现在指令中,
用,#”作前缀
MOV A,#20H
2,寄存器寻址操作数存放在工作寄存器 R0 ~ R7中,或寄存器 B中。
MOV A,R2
3,直接寻址指令中直接给出操作数的地址。
MOV A,30H
MOV 30H,DPH; 书 放在 甲 抽屉中; 甲 抽屉的钥匙放在 乙 抽屉中; 取 书,A中 20H
MOV 30H,#20H
MOV R0,#30H
MOV A,@R0
此例中,20H就当成是那本 书 ; 30H就当成是 甲 抽屉;
R0就当成是 乙 抽屉,执行的结果就是将 20H这个立即数装入 A中。
期间也经历了两次寻址,即间接寻址。
4、寄存器间接寻址指令中寄存器的内容作为操作数存放的地址,在工作上间接寻址寄存器前用,@”表示前缀。
例如,―一本 书 放在 甲 抽屉中,上了锁;其开锁的钥匙放在 乙抽屉中,乙 抽屉也上了锁。问如何才能取到哪本 书?”
这就是一个间接寻址的问题,要经过两次寻址才能找到哪本 书 。
而寄存器间接寻址也是同样。
例如,
5、变址寻址操作数地址 = 变地址 + 基地址基地址寄存器 DPTR 或 PC
变址寄存器 @A
该寻址方式常用于访问程序存储器,查表。
如 MOVC A,@A + DPTR
6,相对寻址把指令中给定的地址偏移量与本指令所在单元地址( PC内容)
相加得到真正有效的操作数所存放的地址。
例如,李同学 20岁,张同学比李同学大 3岁,问张同学多少岁?”
这就是一个相对寻年龄的问题,而相对寻址与此类似。
如 JC 60H ; 设( PC) = 2000H为基址,相对偏移量为 60H;; 则当 C = 1时,转移的目的地址 = 2000H + 2 + 60H
巩固新课:
1、汇编语言有何种特点?指令格式?
2,MCS—51系列机共有多少条指令?分几类?
3,MCS—51系列汇编语言指令有几种寻址方式?
§ 3-2 数据传送类指令一、内部 RAM数据传送类
1、一般数据传送指令
MOVC MOVX
片外程序存储器
ROM
EPROM
特殊功能寄存器
SFR
片内
RAM
128字节片外数据存储器
RAMMOV
PUSH
POP
XCH
XCHD
回忆前述操作数描述符,A,direct,Rn,@Ri,#data,
DPTR等。
经排列组合可写出下列指令:
MOV A,Rn ;( A) ( Rn) 以下类似。
MOV 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,@Ri
MOV Rn,@Ri
MOV #data,A
等 等指令是非法指令。
Х
Х
Х
Х
哇!好容易出错啊!
( 2) ( direct)
2、栈操作指令
PUSH direct
POP direct
不影响任何标志位。
PUSH direct 指令执行中,机器自动进行两步操作:
( 1) ( SP) + 1
例 1、设( SP) = 09H,( DPTR) = 0123H,分析:
执行 PUSH DPL
PUSH DPH
后,各单元中的内容。
( SP)
(( SP))
POP direct 指令执行中,机器也自动进行两步操作:
( 1)( direct) (( SP))
( 2)( SP) ( SP)- 1
例 2、设( SP) = 0BH,( 0BH) = 01H,( 0AH) = 23H
执行 POP DPH
POP DPL
后,各单元中的内容。
结论,1) PUSH 与 POP 操作过程刚好相反;
2) 进、出栈规则:
先进后出,后进先出。应注意指令书写先后顺序;
3) 可用于“保护现场,恢复现场”。
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,#04FFH
MOV R0,#0FAH
MOVX A,@R0
MOVX @DPTR,A
三,查表指令与 ROM之间的数据传送。
MOVC A,@A + DPTR
MOVC A,@A + PC
执行后会使 /PSEN有效。
MOVC 含义是传送常数。
以 DPTR 为基地址的指令,可在 ROM 的 64KB范围内查表;
而以 PC为基地址的指令只能在( PC) + 1为中心上、下 256B范围内查表。
例 4、设( A) = 一个 BCD码常数,试用查表法获得其相应的
ASCII码。
解法 I,MOV DPTR,#TAB
MOVC A,@.A+DPTR
TAB,DB 30H
DB 31H
DB 32H,33H,34H,35H
·····
解法 II,MOVC A,@A+PC
TAB,DB 30H,31H,32H,33H
DB 34H,35H,36H,37H
·····
小结:
数据传送类指令有几种类型?
是否影响标志位?
§ 3-3 算术运算类指令包括:加,减、乘、除;加一、减一。
一、加法指令
ADD A,Rn ;( A) ( A) + ( Rn) 以下类同。
ADD A,direct
ADD A,@Ri
ADD A,#data
无符号数相加时:若 C = 1,说明有溢出(其值 > 255)。
带符号数相加时:若 OV = D7c⊕D6c = 1,说明有溢出。
ADDC A,Rn ;( A) ( A) +( Rn) +( C); 以下类同。
ADDC A,direct
ADDC A,@Ri
ADDC A,#data
上述四条指令多用于多字节数相加。
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) = 7FH; ( 7EH) = 40H
执行,INC @R0
INC R0
INC @R0 后,
(R0)= 7FH; (7EH)= 00H; (7FH)= 41H
DA A ; 二 ——十进制调整指令。
执行过程中,CPU能根据加法运算后,累加器中的值和 PSW中的
AC及 C标志位的状况自动选择一个修正值( 00H,06H,60H、
66H) 与原运算结果相加,进行二 ——十进制调整。
( A3 ~ 0) > 9时或( AC) = 1时,( A3 ~ 0) ( A3 ~ 0) +6
( A7 ~ 4) > 9或( C) = 1时,( A7 ~ 4) ( A7 ~ 4) + 6
选择修正值的规则:
例 2、设( A) = 56H 为 56的压缩的 BCD码数,( R3) = 67H,
( CY) =1
执行 ADDC A,R3
DA A
结果为,124
注意,1) DA指令只能跟在加法指令后面使用;
2)调整前参与运算的两数是 BCD码数;
3) DA指令不能与减法指令配对使用,但可以实现对 A中压缩 BCD数进行减一操作。
例 3、设( A) =30H( 压缩 BCD码数),执行:
ADD A,#99H DA A
后,便实现了 30 - 1 = 29的操作。
例 4、两个 4位 BCD码相加,一个存放在( 31H)( 30H);
另一个存放在( 33H)( 32H); 和数拟回存在( 31H)
( 30H) 中,试编程实现之。
解,MOV R0,#30H
MOV R1,#32H
MOV A,@R0
ADD A,@R1
DA A
MOV @R0,A
INC R1
MOV A,@R0
ADDC A,@R1
DA A
MOV @R0,A
INC R0
二、减法指令
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
例 5、设( R0) =7FH,在内 RAM中,( 7EH) =00H,
( 7FH) =40H
执行,DEC @R0
DEC R0
DEC @R0
结果为,( R0) = 7EH,( 7EH) =0FFH,( 7FH) =3FH。
三、乘法和除法指令乘法:
MUL AB ;( A)×( B),积的低 8位在 A中,积的; 高 8位在 B中; C总为 0。
除法:
DIV AB ;( A)÷( B),商在 A中,余数在 B中。; 若( B) = 0,则结果不定,( OV) = 1,;( C) = 0。
例 6、试将 A中的二进制数转换为 3位 BCD码,其中,百位数存放于 31H单元,十位数和个位数压缩后存于 30H单元中。
解,MOV B,#100
DIV AB
MOV 31H,A
MOV A,#10
XCH A,B
DIV AB
SWAP A
ADD A,B
MOV 30H,A
小结:算术运算类指令都有哪些类型?
§ 3-4 逻辑运算类指令共分两大类:单字节逻辑操作,双字节逻辑操作,共 24条。
一、单字节逻辑操作指令
CLR A ;( A) 0
CPL A A中 8位按位求反。
循环左移、右移指令:
RL A
RLC A
RR A
RRC A
注:左移一位相当于乘 2;右移一位相当于除 2。
二、双字节逻辑操作指令
“与操作”:
ANL 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
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
这称为,指定位取反,。
在上述 ANL,ORL,XRL操作中,用于端口操作时,无论
P0 ~ P3是第一,还是第二操作数,都遵循,读 —修改 —写,
端口锁存器的操作。
小结:
1、逻辑操作分为哪两类操作?
2、循环移位指令每执行一次,移几位?
3,ANL,ORL,XRL指令有哪些使用技巧?
§ 3-5 控制转移类指令作用:改变程序计数器 PC的值,从而改变程序执行方向。
分为四大类,无条件转移指令; 条件转移指令; 调用指令;
返回指令。
一、无条件转移指令
LJMP addr16
AJMP addr11
SJMP rel
JMP @A + DPTR
LJMP addr16 ; 长跳转指令转移目的地址 addr16 ( PC),0000H ~ FFFFH,64KB
AJMP addr11 ; 绝对转移转移目的地址的形成:先( PC) ( PC) + 2;
然后 PC15 ~ 11不变,PC10 ~ 0 addr10 ~ 0
64KB = 216 =25× 211 = 32× 2KB
转移目的地址与( PC) + 2在同一个 2KB范围内。
SJMP rel ; 短转移,相对寻址。
转移目的地址 = ( PC) + 2 + rel,
所以 rel = 转移目的地址-( PC)- 2
但,实际使用中常写成 SJMP addr16,汇编时会自动转换成 rel。
JMP @A + DPTR ; 间接转移,散转移指令。
转移目的地址 = ( @A) + ( DPTR)
本指令不影响标志位,不改变 @ A 及 DPTR中的内容。常用于多分支程序结构中,可在程序运行过程中动态地决定程序分支走向。
例 1、设 A中为键值,试编写按键值处理相应事件的程序段。
解,MOV DPTR,#KYEG
MOV B,#03H
MUL AB
JMP @A + DPTR
………
KYEG,LJMP KYEG0
LJMP KYEG
………
比较 LJMP,AJMP,SJMP,JMP转移的起点和范围,
LJMP AJMP SJMP
JMP
LJMP AJMP SJMP JMP @A+DPTR
PC 64K
PC+2 PC+2
-128
+127
PC
PC+2
DPTR
256
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,转子程序。
二、调用指令例 2、设( SP) = 07H,( PC) = 2100H,子程序首地址为
3456H,执行:
LCALL 3456H
MOV A,20H LCALL
34H
56H
MOV
执行结果:( SP) = 09H,( 09H) = 21H,( 08H) = 03H,
( PC) = 3456H
SP 07H
SP
SP
08H
09H
2100H
3456H
外 ROM
内 RAM
PC
+3
PC 2103H
PC
03H
21H
· · · · · ·
转移范围与( 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
其机器自动操作过程如下:
比较两种返回指令含义上的异同点结论,RET返回地址事先已知,而 RETI的返回地址在程序执行中产生的,不固定。不影响标志位,但 PSW不能恢复到中断前的状态。
(( SP))
例 3、设( SP) = 0BH,( 0AH) = 23H,( 0BH) = 01H
执行,RET
01 23H MOV
SP 0BH
SP
SP
0AH
09H
3456H
外 ROM
内 RAM PC
PC
23H
01H
( PC) = 0123H( 返回主程序)
结果,( SP) = 09H,
23H01H(PC)=
空操作指令
NOP ; 空操作不执行任何操作,仅仅使( PC) + 1,继续执行下条指令,
不影响标志位,
在 ROM中占一个字节。用于延时调整。
小结:
1、长转移与长调用指令有何区别?
2、长转移、短转移及相对转移的跳转范围有什么不同?
二、条件转移指令实现按照一定条件决定转移的方向,分三类,
判零转移指令比较转移指令循环转移指令
JZ rel,若( A) = 0,则转移,否则顺序执行。
JNZ rel,若( A) ≠ 0,则转移,否则顺序执行。
转移目的地址 = ( PC) + 2 + rel
不影响任何标志位。
1、判零转移
JZ rel
JNZ rel
例 1、将外 RAM的一个数据块(首地址为 DATA1) 传送到内部数据 RAM( 首地址为 DATA2),遇到传送的数据为零时停止传送,试编程。
解,MOV R0,#DATA2
MOV DPTR,#DATA1
LOOP1,MOVX A,@DPTR
JZ LOOP2
MOV @R0,A
INC R0
INC DPTR
SJMP LOOP1
LOOP2,SJMP LOOP2
2、比较转移指令功能:比较二个字节中的值,若不等,则转移。
CINE A,#data,rel
CJNE A,direct,rel
CJNE @Ri,#data,rel
CJNE Rn,#data,rel
该类指令具有比较和判断双重功能,比较的本质是做减法运算,
用第一操作数内容减去第二操作数内容,但差值不回存。
转移目的地址 = ( PC) + 3 + rel
若第一操作数内容小于第二操作数内容,则( C) = 1,否则( C)
= 0。
该类指令可产生三分支程序:
即,相等分支;大于分支;小于分支。
A = B吗?
出口
Y NA > B吗?
入口
Y
N
1 2 3
例 2、设 P1口的 P1.0 ~ P1.3为准备就绪信号输入端,当该四位为全 1时,说明各项工作已准备好,单片机可顺序执行,否则,
循环等待。
解,MOV A,P1
ANL A,#0FH
CJNE A,#0FH,WAIT ; P1.0 ~ P1.3不为全 1时,返; 回 WAIT
MOV A,R2
………
3、循环转移指令
DJNZ Rn,rel ;( 二字节指令)
DINZ direct,rel ;( 三字节指令)
本指令也为双功能指令,即减 1操作和判断转移操作。
第一操作数内容减 1后,若差值不为零,则转移;否则顺序执行。
转移目的地址 = ( PC) + 2或 3 + rel
例 3、将 8031内部 RAM的 40H ~ 4FH单元置初值 #A0H ~
#AFH。
解,MOV R0,#40H
MOV R2,#10H
MOV A,#0A0H
LOOP,MOV @R0,A
INC R0
INC A
DJNZ R2,LOOP
………
小结,1、无条件转移指令共有几条?
2,CJNE指令与 DJNZ指令有何区别?
§ 3-6 位操作类指令包括:位传送指令、条件转移指令、位运算指令。
位操作由单片机内布尔处理器来完成。
位地址的四种表示:
1) 使用直接位地址表示;如 20H,30H,33H等;
2) 使用位寄存器名来表示;如 C,OV,F0等;
3) 用字节寄存器名后加位数来表示;
如 PSW.4,P0.5ACC.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、编程通过 P10线连续输出 256个宽度为 5个机器周期长的方波。
解,MOV R0,#00H
CLR P10
LOOP,CPL P10
NOP
NOP
DJNZ R0,LOOP
ANL C,bit ;( C) ( C) ∧ ( bit)
ANL C,/ bit ;( C) ( C) ∧ ( / bit)
ORL C,bit ;( C) ( C) ∨ ( bit)
ORL C,/bit ;( C) ( C) ∨ ( /bit)
三、位逻辑操作指令例 2、用软件实现下图所示的 P10 ~ P13间的逻辑运算。
解,MOV C,P1.1
ORL C,P1.2
ANL C,P1.0
MOV P13,C
P1.1
P1.2
P1.0
P1.3
&
1?
四、布尔条件转移指令有 5条,分别对 C和直接位地址进行测试,
并根据其状态执行转移。
1、判布尔累加器转移
JC rel ;( C) = 1,转移,否则顺序执行。
JNC rel ;( C) = 0,转移,否则顺序执行。
不影响标志。转移地址,( PC) ( PC) + rel
解,MOV A,30H
CJNE A,40H,LOOP
SETB 7FH
SJMP $
LOOP1,JC LOOP2
MOV 20H,A
MOV 21H,40H
SJMP $
LOOP2,MOV 20H,40H
MOV 21H,A
SJMP $
例 3、比较内部 RAM的 30H和 40H单元中的二个无符号数的大小,将大数存入 20H单元,小数存入 21H单元,若二数相等,则使内 RAM
的第 127位置 1。
2、判位变量转移
JB bit,rel ;( bit) = 1,则转移,否则顺序执行。
JBC bit,rel ;( bit) = 1,则转移,否则顺序执行,; 且无论( bit) 是否等于 1,均使该位清零。
JNB bit,rel ;( bit) = 0,则转移,否则顺序执行。; 不影响标志。
例 4、试判断 A中的正负,若为正数,存入 20H单元;若为负数则存入 21H单元。
解,JB ACC7,LOOP
MOV 20H,A
SJMP $
LOOP,MOV 21H,A
SJMP $
小结:
1、位操作指令分为几类?
2、位累加器 C与字节累加器 A有何区别?
§ 3-7 汇编语言及汇编过程一、汇编程序功能源程序
(汇编指令程序)
汇编 目标程序
(机器码指令程序)
汇编指令与机器码指令有一一对应的关系。
汇编程序是一种翻译程序,将源程序翻译成目标程序。
二、汇编程序的汇编过程汇编有两种方法:手工汇编、机器汇编。
1、手工汇编:
第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出;
第二次汇编:标号代真,将字符标号用所计算出的具体地址值或偏移量代换。
源程序 目标程序地址ORG 1000H
START,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
B64401
0A
DBF9
8A2A
80FE
2、机器汇编两次扫描过程。
第一次扫描,检查语法错误,确定符号名字;
建立使用的全部符号名字表;
每一符号名字后跟一对应值(地址或数)。
第二次扫描,是在第一次扫描基础上,将符号地址转换成地址(代真);
利用操作码表将助记符转换成相应的目标码。
三、伪指令伪指令是告诉汇编程序,如何汇编源程序的指令。
伪指令既不控制机器的操作,也不能被汇编成机器代码,
故称为伪指令。
1、起始地址伪指令 ORG ORG addr16
用于规定目标程序段或数据块的起始地址,
设置在程序开始处。
2、汇编结束伪指令 END
告诉汇编程序,对源程序的汇编到此结束。
一个程序中只出现一 次,在末尾。
3、赋值伪指令 EQU
告诉汇编程序,将汇编语句操作数的值赋予本语句的标号。
格式,标号名称 EQU 数值或汇编符号
,标号名称,在源程序中可以作数值使用,也可以作数据地址、
位地址使用。 先定义后使用,放在程序开头。
4、定义字节伪指令 DB
告诉汇编程序从指定的地址单元开始,定义若干字节存储单元并赋初值。
格式,[标号,] DB 字节数据或字节数据表
5、定义字伪指令 DW
从指定地址开始,定义若干个 16个位数据,高八位存入低地址;
低八位存入高地址。
例,ORG 1000H
PIOI,DW 7654H,40H,12,?AB‘
6、数据地址赋值伪指令 DATA
将表达式指定的数据地址赋予规定的字符名称格式,字符名称 DATA 表达式注:该指令与 EQU 指令相似,只是,可先使用后定义,
放于程序开头、结尾均可。
7、定义空间伪指令 DS
从指定地址开始,保留由表达式指定的若干字节空间作为备用空间。
格式,[标号,] DS 表达式例 2,ORG 1000H
DS 0AH
DB 71H,11H,11H ; 从 100BH开始存放; 71H11H,11H。
注,DB,DW,DS 只能用于程序存储器;
而不能用于数据存储器。
8、位地址赋值伪指令 BIT
将位地址赋予规定的字符名称。
格式,字符名称 BIT 位地址例 3,X1 BIT P12
相当于 X1 EQU 92H
小结,1、为什么要对汇编程序进行汇编?
2、机器汇编的过程是怎样的?
3、常用伪指令的功能各是什么?
§ 3-8 汇编语言程序的基本结构及应用举例程序编写做到,占用存储空间少; 运行时间短;
程序的编制、调试及排错所需时间短;结构清晰,易读、易于移植。
按结构化程序设计思想,任何复杂程序都可由顺序结构、
分支结构、
循环结构等构成。
语句 3
语句 2
顺序结构入口语句 1
出口分支结构入口条件满足否?
分支 1
出口
Y N
分支 2
循环结构入口处理修改条件条件满足否?
Y
出口
N
一、顺序程序举例例 1、设在外 RAM的 60H单元存有 1个字节代码,要求将其分解成两个
4位字段,高 4位存入原单元的低 4位,其低 4位存入 61H单元的低 4位,
且要求这两个单元的高 4位均为 0,试编制完整程序。
分析,# # # # ¥ ¥ ¥ ¥
0 0 0 0 # # # # 0 0 0 0 ¥ ¥ ¥ ¥
解,核心指令 ANL
ORL 1000H
MODE,MOV R0,#60H
MOVX A,@R0
MOV B,A
ANL A,#0F0H
SWAP A
MOVX @R0,A
ANL B,#0FH
MOV A,B
INC R0
MOVX @R0,A
END
二、分支结构与分支程序设计结构:根据不同的条件,进行相应的处理。
通常用条件转移指令形成简单分支结构。
如,判( A) = Z 或 NZ,转移判( CY) = 1 或 0,转移判( bit) =1 或 0,转移
CJNE 比较不相等转移例 3、设 a存放在累加器 A中,b存放在寄存器 B中,要求按下式计算 Y值,并将结果 Y存于累加器 A 中,试编写程序。
a-b ( a≥0 )
Y =
a+b ( a < 0)
解:本题关键是判 a是正数,还是负数;由 ACC.7便知。
ORG 1000H
BR,JB ACC.7,MINUS
CLR C
SUBB A,B
SJMP DONE
MINUS,ADD A,B
DONE,SJMP $
END
例 4、设有两个 16位无符号数 NA,NB分别存放在 8031单片机内部
RAM的 40H,41H及 50H,51H单元中,当 NA > NB时,将内部 RAM的
42H单元清 0;否则,将该单元置成全 1,试编程。
解法 I,因为无 16位数的比较指令,所以,只能用 8位数的比较指令。
(画出流程框图)
解,ORG 2000H
CMP,MOV A,50H
CJNE A,40H,CMP1
MOV A,51H
CJNE A,41H,CMP1
SJMP NHIGHE
CMP1,JC HIGHE
NHIGHE,MOV 42H,#0FFH
SJMP DONE
HIGHE,MOV 42H,#00H
DONE,SJMP $
END
解法 II,先假设 NA > NB,再来判断是否 NA ≤ NB
ORG 3000H
CMP2,MOV R0,#00H
MOV A,50H
CJNE A,40H,CMP3
MOV A,51H
CJNE A,41H,CMP3
SJMP NHIGHE
CMP3,JC HIGHE
NHIGHE,MOV R0,#0FFH ; 不大于标志
HIGHE,MOV 42H,R0
SJMP $
END
小结:
1、汇编程序有哪三种基本结构?
2、构成分支程序,常用到哪些判断语句?
顺序程序 —— 每条指令只执行一次;
分支程序 —— 根据不同条件,会跳过一些指令,而转去执行另一些指令共同点:每条指令至多执行一次。但是,实际中有时要求某程序段多次重复执行,需要采用循环结构。
循环结构不但使程序简练,而且大大节省存储空间。
循环程序包含四部分:
1,初始化部分 (循环计数器、变量置初值)
2,循环处理部分(主体,需要重复执行的部分)
3,循环控制部分(修改地址指针、修改变量、检测循环结束条件)
4,循环结束部分(对结果分析、处理,存放结果)
先修理,后判断:
开始初始化部分处理部分修改变量循环结束?
结束部分结束


先判断,后处理:
开始初始化部分修改变量循环结束?

结束部分结束
N 处理部分循环有:单循环、多重循环。
循环次数已知,可用计数器控制循环次数;
循环次数未知,按问题条件控制循环是否结束。
1、单循环程序
( 1)循环次数是已知的程序例 1、已知片外 RAM的 10H单元存放 8位二进制数,要求将其转移成相应的 ASCII码,并以高位在前,低位在后的顺序,依次存放到片外
RAM以 11H为首地址的连续单元中,试编程。
解:先将中间单元置成 30H,然后判欲转换位是否为 1,
若是,则将中间单元内容加 1;否则,中间单元内容保持不变。
通过左移指令实现由高到低的顺序进行转换。
START,MOV R2,#08H ; 循环计数初值(循环次数已知)
MOV R0,#10H ; 地址指针初值
MOVX A,@R0 ; 取数
MOV B,A ; 暂存 B中
LOOP,MOV A,#30H ; 将中间单元( A) 置成 30H
JNB B.7,NA ; 判断转换的二进制位为 0否?
INC A ; 若为 1,则变成 1的 ASCII码,31H‖
NA,INC R0 ; 修改地址指针
MOVX @R0,A ; 存放转换的结果
MOV A,B
RL A,B ; 作好准备,判断下一位
MOV B,A ; 暂存
DJNZ R2,LOOP ; 判断转换结束否?未完继续
SJMP $
( 2)循环次数未知的程序例 2、设用户用键盘输入长度不超过 100字节的字符串放在 8031单片机外部 RAM以 20H为首地址的连续单元,该字符串用回车符 CR(?CR‘=
0DH) 作为结束标志,要求统计此字符串的长度并存入内部 RAM的
1FH单元中。
解:从首单元开始取数,每取一数判断其是否为 ‘ CR‘,是则结束。
ORG 1000H
STADA DATA 20H
SLANG DATA 1FH
CMCR2,MOV R0,#STADA-1
MOV B,#0FFH
CRLOP,INC R0
INC B
MOVX A,@R0
CJNE A,#0DH,CRLOP
MOV SLANG,B
SJMP $
END
2、多重循环设计循环体中还包含着一个或多个循环结构,即双重或多重循环。
例 3、设 8031使用 12MHz晶振,试设计延迟 100ms的延时程序。
解:延时程序的延迟时间就是该程序的执行时间,通常采用 MOV
和 DJNZ二指令。
T = 12 / fosc = 12 / ( 12× 106) = 1us
ORG 1000H
DELAY,MOV R2,#CTS ; T = 1us
LOOPS,MOV B,#CTR ; T = 1us
LOOPR,DJNZ B,LOOPR ; 2T = 2us
DJNZ R2,LOOPS ; 2T = 2us
END
内循环外循环内循环延时:
( 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] = 1000.98ms
例 4、设在 8031内部 RAM中存一无符号数的数组,其长度为 100,起始地址是 30H,要求将它们从大到小排序,排序后仍存放在原区域中,试编者按程。
解,先举四个数排序的例子内 RAM 第一次外循环 第二次外循环 第三次外循环
30H 0 0 0 3 0 3 0 6
31H 0 3 0 2 0 6 0 3
32H 0 2 0 6 0 2 0 2
33H 0 6 0 0 0 0 0 0
共 4 – 1 = 3 次外循环这就是所谓的,冒泡法,。
4个数排序最多经过 3 次外循环就可排出,每次外循环都包含 3次内循环。实际上大多情况不用 3 次外循环就可排完。
对于 100个数排序也是如此,用不到 99次循环,排序就结束。为了提高排序速度,程序中可设一交换标志位,如 10H位,
每次循环中:若有交换则 SETB 10H
若无交换则 CLR 10H
每次循环结束时,测 10H位,判断排序是否结束 。
ORG 1000H
BUBBLE,MOV R0,#30H
MOV B,#64H
CLR 10H
DEC B ; 长度计数
LOOP,MOV A,@R0 ; 内循环的入口
MOV 20H,A ; 暂存,为交换作准备
INC R0
MOV 21H,@R0
CJNE A,21H,BUEU ; 若( 20H) ≠ ( 21H) 转移
BUEU,JNC BUNEXT ;( 20H) ≥ ( 21H) 转移
MOV A,@R0 ; 若( 20H) < ( 21H) 则交换
MOV @R0,20H
DEC R0 ; 使 R0退格指向小地址
MOV @R0,A
INC R0 ; 恢复 R0指向大地址
SETB 10H ; 置交换标志
BUNEXT,DJNZ B,LOOP ; 内循环是否结束的判断
JB 10H,BUBBLE ; 判断标志位为 1否?外循环结;束的判断
END
小结:
1、循环程序包括几部分内容?
2,何谓单循环,多重循环?
3、何谓循环程序的先判断,后处理;
先处理,后判断?