天津大学出版社的单片机课后习题答案文档格式.docx
《天津大学出版社的单片机课后习题答案文档格式.docx》由会员分享,可在线阅读,更多相关《天津大学出版社的单片机课后习题答案文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
P81
3.逻辑运算指令:
主要用来作“与”、“或”、“异或”、“清除”“求反”及“左右移位”等逻辑运算。
P88
4.位操作指令:
主要用来作“与”、“或”、“清除”、“置位”“求反”等布尔操作及“位传送”操作。
P90
5.控制转移指令:
主要用于改变程序计数器PC的值,以控制程序执行的走向,有转移、调用及返回操作.P91
3-3变址寻址和相对寻址中偏移量的异同点
变址寻址:
@A+DPTR;
基址:
DPTR,变址:
A
@A+PC;
PC当前值,变址:
变址:
A中为8位二进制无符号数偏移量(A)∈[0,255]即[00H,0FFH]
相对寻址:
相对偏移量为8位二进制带符号数的补码
rel∈[-128,+127]
[rel]补码∈[00H,0FFH]
相同点:
偏移量∈[00H,0FFH]
不同点:
变址寻址中偏移量为8位二进制无符号数;
相对寻址中偏移量为8位二进制带符号数的补码
3-4指出下面每条指令的寻址方式:
MOVA,#30H–寄存器、立即–30H立即数
MOVC,30H–寄存器、位–30H位地址
MOVXA,@DPTR–寄存器、间接
jCLAB1–相对
MOV30H,@R1–直接、间接–30H字节地址
MOV30H,R5–直接、寄存器–30H字节地址
MOVCA,@A+PC–寄存器、变址
sjmpLAB2–相对
3-5运行下列程序后各单元及A、PSW的内容
(1)
1.
MOVA,#2;
(A)=02H00000001(psw)
MOVR1,#30H;
(R1)=30H00000001
MOV@R1,A;
((R1))=(30H)=02H00000001
MOV35H,R1;
(35H)=30H00000001
XCHA,R1;
(A)=30H,(R1)=02H00000000
2.
MOVA,#0F5H;
(A)=0F5H00000000
MOV30H,#9BH;
(30H)=9BH
MOVR0,#30H;
(R0)=30H
ADDA,#28H;
(A)=1DH
ADDCA,@R0;
(A)=0B9H01000001
3.
CLRC;
(CY)=0
MOV40H,#7AH;
(40H)=7AH
MOVA,#92H;
(A)=92H00000001
MOVR0,#40H;
(R0)=40H
SUBBA,@R0;
(A)=92H-7AH-0=18H,(PSW)=44H
4.
MOVA,#79H;
(A)=79H00000001
MOV30H,#89H;
(30H)=89H
ADDA,30H;
(A)=02H
DAA;
(A)=68H
SWAPA;
(A)=86H
3-6写出能完成下列数据传送的指令
⑴ R1内容传送到R0
MOVA,R1;
MOVR0,A
(2)内部RAM25H单元内容送到35H单元
MOV35H,25H或MOVA,25H;
MOV35H,A;
MOV35H,25H
(3)内部RAM25H单元内容送到P1口
① MOVA,25H;
MOVP1,A;
② MOVP1,25H;
③ MOV90H,25H
(4)内部RAM40H单元内容送外部RAM2005H单元
MOVA,40H;
MOVDPTR,#2005H;
MOVX@DPTR,A
(5)外部RAM3000H单元内容送内部RAM25H单元
MOVDPTR,#3000H;
MOVXA,@DPTR;
MOV25H,A
(6)外部ROM1000H单元内容送内部RAM35H单元
MOVDPTR,#1000H;
CLRA;
MOVCA,@A+DPTR;
MOV35H,A
(7)外部ROM4000H单元内容送外部RAM4000H单元
MOVDPTR,#4000H;
CLRA;
(8)外部RAM1000H单元内容送SP堆栈指针
MOVXA,@DPTR;
MOVSP,A
3-7BCD码减法,求7954H-4157H=3797H。
算法1:
999AH-4157H=5843H
5843H+7954H并调整
ORG0000H
BCDS:
MOVA,#9AH
CLRC
SUBBA,#57H
MOV30H,A
MOVA,#99H
SUBBA,#41H
MOV31H,A
MOVA,#54H
ADDA,30H
DAA
MOV20H,A
MOVA,#79H
ADDCA,31H
MOV21H,A
CPLC
MOV2FH,C
SJMP$
END
循环程序
ORG0000H
BCDS1:
MOV20H,#54H
MOV21H,#79H
MOV30H,#57H
MOV31H,#41H
MOVR0,#30H
MOVA,#9AH
SUBBA,@R0
MOV40H,A
INCR0
MOV41H,A
MOVR0,#40H
MOVR1,#20H
MOVR2,#2
LOOP:
MOVA,@R0
ADDCA,@R1
MOV@R0,A
INCR1
DJNZR2,LOOP
MOV7FH,C
3-7顺序程序算法2
ADDA,20H;
DAA;
CY)=0
CPLC;
(CY)=1
ADDA,21H
SJMP$
3-8写出下段程序中每一步A、B中的结果
MOVA,#22H;
(A)=22H
MOVB,#05H;
(B)=05H
MOVR0,#08H
MULAB;
(A)=0AAH,(B)=0 00000000
MOVB,R0
DIVAB;
(A)=15H,(B)=02H00000001
3-9试写出完成如下操作的程序
(1)ORG0000H
MOVDPTR,#1000H
MOVXA,@DPTR
ANLA,#B
MOVX@DPTR,A
SJMP$
(2)ORL50H,#00001111B
(3)XRL50H,#B
(4)MOV50H,#B
(5)XRL50H,#0FFH
3-1030H开始的20个单元数据传送到外部3000H
MOVDPTR,#3000H
MOVR7,#20
Loop1:
MOVA,@R0
INCDPTR
DJNZR7,Loop1
3-11根据R3条件转移1
CjneR3,#15,NEQ
sjmpL1;
=15
NEQ:
jnCL1;
>
15
sjmp$;
<
L1:
nop;
≥15
.
sjmpHalt
jCL1;
Halt:
≥15
sjmpL1
jCL1
sjmp$
≤15
jnCL1
3-11根据R3条件转移2
MOVA,R3
SUBBA,#15
JNCGE15;
….
(R3)-15
ORG0100H
JCGE15;
MOVA,#15
SUBBA,R3
15-(R3)
>15
3-12已知(SP)=53H,(PC)=37FEH执行:
ACALL3A00H后:
(SP)=(SP)+2=55H
(PC)=3A00H
((SP-1))=(54H)=00H;
PCL
((SP))=(55H)=38H;
PCH
37FEH:
ACALL3A00H
3800H:
第四章汇编语言程序设计思考题与习题4及答案
4-13试编程实现将20H单元的两位BCD数相乘,结果以BCD码的形式存于21H单元当中。
4-13-1ORG0000H
MOV20H,#56H
MOVA,20H
ANLA,#0FH
MOVB,A
ANLA,#0F0H
SWAPA
MOVR2,A
DECB
ADDA,R2
DAA
DJNZB,LOOP
4-13-2
MOVR0,#21H
MOV21H,#0
XCHDA,@R0
MOVB,@R0
4-7设一个加数在50H~52H单元中,另一个加数在53H~55H中,进位存放在位地址00中,试编程实现两数求和。
ORG000H
ONEDATA50H
TWODATA53H
WEIBIT00H
MOVR0,#ONE
MOVR1,#TWO
;
MOVC,WEI
MOVR2,#3
MOVWEI,C
4-7-2
SETBRS0
MOVR0,#58H
CLRRS0
4-11试用除法指令将20H单元的两位BCD码变成ASCII码后存入21H和22H单元。
MOV20H,#67H
MOVB,#10H
DIVAB
ADDA,#30H
ORLB,#30H
MOV22H,B
4-1从20H单元开始存放一组带符号数,其数目已存在1FH单元。
要求统计出大于0、小于0和等于0的个数并存于ONE、TWO、THREE三个单元。
ONEEQU30H
TWOEQU31H
THREEEQU32H
NUMEQU1FH
MOVNUM,#0FH
MOVR0,#20H;
-1,2,34,0A0H,0....
MOVR1,#ONE
MOV@R1,#0
CJNER1,#34H,LOOP
LOOP1:
JZMTHREE
JB,MTWO
INCONE
SJMPDJNZZ
MTHREE:
INCTHREE
MTWO:
INCTWO
DJNZZ:
INCR0
DJNZNUM,LOOP1;
NUM=0FH
4-5在用JMP指令实现128分支的程序中,试用LJMP代替AJMP指令。
修改后的程序有何特点最多能实现多少分支
4-5
AJMP指令表128分支占128*2=256字节MEMORY
LJMP指令表可以实现256/3=85个分支
特点:
各分支可在64KB存储器中转移。
4-2设自变量X为一无符号数,存放在内部RAM的VAX单元,函数Y存放在FUNC单元,请编出满足如下关系的程序:
XX≥50
Y=5X50>X≥20
2XX<20
VAXEQU30H
FUNCEQU31H
MOVVAX,#55;
15;
20;
25;
50;
55
MOVA,VAX
CJNEA,#20,DO1
DO1:
JNCDO2
MOVB,#2
MULAB
SJMPMEM
DO2:
CJNEA,#50,DO3
DO3:
JNCMEM
MOVB,#5
MEM:
MOVFUNC,A
X
Y
2X=30=14H
50
X=50=32H
20
5X=100=64H
X=55=37H
25
5X=125=7DH
4-3外部RAM从2000H到2100H有一数据块,请编出将它们传送到外部RAM3000H到3100H区域的程序。
4-7ORG0000H
MOVDPTR,#2000H
MOVP2,#30H
MOVR0,#00H
MOVR2,#0
MOVXA,@DPTR
MOVX@R0,A
DJNZR2,LOOP;
0—FF--0
(DPTR)=2100H
INCP2;
31H
4-4在内部RAM中,有一个以BLOCK为始址的数据块,块长在LEN单元。
请用查表指令编一程序,先检查它们若是16进制中的A~F,则把它们变为ASCⅡ码;
若不是,则把它们变为00H。
4-4
BLOCKEQU31H
LENEQU30H
N?
?
EQU30
MOVR0,#BLOCK
MOVLEN,#N
MOVR2,LEN
CJNEA,#0AH,DO1
JNCDO2
SJMPDO5
CJNEA,#0FH,DO3
SJMPDO4
JCDO4
DO5:
MOVA,#0
SJMPNEXT
DO4:
MOVDPTR,#TAB
SUBBA,#0AH
MOVCA,@A+DPTR
NEXT:
TAB:
DB'
A'
'
B'
C'
D'
E'
F'
4-6试编写一个子程序将字符串:
“MCS-51Microcntrol”装入外部RAM8000H开始的显示缓冲区。
4-9ORG0000H
MOVDPTR,#TAB
MOVP2,#80H
MOVR2,#19
tab:
MCS-51Microcontrol'
4-10将内部RAM的AAA单元中8位无符号二进制数转换成用BCD码表示的十进制数。
(要求用连续除10的方法实现)
4-10
ORG0000HORG1000H
AAADATA0FFHAAAEQU0FFH
MOVA,#AAAMOVA,#AAA
MOVB,#0AHMOVR0,#30H
DIVABMOVB,#0AH
MOV30H,BDIVAB
MOVB,#0AHMOV@R0,B
DIVABINCR0
MOV31H,BJNZLOOP
MOV32H,ASJMP$
SJMP$END
4-9求8个数的算数平均值Y=(∑Xi)/8(i=0,…7)
MOVSP,#6FH
CALLZHISHU
MOVR2,#0;
QIUHEA
MOVR3,#0;
QIUHEB
MOVR4,#08
JZNEXT
MOVB,#08H
ADDA,R2
MOVA,B
ADDA,R3
MOVR3,A
DJNZR4,LOOP
MOVR3,B
ZHISHU:
MOV30H,#0FFH
MOV31H,#0FFH
MOV32H,#0FFH
MOV33H,#0FFH
MOV34H,#0FFH
MOV35H,#0FFH
MOV36H,#0FFH
MOV37H,#0FFH
MOV38H,#0FEH;
FH
MOV39H,#0FFH
RET
4-16设逻辑运算表达式为
其中变量A、B、C分别为P1.0、P1.4、定时器溢出标志TF1,D、E、F分别为22H.2、22H.3的位地址、外部中断标志IF1,输出变量Y为P1.5,请编写程序用软件方法实现上述逻辑功能。
4-16-1
A1BIT
B1BIT
C1BITTF1
DBIT
EBIT
FBITIE1
YBIT
MOVC,B1
ORLC,/C1
ANLC,A1
MOVF0,C
MOVC,E
ORLC,/F
ANLC,D
ORLC,F0
MOVY,C
4-17A-T20个合法字符,散转程序设计。
解:
方法1:
键盘键入A-T按ASCII码考虑,则有:
字母
ASCII码
地址表中的偏移量
41H
(41H-41H)*2=0
K
4BH
(4BH-41H)*2=14H
B
42H
(42H-41H)*2=02H
L
4CH
(4CH-41H)*2=16H
C
43H
(43H-41H)*2=04H
M
4DH
(4DH-41H)*2=18H
D
44H
(44H-41H)*2=06H
N
4EH
(4EH-41H)*2=1AH
E
45H
(45H-41H)*2=08H
O
4FH
(4FH-41H)*2=1CH
F
46H
(46H-41H)*2=0AH
P
50H
(50H-41H)*2=1EH
G
47H
(47H-41H)*2=0CH
Q
51H
(51H-41H)*2=20H
H
48H
(48H-41H)*2=0EH
R
52H
(52H-41H)*2=22H
I
49H
(49H-41H)*2=10H
S
53H
(53H-41H)*2=24H
J
4AH
(4AH-41H)*2=12H
T
54H
(54H-41H)*2=26H
方法2:
自定义
1H
(1H-1H)*2=0
0BH
(0BH-01H)*2=14H
2