1、第三章 MCS51 单片机的指令系统和汇编语言程序示例(第 5、6、7节)1 试分析单片机执行下列指令后累加器 A 和 PSW 中各标志位的变化状况?(1)MOV A,19HADD A,66H(2)MOV A,5AHADD A,6BH2 已知:A85H,R 0=30H,(30H)=11H, (31H)=0FFH,C=1,试计算单片机执行下列指令后累加器 A 和 C 中的值各是多少?(1) ADDC A,R 0, (2)ADDC A,31H(3) ADDC A,R 0, (4) ADDC A,#85H3 已知 M1 和 M2 中分别存放两个 16 位无符号数的低 8 位,M 11 和 M21 中
2、分别存放两个 16 位无符号数的高 8 位,计算两数之和(低 8 位存放在 M1,高 8 位存放在M11,设两数之和不超过 16 位) 。4 试分析单片机执行下列指令后累加器 A 和 PSW 中各标志位的变化状况?CLR CMOV A,52HSUBB A,0B4H5 已知:A=0DFH,R 1=40H,R7=19H,(30H)=00H,(40H)=0FFH,试分析单片机执行下列指令后累加器 A 和 PSW 中各标志位的变化状况?(1) DEC A (2) DEC R7 (3) DEC 30H (4) DEC R1 6 试写出能完成 8559 的 BCD 加法程序,并对工作过程进行分析。7 已知
3、:两个 8 位无符号乘数分别放在 30H 和 31H 单元中,编程实现他们乘积的低 8 位存放在 32H,高 8 位存放在 33H。8 已知:R 0=30H, (30H )0AAH,试分析执行下列指令后累加器 A 和 30H 单元的内容是什么?(1) MOV A, #0FFH ANL A, R0(2) MOV A, #0FH ANL A, 30H(3) MOV A, #0F0H ANL A, R0(4) MOV A, #80H ANL 30H, A9 设:A=0AAH 和 P1=0FFH,试编程把累加器 A 的低四位送入 P1 口的低四位,P1 口的高四位保持不变。10.已知外部 RAM30H
4、 中有一数 AAH 令高四位不变,低四位取反,试编出相应的程序。11.已知:30H 单元有一正数 X,试编写求(X)补码的程序。12.如图所示,若 X,Y,Z 三个输入信号放在 X,Y,Z 三个单元中,试编写模拟电路功能的程序,并把电路输出送到 F 单元。13.已知 M1 和 M11 有一个 16 位的二进制数,低 8 位存放在 M1,高 8 位存放在 M11,编程令其扩大一倍。14. 已知 M1 和 M11 有两个 BCD 数,试编程把他们紧缩成一个字节并存放在 M1 单元。15.已知某单片机的监控程序初始地址为 A080H,采用什么方法使开机后自动执行监控程序。16.确定指令执行后的 PC
5、 值,及该指令的机器码:KWM:AJMP addr11其中:KWM 为 3100H,addr11=1011010010117.有如下程序,请计算 SJMP START 指令中 rel 值,并分析目标地址的转移范围。ORG 1000H1000H 7401H START: MOV A, #01H1002H F8H MOV R0,A1003H 90CF01H LOOP:MOV DPTR ,#0CF01H1017H 80 rel SJMP START END18.已知累加器 A 中存放带处理命令的编号 04,程序存储器中有初始地址为 PMTB 三字节长转移指令表,试编写程序使单片机能根据 A 中的命令
6、编号转去执行相应的命令程序。PMTB 三字节长转移指令表如下:PMTB: LJMP PM0LJMP PM1LJMP PM2LJMP PM3LJMP PM419.已知:外部 RAM 中以 DATA1 为初始地址的数据块以 0 为结束标志,试编写程序把他们转移到 DATA2 为初始地址的内部 RAM 中。20试编一个程序,把片内 RAM 中以 DATA 为初始地址的数据块中的十个数相加,并把和放在 SUM 单元中。设相加的结果不超过 8 为二进制数表示的范围。21设 ACALL addr11 指令在程序中的初始地址为 1FFFH,堆栈指针 SP 为 60H,试画出指令执行后的堆栈示意图,并确定被调
7、用子程序的合法范围。22已知:MA0500H,试问 8031 执行如下指令MOV SP,#70HMA:LCALL 8192H堆栈中数据如何变化?PC 中内容是什么?23试利用子程序技术编出令 20H2AH,30H3EH 三个子域清零的程序。24试编程把 00H 位中内容和 7FH 位中内容相交换。25设 M、N 和 W 都代表位地址,试编程完成 M、N 中内容的异或操作。26已知:内部 RAM 的 M1,M 2 单元中各有一个无符号 8 位二进制数,试编程比较它们的大小,并把大数送到 MAX 单元。27已知:20H 中有一无符号数 X,若它小于 50,则转向 LOOP1 执行;若它等于 50,
8、则转向 LOOP2 执行;若它大于 50,则转向 LOOP3 执行,试编出相应程序。28已知外部 RAM 的 2000H 开始有一个输入数据缓冲区,该缓冲区中数据以回车符CR(ASCII 码为 0DH)为结束标志,试编一个程序能把正数送入 30H(片内 RAM)开始的正数区和把负数送入 40H 开始的负数区。29若已知 A=76H,PSW=81H,转移指令所在地址位 2080H,当执行下列指令后程序是否发生转移?PC 值为多少?(1) JNZ 12H(2) JNC 34H(3) JB P,56H(4) JBC AC,78H(5) CJNE A,#50,9AH(6) DJNZ PSW,0BCH3
9、0指出下列那些指令不存在,并改用其他指令完成预期的功能。(1) MOV 20H,30H(2) MOV R1,R2(3) MOV R3,20H(4) MOV DPH,30H(5) MOV C,PSW.1(6) MOV SMOD,C(7) MOVX R2,DPTR(8) PUSH 20H(9) POP R0(10) XCH R1,R231.以下两段程序中,R2 为两位 16 进制数,试问这两段程序各执行多少次循环?(1). MOV R2,#60HLOOP: DJNZ R2,LOOPSJMP $(2). MOV R2,#60HLOOP: MOV A,R2ADD A,#99HDA AMOV R2,AJ
10、NZ LOOPSJMP $32用循环指令将内部 RAM 的 20H,21H,22H 三个连续单元的内容依次放到 2FH,2EH,2DH单元。33.编写程序,若累加器 A 中的内容分别满足下列条件时,程序转移到 LABEL 处。设 A 中存放无符号数。(1)A=10(2)A10(3)A=10(4)A10第三章 MCS51 单片机的指令系统和汇编语言程序示例(第 815 节)1.设在内部 RAM 的 BLOCK 单元有一无符号数数据块的长度,无符号数数据块的始址是 BLOCK1,试编程求无符号数数据块中数据的累加和(不考虑进位位的加法之和) ,并把结果存入 SUM 单元。编程后请人工汇编成相应的目
11、标代码。2请编出能把 20H 单元的两个 BCD 数变换成相应的 ASCII 码放在 21H(高位BCD 数的 ASCII 码)和 22H(低位 BCD 数的 ASCII 码)单元的程序。3已知一个 16 位二进制负数(补码形式)的低 8 位在 NUM 单元和高 8 位在NUM1 单元,试编程求该数的绝对值。4已知 20H 单元有一个二进制数,请编程把它转换成 3 位 BCD 数,把百位BCD 数送入 FRIST 单元的低四位,个位 BCD 数送入 SECOND 单元的低四位,十位 BCD 数送入 SECOND 单元的高四位。5已知 VAR 单元有一个自变量 X,请编程求出下列条件下的 Y 值
12、,并将它存入 FUNC 单元。 0 1 Y6N128 的分支程序。已知 R3 中的值为 00H7FH 中的一个,请编出根据R3 的值转移到相应分支程序去的程序。7已知两个有符号数分别存在 ONE 和 TWO 单元,编程比较他们的大小,并把大数存入 MAX 单元。8某系有 200 名学生参加外语考试,若成绩已经存放在 8031 外部 RAM 始址为 ENGLISH 的连续的单元,现决定给成绩在 95100 分之间的学生颁发 A 级合格证书,成绩在 9094 分之间的学生颁发 B 级合格证书。试编一个程序可以统计 A 级和 B 级证书的人数,并把统计结果存入内部 RAM 的 GRADA 和GRAD
13、B 单元。9已知内部 RAM 从 BLOCK 单元开始有一个无符号的数据块,块长在 LEN单元,试编程求出各数的累加和并存入 SUM 单元。10已知内部 RAM 单元以 ADDR 为始址的数据块是无符号数,块长在 LEN 单元,试编程求出各数的最大值并存入 MAX 单元。11设有 10 组三字节被加数和加数,分别存放在 BLOCK1 和 BLOCK2 为始址的单元,请编程求出 10 组数的和(设和仍为 3 字节) ,并把和送回 BLOCK1 为始址的数据块中。12设单片机 8031 内部 RAM 始址为 30H 的数据块中有 64 个无符号数,试编程使他们按从小到大的顺序排列。13已知 R0
14、的低四位有一个 16 进制数(0F) ,试编程将他转化成相应的ASCII 码,并送入 R0 的程序。14已知 BLOCK1 为始址的数据块(数据块的长度在 LEN 单元) ,数据块中每个存储单元的高,低四位分别是两个 16 进制数,试编程将他们转换成相应的ASCII 码,并放在 BLOCK2 为始址的连续存储单元(低四位 ASCCII 码在前,高四位 ASCCII 码在后) 。15设有一个始址为 DTATAB 的数据表格,表中存放 1024 个元素,每个元素为 2 个字节。试编出能根据 R5,R4 中的元素序号查找对应的元素并放在R5,R4(R5 中为高 8 位,R4 中为低 8 位)的程序。
15、16设 MDA 和 MDB 那有两个数 a 和 b,请编出求 ca 2b 2,并把 c 送入MDC 的程序。设 a 和 b 都是小于 10 的整数。17在 HEX 单元存有两个 16 进制数,试编程分别把他们转换成相应的 ASCII码存入 ASC 和 ASC1 单元。18已知片内 RAM 中有一个 5 位的 BCD 码(高位在前,低位在后) ,最大不超过 65535,始址在 R0 中,BCD 码位数减 1(04H)在 R2 中,试编程将 BCD码转换成二进制整数并存入 R4 和 R3 中的程序(R4 中为高 8 位) 。19已知 BLOCK1 和 BLOCK2 为始址的存储区分别存有 5 字节
16、无符号被减数和减数(低位在前,高位在后) ,试编一个减法子程序令他们相减并把差放入BLOCK1 为始址的存储单元。20设 BLOCK1 和 BLOCK1 单元有两个补码形式的有符号数,请编一个子程序求他们的和,并把和放在 SUM 和 SUM1 单元(低 8 位在 SUM 单元) 。2116 位无符号数乘法程序。BLOCK1 和 BLOCK2 为始址的存储区内放有 16位的乘数和被乘数(低字节在前,高字节在后) ,试编程求积,结果放在BLOCK3 为始址的连续 4 个存储单元。22设 32 位长的被除数已经放在 R5、R4、R3、R2(R5 为高字节) ,16 位除数放在 R7、R6 中,试编程
17、求商放在 R3、R2 ,余数放在 R5、R4。该程序应能判定除数为 0 时转入 ERR 出错处理程序和商超过双字节时使 PSW 中的F01(否则 F00) 。23设 R0 和 R1 中有两个补码形式的有符号数,试编程求两数之积并送入R3、R2 中的程序( R3 存放积的高 8 位) 。24将外部 RAM 从 0000H 开始的 2K 字节的数据转移到外部 2000H 开始的区域。试编写有关的程序。25外部 RAM 从 2000H 开始的 100 字节的数据,要把他们转移到外部 2030H开始的区域。试编写有关的程序。26从内部 BLOCK 单元开始有一个无符号的数据块,长度存放在 LEN 单元,编程找出数据块中的最小元素,并放在 MINI 单元。27编写一段程序,模拟如图所示逻辑电路的逻辑功能。要求将 4 输入与非门的功能模拟先写成一个子程序,多次调用模拟整个电路的逻辑功能。设X、Y、Z 、W 都已经定义为位地址,若程序中还需其他位地址,可以另行定义。第三章 MCS51 系列单片机的指令系统