内容正文:
四川省(电子信息大类)对口招生《单片机原理与应用》
复习讲义
模块 3 单片机指令系统
考点七 伪指令
【考纲要求】
1.理解伪指令的意义。
2.能识读和简单运用单片机指令。
【知识网络】
【知识和技能要点】
位操作类指令
伪指令的作用:在MCS-51汇编语言源程序中向汇编程序发出的指示信息,告诉它如何完成汇编工作。也称为汇编程序控制命令。只有在汇编前的源程序中才有伪指令。经过汇编得到目标程序(机器代码)后,伪指令已无存在的必要,所以“伪”体现在汇编时,伪指令没有相应的机器代码产生。
常用的伪指令:
1.ORG汇编起始地址命令
在汇编语言源程序的开始,通常都用一条ORG伪指令来实现规定程序的起始地址。如不用ORG规定,则汇编得到的目标程序将从0000H开始。例如:
ORG 2000H
START:MOV A,#00H
┋
规定标号START代表地址为2000H开始。
在一个源程序中,可多次使用ORG指令,来规定不同的程序段的起始地址。但是,地址必须由小到大排列,地址不能交叉、重叠。
2.END汇编终止命令
汇编语言源程序的结束标志,用于终止源程序的汇编工作。在整个源程序中只能有一条END命令,且位于程序的最后。
3.DB定义字节命令
在程序存储器的连续单元中定义字节数据。
ORG 2000H
DB 30H,40H,24,“C”,“B”
汇编后:
(2000H)=30H
(2001H)=40H
(2002H)=18H(10进制数24)
(2003H)=43H(字符“C”的ASCII码)
(2004H)=42H(字符“B”的ASCII码)
DB功能是从指定单元开始定义(存储)若干个字节,10进制数自然转换成16进制数,字母按ASCII码存储。
4.DW定义数据字命令
从指定的地址开始,在程序存储器的连续单元中定义16位的数据字。例如:
ORG 2000H
DW 1246H,7BH,10
汇编后:
(2000H)=12H;第1个字
(2001H)=46H
(2002H)=00H;第2个字
(2003H)=7BH
(2004H)=00H;第3个字(2005H)=0AH
(2005H)=0AH
5.EQU(EQUate)赋值命令
用于给标号赋值。赋值以后,其标号值在整个程序有效。例如:
TEST EQU 2000H
表示标号TEST=2000H,在汇编时,凡是遇到标号TEST时,均以2000H来代替。
EQU指令用于为程序中的任意标号赋值。程序中的常量通常可以用标号代替,便于修改。主程序前要先用equ指令为常量标号赋值。
6.预留存储空间伪指令DS:
[标号:]DS表达式
该伪指令的功能是从标号地址开始,保留若干个字节的内存空间以备存放数据。保留字节单元数由表达式的值决定。
7.位地址定义伪指令BIT
标号:BIT位地址
该伪指令的功能是将位地址赋予BIT前面的标号,经赋值后可用该标号代替BIT后面的位地址。例如:
PLG:BIT FO
AI:BIT P1.0
经以上伪指令定义后,在程序中就可以把FLG和AI作为位地址来使用。
8.数据地址赋值伪指令:
字符名称 DATA 表达式
该伪指令的功能是将表达式指定的数据地址赋予规定的字符名称。
该指令与EQU相似,只是可先使用后定义,放在程序开头,结尾均可。
【练习题】
1、 填空题
1.假定累加器A中的内容为30H,执行指令
1000H:MOVC A,@A+PC
后,把程序存储器 ________ 单元的内容送入累加器A中。
2.ORG 2000H
LCALL 4000H
ORG 4000H
ADD A,R2 执行完LCALL指令后,PC= ________ 。
3.用一条指令 ____________________ 可以取代下列4条指令:
MOV DPTR,#1234H
PUSH DPL
PUSH DPH
RET
4.已知SP=25H,PC=2345H,(24H)=12H,(25H)=34H,(26H)=56H。问此时执行“RET”
指令后,SP=______________ ,PC=______________ 。
5.若VAL EQU 20H,则指令MOV A,VAL的源操作数寻址方式为______。
6.伪指令______用于将一个符号赋值为位地址,仅作用于可位寻址空间。
二、选择题
1. 执行下列程序后,累加器A的内容为 ( ) 。
ODG 0000H
MOV A, #00H
ADD A, #02H
MOV DPDR, #0050H
MOVC A, @A+DPDR
MOV @R0, A
SJMP $
ORG 0050H
BAO: DB 00H,08H,0BH,6H,09H,0CH
END
A.00H B.0BH C.06H D.0CH
2.执行下列程序后,内部RAM 30H单元的内容是( ) 。
MOV 30H,#00H
MOV R0,#30H
MOV A, 30H
ADD A, #04H
MOVC A, @A+PC
MOV @R0, A
SJMP $
TDB:DB 00H ,01H ,02H,03H,05H
A.00H B.02H C.05H D.30H
3.下列指令判断若P1口最低位为高电平就转LP,否则就执行下一句的是( )。
A.JNB P1.0,LP B.JB P1.0,LP C.JC P1.0,LP D.JNZ P1.0,LP
4.LCALL指令操作码地址为2000H,执行完子程序返回指令后PC=( )
A.2000H B.2001H C.2003H D. 2001H
5.以下指令中,哪条指令执行后使标志位CY清0( )
A. MOV A,#00H B. ADD A,#00H C. MOVX A,@R2 D.CLR A
6.下列字定义的数表中,( )是错误的。
D.A.DW "AA" B.DW "A" C. DW "OABC" D.DW OABCH
7..MCS-51指令系统中,格式为:ORG16位地址的指令功能是( )
A.用于定义字节 B.用于定义字
C.用于定义汇编源程序的起始地址 D.用于定义某特定位的标识符
8.下列关于51单片机伪指令的描述,错误的是( )
A. EQU定义的符号不允许重复赋值
B. BIT只能用于定义可位寻址区的位地址
C. ORG可以在程序中多次使用,指定不同存储区域
D. DB和DW均可用于定义程序存储器中的执行指令
9.伪指令DATA 30H与EQU 30H的核心区别是( )
A. DATA可重复定义,EQU不可
B. EQU可重复定义,DATA不可
C. DATA只能定义字节,EQU只能定义位地址
D. 无本质区别
10.关于END伪指令,说法正确的是( )
A. 程序中可写多个END,CPU执行到第一个停止
B. 仅告知汇编器结束编译,不生成机器码
C. 会生成一条跳转指令,让程序跳转到结束位置
D. 必须写在数据定义伪指令之前
三、判断题
1..MCS—51指令系统中,执行指令ORG 2000H;BCD: DB “A,B,C,D”表示将A、B、C、D的ASII码值依次存入2000H开始的连续单元中。( )
2.EQU定义的符号必须在使用前定义,而DATA可以先使用后定义。( )
3.指令INC DPTR会影响PSW中的溢出标志OV。( )
4.伪指令DB定义的数据存储在程序存储器中,运行时只能读取不能修改。( )
5.执行MOV R1,A后,累加器A的值会被清零。( )
6.ORG伪指令的地址设置不能超过51单片机程序存储器的最大寻址范围。( )
7.指令SJMP $的功能是原地跳转,构成死循环,常用于程序结尾。( )
8.所有数据传送类指令都不会影响程序状态字PSW的任何标志位。( )
四、分析题
1.下面程序执行后(SP)=____________,(A)=____________,(B)=____________,并解释每条指令的作用。
ORG 2000H
MOV SP,#40H
MOV A,#30H
LCALL 2500H
ADD A,#10H
MOV B,A
HERE: SJMP HERE
ORG 2500H
MOV DPTR,#2009H
PUSH DPL
PUSH DPH
RET
2. 下面的程序段经汇编后,从2000H开始的各有关存储器单元的内容是什么?
ORG 2000H
TAB:DW 10H,20H
DW 2100H,23H
DW TAB:
DB 'WORK'
3.已知(SP)=60H,子程序SUBTRN的首地址为0345H,现执行位于0123H的ACALL SUBTRN双字节指令后,(PC)=_________,(61H)=__________,(62H)= _________。
【答案】
一、填空题
1.1031H
2.4000H
解析:LCALL 是长调用,执行后PC直接跳转到目标地址4000H。
3.LJMP 1234H
解析:压栈DPTR再RET = 间接长跳转,等价 LJMP。
4.SP=23H,PC=3412H
解析:
○RET 弹栈2次:SP从25H → 23H
○先弹(25H)=34H→PCH,再弹(24H)=12H→PCL,PC=3412H
5.立即寻址
解析:VAL EQU 20H 是常量,MOV A,#VAL 属于立即寻址。
6.BIT
解析:BIT 伪指令专门给可位寻址空间赋值符号。
二、选择题
1.B. 0BH
解析:A=02H,@A+DPTR=0052H,查表DB第3个数据是0BH。
2.C. 05H
解析:A=04H,@A+PC 指向 TDB+4 位置,数据是05H。
3.B. JB P1.0,LP
解析:JB = 为1跳转;JNB=为0跳转。
4.C. 2003H
解析:LCALL 3字节,返回PC=2000H+3=2003H。
5.B. ADD A,#00H
解析:只有算术运算会影响CY,ADD A,#0 会清CY。
6.C. DW "OABC"
解析:DW只能存1个字(2字符/16位数),"OABC"是4字符,非法。
7.C. 定义汇编源程序的起始地址
8.D. DB和DW均可用于定义程序存储器中的执行指令
解析:DB/DW是数据定义,不是可执行指令。
9.A. DATA可重复定义,EQU不可
10.B. 仅告知汇编器结束编译,不生成机器码
三、判断题
1.√
2.√
3.×(INC DPTR 不影响任何标志位)
4.√(程序存储器ROM只读)
5.×(传送不改变源操作数)
6.√
7.√
8.×(如MOV A,direct 不影响,但带进位/算术指令会影响)
四、分析题
1. 执行结果
SP=42H,A=40H,B=40H
以下是程序中每条指令的详细作用说明:
ORG 2000H
这是一个伪指令,它指定了接下来的程序代码从程序存储器的 2000H 地址开始存放。
MOV SP, #40H
将十六进制数 40H 赋值给堆栈指针寄存器 SP。执行后,(SP) = 40H,这设置了堆栈的起始位置。
MOV A, #30H
将十六进制数 30H 赋值给累加器 A。执行后,(A) = 30H。
LCALL 2500H
长调用指令。它会执行两个操作:
保护断点:将下一条指令 ADD A, #10H 的地址(即 2008H)压入堆栈,以便子程序执行完毕后能正确返回。压栈时 SP 会先加1再存入数据,因此返回地址的低字节和高字节会依次存入 41H 和 42H 单元,最终 (SP) 变为 42H。
跳转:将程序计数器 PC 的值设置为 2500H,程序跳转到该地址开始执行子程序。
ADD A, #10H
将累加器 A 的值与立即数 10H 相加,结果存回 A。此指令在 LCALL 返回后执行。执行前 (A) = 30H,执行后 (A) = 30H + 10H = 40H。
MOV B, A
将累加器 A 的当前值传送给寄存器 B。执行后,(B) = (A) = 40H。
HERE: SJMP HERE
这是一个无限循环,程序执行到这里后会一直原地跳转,相当于程序结束并停在此处。
📜 子程序部分
ORG 2500H
指定子程序的代码从程序存储器的 2500H 地址开始存放。
MOV DPTR, #2009H
将十六进制数 2009H 赋值给16位的数据指针寄存器 DPTR。此时,高8位 DPH = 20H,低8位 DPL = 09H。
PUSH DPL
将 DPL 的内容压入堆栈。执行时 SP 先加1变为 43H,然后将 DPL 的值 09H 存入 43H 内存单元。
PUSH DPH
将 DPH 的内容压入堆栈。执行时 SP 先加1变为 44H,然后将 DPH 的值 20H 存入 44H 内存单元。
RET
子程序返回指令。它会从堆栈中弹出之前由 LCALL 指令保存的返回地址(2008H)到程序计数器 PC 中,使程序返回到主程序继续执行。执行此指令时,堆栈指针 SP 会减去2,恢复到调用子程序后的状态,即 (SP) = 42H。
2. 2000H 开始存储器内容
2000H: 00H 2001H:10H
2002H: 00H 2003H:20H
2004H: 21H 2005H:00H
2006H: 00H 2007H:23H
2008H: 00H 2009H:20H
200AH: 57H 200BH:4FH
200CH:52H 200DH:4BH
•DW 存高字节在前
•DB 'WORK' = 57H,4FH,52H,4BH
3. ACALL 执行结果
•PC=0345H
•(61H)=25H
•(62H)=01H
解析:
ACALL 是2字节指令,当前地址0123H,下一条PC=0125H
压栈:先低字节25H→61H,再高字节01H→62H
SP从60H → 62H
【真题演练】
1.(25单招,单选题)MCS-51单片机中,RETI指令的功能是( )
A.中断程序调用 B.子程序调用
C.中断程序返回 D.子程序返回
【答案】
1.C
原创精品资源学科网独家享有版权,侵权必究
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$