单片机微型计算机原理及接口技术课后习题答案第4章
4-1 分别指出下列指令中的源操作数和目的操作数的寻址方式
| 源操作数寻址方式 | 目的操作数寻址方式 |
(1)MOV P1,20H | 直接寻址 | 直接寻址 |
(2)MOV A,#30H | 立即数寻址 | 寄存器寻址 |
(3)ADD A,@R1 | 寄存器间接寻址 | 寄存器寻址 |
(4)ANL A,B | 寄存器寻址 | 寄存器寻址 |
(5)MOV 33H,A | 寄存器寻址 | 直接寻址 |
(6)SETB C | 位寻址 | 位寻址 |
(7)CLR C | 位寻址 | 位寻址 |
| | |
4-2 试述指令 MOV A,R0和MOV A,@R0的区别
两条指令的目的操作数相同,两条指令的区别在于源操作数来源不同:MOV A,R0 指令的源操作数就是R0寄存器的内容;而MOV A,@R0 指令的源操作数是位于存储器单元内,且存储
器单元的地址是R0寄存器的内容。
4-3 试述指令MOV A,20H和MOV A,#20H的区别
MOV A,20H 源操作数是直接寻址,20H表示源操作数所在存储器单元的地址。
MOV A,#20H 源操作数是立即数寻址,#20H是立即数,也就是源操作数。
4-4 说明一下指令中源操作数所在的存储器类型。
(1)MOV A,#30H; 立即数#30H,就是源操作数,存在于指令中,所以位于程序存储器。
(2)MOV A,30H; 30H是源操作数所在数据存储单元的地址,所以源操作数位于数据存储器。
(3)MOVC A,@A+DPTR;源操作数是变址寻址, 助记符MOVC表示源操作数位于程序存储器。
(4)MOVX A,@DPTR; 源操作数是寄存器间接寻址, 助记符MOVX表示源操作数位于外部数据存储器。
4-5 判断下列指令书写是否正确:
(1)MOV A,B; ✔
(2)MOV A,#3000H ; ✘,因为A是8位寄存器,而#3000H是16位数值,没法全部存到A里
(3)INC,#20H ; ✘ 只能INC A/direct/Rn/@Ri/DPTR
(4)MOV 5,A ; ✔,注意目的操作数是直接寻址方式,不是立即寻址
(5)MOV 30H,40H; ✔
(6)MOV B,@DPTR ; ✘,@DPTR寻址用于MOVX指令,不能用于MOV指R
(7)CJNE 30H,#80H,NEXT ; ✘, CJNE指令格式只能是CJNE A/Rn/@Ri,#data,rel或CJNE A,direct,rel
(8)POP A ; ✘ 只能是直接寻址方式POP direct,正确的是POP ACC
(9)PUSH ACC; ✔
(10)SJMP 2000H ; ✘ rel的范围是-128~127(用补码表示其值)共256B范围
4-6 设ACC=12H,B=64H,SP=60H,30H中存放的是78H,试分析下列程序执行后,ACC、B、30H、SP中的内容分别为多少,并画出堆栈示意图。
程序:PUSH ACC
PUSH B
PUSH 30H
POP ACC
POP B
POP 30H
62H 62H
61H SP 61H
SP 60H 12H 60H
SP
SP 62H 78H 62H
64H 61H 64H 61H
12H 60H 12H 60H
SP 62H 62H 62H
64H 61H SP 61H 61H
12H 60H 12H 60H SP 60H
ACC=78H; B=64H; (30H)=12H; SP=60H
4-7 下面是一个压缩BCD码相加的程序,参考其设计1个2字节压缩BCD码加法程序。
BCDAD: CLR C
MOV A,30H ;A中为加数
ADDC A,40H ;实现8位相加
DA A ;十进制调整
MOV 30H,A ;送回原处
RET
答:假设2字节压缩BCD码分别存储在地址30H和40H开始的存储单元中,结果存到50H开始的存储单元中,其中高位地址存放高位数据(例BCD码分别1001H,2002H,则(30H)=10H; (31H)=01H; (40H)=20H; (41H)=02H),
BCDAD: MOV R0,#31H
MOV R1,#41H
MOV A,@R0 ;取第一(低)字节(BCD码)
ADD A,@R1 ;加第一(低)字节(BCD码)
DA A
MOV 51H,A ;存第一字节和(BCD码)
DEC R0 ; R0指向第二(高)字节BCD码
DEC R1 ; R1指向第二(高)字节BCD码
MOV A,@R0 ;取第二(高)字节BCD码
ADD A,@R1 ;加第二(高)字节(BCD码)
DA A
MOV 50H,A ;存第一字节和(BCD码)
RET
4-8 已知在33H-30H中放有一个32位二进制数(设为原码数),要求将其转换为补码送入原地址中,其中高位地址存放高位数据
答:严格说本题需要先判断32位二进制数是正数还是负数,也就是判断33H的D7位是否为
1,若是1,表明此32位数是负数,就进行补码运算,若是正数,就不需要求补码运算。
SUBCPL: MOV A,33H
JNC ACC.7,SUBRETURN
MOV A,30H
CPL A
ADD A, #01H; 这里不但加1,而且还要关心加1后数据是否有进位,所以不能用INC A
MOV 30H,A
MOV A,31H
CPL A
ADDC A, #00H; 这里加法的作用是将前数加1后的进位加进来,所以不能用INC A
MOV 31H,A
MOV A,32H
CPL A
ADDC A, #00H; 这里加法的作用是将前数加进位后,若有进位也加进来,所以不能用INC A
MOV 32H,A
MOV A,33H
CPL A
ADDC A, #00H; 这里加法的作用是将前数加进位后,若有进位也加进来,所以不能用INC A
SETB ACC.7; 这里加法的作用
MOV 33H,A
SUBRETURN: RET
END
4-9 执行下面的指令
MOV A,#34H
MOV B,#40H
MUL AB
执行后,A寄存器中的数据是(00H),B寄存器中的数据是(0DH)
4-10
;XRL A, A ;该指令有错,编译时会显示错误:INVALID REGISTER,应该修改为:
XRL A, ACC ;(或者改为XRL ACC, A)
INC A
ADDC A, #0A6H
DA A
上述指令执行后,A的内容是(07H),CY是(1)
4-11 假定30H单元开始的4个字节存放的是1个32位无符号数,40H单元开始的4个字节存放的是另一个32位无符号数,低位地址中存放低位数据,使说明下列程序段完成什么功能?请给每条指令后加上注释。
MOV R0,#33H ;将立即数33存放到工作寄存器R0中
MOV R1,#43H ;将立即数43存放到工作寄存器R1中
MOV R2,#04 ;将立即数43存放到工作寄存器R1中
LOOPA: MOV A,@R0 ;将R0的内容33H送A
CJNE A,@R1,L1 ;比较33H和R1的内容43H的大小,如果相等,就继续向下执行,如果不相等,且(33H)<(43H),CY=1,转L1执行
DEC R0 ;R0 R0-1,指向下个存储单元32H(31H,30H)
DEC R1 ; R1 R1-1,指向下个存储单元42H(41H,40H)
DJNZ R2,LOOPA ;若R2-1=0,则向下执行,若R2-1≠0,则执行循环LOOPA
EQUAL: SJMP L3 ;转L3执行
L1: JNC L4 ;若CY=1,即(R0)<(R1),继续执行;若CY≠1,即(R0)>(R1),转L4执行
SJMP L5 ;转L5执行
…
L3: …
…
L4: …
…
L5: …
…
功能:比较两个32位无符号数(30H开始的4个字节单元和40H开始的4个字节单元)的大小,并且根据比较结果(相等,大于,小于),分别执行不同的操作。
4-12 指令DJNZ R0,LOOPN的循环执行条件是(D)
(A)R0≠0且R0-1=0
(B)R0≠0或CY=1
(C)R0≠0或R0+1=0
(D)R0≠0且R0-1≠0
注:本题指令DJNZ R0,LOOPN,在R0=0时也执行循环,因R0-1=255≠0。
4-13 已知一数据区中的数据为:(本题是微机原理的程序,对单片机错误较多,取消,或者做如下改正)
STR1 DB 0,1; 改为:STR1: DB 0,1;
STR2 DB '45'; 改为:STR2: DB '45';
NUMB DB 2DUP(0); 改为:NUMB: DB ‘2DUP(0)’;
NUMW DB 10H ,-60H; 改为:NUMW: DB 10H ,-60H