※ 9、R2R3:=R4R5+R6R7 ※ 10、R2R3:=R4R5-R6R7
二 、写出以下程序执行后A、C、OV、的值: 1、 MOV A,#7FH
ADD A,#9CH
2、 SETB C
MOV A,#80H SUBB A,#80H、、、 3、 MOV A,#40H
MOV B,#10H DIV AB
4、 MOV A,#0C0H
MOV B,A MUL AB
5、 MOV A,#0FFH
MOV B,A INC A DEC B ADD A,B
练习三
一、按要求写出指令: 1、 R1或上R2。
2、 R1与上R0所指单元。
3、 用移位指令实现将R0所指单元乘2。 4、 用移位指令实现将R2R3除以2。 5、 取R5的补数,仍存于R5中。 6、 取反由A所指的内部RAM单元。
7、 A异或上R1R0所指的外部RAM单元。 二、写出以下程序执行后A中的值: 1、 MOV B,#3EH MOV A,#0A5H CPL A XRL A,B 2、 CLR C
MOV A,#75H RRC A RR A
15
3、 ORL A,#5AH RL A
ANL A,#94H
练习四
一、手工汇编以下程序,并分析程序执行后A中的值: 1、 SETB C
L:2、 L:
*3、 4、 7FE0H: L0: L1:*5、 *6、
CLR A
CPL A
SUBB A,#0FFH JNC L
MOV A,#3CH
MOV R3,#2CH
DEC A
DJNZ R3,L
CLR A PUSH ACC MOV R0,SP DEC SP DEC @R0 MOV SP,R0 POP ACC
MOV A,#3FH
AJMP L1
CPL A
MOV B,#02H
MUL AB JC L0
MOV A,#2 RL A ADD A,#1 MOVC @A+PC RET
DB 2CH,0FCH,7DH,66H,47H,83H MOV A,#20H ;本题指出最后一句的操作 PUSH ACC INC A
16
PUSH ACC RET 二、按要求写出小程序:
1、 比较B与数7FH,不相等时转到LNT。
2、 将R0所指的20个单元清0,R0指在最低地址单元上。
3、 将A异或上B,并且如果A低半字节为0,则转移到L0,否则转到L1。 4、 利用堆栈将A、B值传给R2、R3。
5、 按R0所指的单元中的第6位(从0算起)如果为1,则转到LK。 *6、利用RET指令跳转到1234H。 三、正、误判断,并简述判断论点:
1、用MOV SP,#40H 指令后,即将堆栈起始单元地址定为40H。 2、PUSH Acc后,SP内容为存放Acc值的栈地址。 3、POP Acc后,SP内容为存入Acc值的栈地址。
4、CJNE M1,M2,Lable执行后M1,M2都不改变,只是将C按M1-M2是否产生借位而取值,且当M1?M2时转到Lable处。 5、JZ是按运算结果为0时转移。 6、Ajmp是在该指令所在区域转移指令。
7、JMP及CALL类指令的“当前PC值”仍然是下一条指令的首地址。 8、CALL类指令所作的操作是将转移目的地址传送给PC。
9、RET及RETI执行后之所以会返回主程序CALL指令或中断处的下一条指令执行,是因为CALL指令或中断操作执行时将“当前PC值”入栈。
10、由CALL类指令入栈的高8位地址先入栈,位于低地址,低8位地址后入栈,位于高地址。
11、每做一次堆栈操作后,堆栈指针SP就会自动加1。
*12、在子程序的RET之前用了1条POP指令,将产生严重的运行混乱。(子程序中没有PUSH指令,并除了末条POP外也没有改变SP指针)。
*13、监控系统初始化子程序中用MOV SP,# 指令设置堆栈是不允许的。 *14、堆栈指针SP设置为00是不适宜的。
*15、在子程序中不想回到原主程序去而直接跳向某程序可以用二条POP指令之后用LJMP实现。
*16、子程序可以被多个主程序在不同处调用,因此子程序自身无法了解是哪个主程序调用了它。
*17、只有相对转移而没有绝对转移指令的程序指令码可以移到别的地址处执行。
四、错误判断: 1、 逐句判断:
LL: MOV R2,#20H ;子程序入口为LL
17
MOV DPTR,5C00H
L0: MOV R1,F0H MOV A,@DPTR XCH B,A MOV A,@R2
CJNE B,#70H,L1
L1: JC C,L2 MOV @R1,B
MOV @DPTR,A L2: INC R2
PUSH R2 DEC DPTR POP F0H MOV R1,R2 POP ACC RET
2、 有人编了一个子程序,想完成:“将30H开始的16个数中大于等于80H的单元内
容放入50H以后的相应单元中”。程序有错,请逐行改正。 有错程序 修改程序
MOV R0,#30H MOV R7,#50H
LOOP: MOV R6,16H MOV A,R0
JNB ACC.8,NPUT MOV @R7,A
INC R0
NPUT: INC R7
DJNZ R6,LOOP
18
练习五 编程题
1、 内部RAM从list单元开始存放一正数表,表中之数作无序排列,并以“-1”作结束标志。
编程实现在表中找出最小数。
2、 求8个数的平均值,这8个数以表格形式存放在从table开始的单元中。
3、 比较两个ASCII码字符串是否相等。字符串的长度在内部RAM 41H单元,第一个字符串
的首地址为42H,第二个字符串的首地址为52H。如果两个字符串相等,则置内部RAM40H单元为00H,否则置40H单元为0FFH。
4、 输入缓冲区inbuf存有80个字节,编程实现将其中所有的组分隔符(1DH)的地址依次压入
separ栈中。
5、 求16位补码所对应的原码,16位补码存放在31H和30H单元,转换后的原码仍放在这两个
单元,低地址存低字节。
6、 设有100个有符号数,连续存放在以2000H为首地址的RAM中,试编程统计其中正数、负
数、零的个数,并把统计结果分别存入50H,51H,52H这三个单元中。
7、 5个双字节数,存放在外部RAM从barf开始的单元中,求它们的和,并把和存放在sum开
始的单元中,请编程实现。
8、编写双字节有符号数除法子程序。
19