(C)调用指令的下一条指令的首地址 (D)返回指令的末地址
6. 以下各项中不能用来对内部数据存储器进行访问的是(A)
(A)数据指针DPTR (B)按存储单元地址或名称 (C)堆栈指针SP
(D)由R0或R1作间址寄存器
(三)其他类型题
1. 判断下列指令的合法性(合法打“√”,非法打“×”)
MOV A, @R2 (×) MOV R0, R1 (×) INC DPTR MOV PC, #2222H (×) DEC DPTR (×) RLC R0 MOV 0E0H, @R0 (√) CPL R5 (×) CLR R0 CPL F0H (×) PUSH DPTR (×) POP 30H MOVX A, @R1 (√) MOV A, 1FH (√) MOV C, 1FH MOV F0, ACC.3 (×) MOV F0, C (√) MOV P1, R3 MOV DPTR, #0FCH(×) CPL 30H (√) PUSH R0 MOV C, #0FFH (×) MOV A, #0D0H(√) 2. 利用位操作指令序列实现下列逻辑运算。 (1)D=(10H?P1.0)?(11H?CY)
MOV C, P1.0 ORL
C, /10H
MOV F0, C ORL C, 11H ANL
C, F0
MOV D, C
(2)E=ACC.2?P2.7?ACC.1?P2.0
MOV C, ACC.2 ANL C, P2.7 ORL C, ACC.1 ANL
C, P2.0
MOV E, C
3. 编写程序将内部RAM 20H ~ 23H单元的高4位写1,低4位写0。
6
√)√)×) (√) (×) (×) ( ( (√) ( 分析:就是把内部RAM 20H ~ 23H这4个单元写入0F0H。用一个DJNZ的循环。
ORG
0000H
; R0指向20H单元 ; 4个单元 ; 写入
MOV R0, #20H
MOV R1, #04H
LOOP: MOV @R0, #0F0H
INC
R0
DJNZ R1, LOOP END
; 循环4次
4. 在m和m+1单元中存有两个BCD数,将他们合并到m单元中,编写程序
完成。
ORG
0030H
; 将m单元中的BCD数送入累加器A ; 把m单元的高4位清0
; 将m单元中的BCD数移入高4位 ; m单元高4位为BCD数,低4位为0 ; 指向m+1单元
; 将m+1单元中的BCD数送入累加器A ; 把m+1单元的高4位清0 ; 指向m单元
; 将和m+1单元和m单元内容合并 ; 合并后结果送m单元
MOV R0, #m MOV A, @R0 ANL
A, #0FH
SWAP A
MOV @R0, A INC
R0
MOV A, @R0 ANL
A, #0FH
DEC R0 ORL
A, @R0
MOV @R0, A END
5. 将内部RAM中从data单元开始的10个无符号数相加,其和送sum单元。
假定相加结果小于255。编写程序完成。
ORG
0030H
MOV R0, #10 ; 给 R0 置计数器初值 MOV R1, # data CLR
; 数据块首址送R1
A ; A清零
7
LOOP: ADD
INC
A, @R1 ; 加一个数
R1 ; 修改地址,指向下一个数
; R0 减 1,不为零循环
DJNZ R0, LOOP
MOV sum, A ; 存 10 个数相加和 END
6. 假定8位二进制带符号数存于R0中,要求编写一个求补(取反)程序,所
得补码放入R1中。
分析:对存于R0中的二进制带符号数,如果是正数,则将其变成绝对值相等的负数(用补码表示);如果是负数(用补码表示),则将其变成绝对值相等的正数。
ORG
0030H
; 将带符号数送入A
MOV A, R0 CPL ADD
A A, #01H
; 末位加 1 ; 补码存入R1
MOV R1, A END
第4章 单片机汇编语言程序设计
(一)填空题
1. 假定A=40H,R1=23H,(40H)= 05H。执行以下两条指令后,A=(25H),
R1=(40H),(40H)=(03H)。
XCH
A, R1
; A=23H,R1=40H ; A=20H,(40H)=03H
XCHD A, @R1
2. 假定80C51的晶振频率为6 MHz,执行下列程序后,在P1.1引脚产生的方
波宽度为(5.804ms) START: SETB P1.1 DL: DL0: DL1:
; P1.1置1(1周期) ; 30H置初值(1周期) ; 31H置初值(1周期)
; 31H减1,不为0重复执行(2周期) ; 30H减1,不为0转DL0(2周期)
8
MOV 30H, #03H MOV 31H, #0F0H DJNZ 31H, DL1 DJNZ 30H, DL0
CPL P1.1
; P1.1取反(1周期) ; 转DL(2周期)
SJMP DL
方波宽度={[(2*15*16+2+1)*3]+[(2*15*16+2+1)*3+1+2+1]}*2=5804?s
3. 下列程序中,X、Y和Z为输入的8位无符号二进制数,F为输出的逻辑运
算结果。试画出该程序所模拟的组合逻辑电路。
MOV A, X ANL
A, Y
MOV R1, A MOV A, Y XRL CPL ORL
A, Z A A, R1
MOV F, A
F=?X?Y???Y?Z? X&?1Y&F?1&Z
4. 分析下列跳转程序,程序中A与30H单元中的数都是符号数,说明当(A=
(30H))时转向LOOP1,当(A>(30H))时转向LOOP2,当(A<(30H))时转向LOOP3。
MOV R0, A ANL
A, #80H
; R0←A
9
JNZ NEG ; A<0,转NEG
MOV A, 30H ANL JNZ
A, #80H LOOP2
; A≥0,(30H) <0,转LOOP2 ; A≥0,(30H)≥0,转COMP
SJMP COMP
NEG: MOV A, 30H
ANL JZ
A, #80H LOOP3
; A<0,(30H) ≥0,转LOOP3
COMP: MOV A, R0
CJNE A, 30H, NEXT SJMP LOOP1
NEXT: JNC
JC
LOOP2 LOOP3
; A≠(30H),转NEXT ; A=(30H),转LOOP1 ; A>(30H),转LOOP2 ; A<(30H),转LOOP3
综上分析可知,当A=(30H)时转向LOOP1,A>(30H)时转向LOOP2,A<(30H)时转向LOOP3。
5. 假定80C51的晶振频率为6 MHz,下列程序的执行时间为(30.696ms)。已
知程序中前2条指令机器周期数为1,后4条指令机器周期数为2。
MOV R3, #15
DL1: DL2:
MOV R4, #255 MOV P1, R3 DJNZ R4, DL2 DJNZ R3, DL1
RET
1周期 1周期 2周期 2周期 2周期 2周期
执行时间:T={[(2+2)*255+2+1]*15+2+1}*2=30696?s
(二)编程题
1. 把长度为10H的字符串从内部RAM的输入缓冲区inbuf向位于外部RAM的
输出缓冲区outbuf传送,一直进行到遇见回车或整个字符串传送完毕,试编程实现。
10