第四章习题解答.pdf_第1页
第四章习题解答.pdf_第2页
第四章习题解答.pdf_第3页
第四章习题解答.pdf_第4页
第四章习题解答.pdf_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章习题解答 仅供参考 第四章习题解答 仅供参考 4 1 若有两个无符号数 xy分别存放在内部存储器 50H 51H 单元中 试编写一个程序实现10 xy 结果存人 52H 53H 两个单元中 习题 4 1 参考答案 ORG 0000H SJMP START ORG 0030H START MOV A 50H MOV B 10 MUL AB 50H x10 积的高 低字节分别在 B A 中 ADD A 51H MOV 53H A 积的低字节加 51H 其和存放在 53H 中 JNC LL INC B LL MOV 52H A 积的高字节加进位位存放在 52H 中 SJMP 4 2 从内部存储器 20H 单元开始 有 30 个数据 试编一个程序 把 其中的正数 送 51H 开始的存储单元 并分别记下正数 负数的个数送 50H 1 单元 习题 4 2 参考答案 ORG 0000H SJMP START ORG 0030H START MOV 1EH 51H 正数存放首地址 51H 存暂存于 1EH 单元 MOV 1FH 71H 负数存放首地址 71H 存暂存于 1EH 单元 MOV R0 20H 建立取数 源操作数 的地址指针 MOV R2 30 预置数据长度 MOV 50H 00H 正数个数统计单元清零 MOV 70H 00H 负数个数统计单元清零 LOOP MOV A R0 取数 JB ACC 7 NEG 是负数转 NEG 处理 POSI MOV R1 1EH 是正数 将暂存的地址送 R1 间址 寄存器 MOV R1 A 将正数入存 INC 50H 正数个数加 1 INC 1EH 正数暂存地址加 1 修正 2 LOOP1 INC R0 取数地址加 1 修正 DJNZ R2 LOOP 计数长度减 1 不等于零 继续循环 统计 SJMP 结束 NEG MOV R1 1FH 是负数 将暂存的地址送 R1 间址 寄存器 MOV R1 A 将负数入存 INC 70H 负数个数加 1 INC 1FH 负数暂存地址加 1 修正 SJMP LOOP1 转取数地址修正 4 3 内部存储单元 40H 中有一个 ASCII 码字符 试编一程序 给该 数的最高位加上奇校验 习题 4 2 参考答案 ORG 0000H SJMP START ORG 0030H START MOV A 40H 取数给 A CLR ACC 7 A 最高位 奇偶校验位 清零 JB P LOOP 40H 中的 ACSII 码原来就是奇数个 1 最 3 高位给零 SETB ACC 7 40H 中的 ACSII 码原来是偶数个 1 最高 位置 1 LOOP MOV 40H A 入存 SJMP 结束 END 4 4 编写一段程序 将存放在自 DATA 单元开始的一个四字节数 高 位在前 取补后送回原单元 一 若 DATA 在内部数据存储器中 假如存放在 30H 起始的 4 个单元 中 解 1 采用求反加 1 的算法 习题 4 4a 参考答案 ORG 0000H SJMP START ORG 0030H START SETB C 置进位位为 1 MOV R2 04H 预置计数长度 MOV R0 DATA1 3 取数指针指向低字节的地址 4 LOOP MOV A R0 取数 CPL A 求反 ADDC A 00H 加进位 MOV R0 A 入存 DEC R0 地址指针修正 DJNZ R2 LOOP 4 字节未处理完 继续循环处理 SJMP 结束 DATA1 EQU 30H END 解 2 采用 0 减原数的算法 习题 4 4b 参考答案 ORG 0000H SJMP START ORG 0030H START MOV R2 04H 预置计数长度 MOV R0 DATA1 3 取数指针指向低字节的地址 CLR C 进位位清零 LOOP MOV A 00H SUBB A R0 用零减原数 5 MOV R0 A 入存 DEC R0 地址指针修正 DJNZ R2 LOOP 4 字节未处理完 继续循环处理 SJMP 结束 DATA1 EQU 30H END 二 若 DATA 在外部数据存储器中 假如存放在 1000H 起始的 4 个单 元中 解 1 习题 4 4c 参考答案 ORG 0000H SJMP START ORG 0030H START MOV R2 04H 预置计数长度 MOV P2 10H 取数指针指向数据低字节的高 8 位地址 MOV R0 03H 取数指针指向数据低字节的低 8 位地址 SETB C 进位位置 1 6 LOOP MOVX A R0 从外部数据存储器取数 CPL A 求反 ADDC A 00H 加进位位 MOVX R0 A 入存 DEC R0 地址指针修正 DJNZ R2 LOOP 4 字节未处理完 继续循环处理 SJMP 结束 DATA1 EQU 30H 解 2 习题 4 4d 参考答案 ORG 0000H SJMP START ORG 0030H START MOV R2 04H 预置计数长度 MOV P2 10H 取数指针指向低字节数据的高8 位地址 MOV R0 03H 取数指针指向低字节数据的低 7 8 位地址 CLR C 进位位清零 LOOP MOVX A R0 从外部数据存储器取数 MOV B A 暂存 MOV A 00H SUBB A B 用零减原数 MOVX R0 A 入存 DEC R0 低 8 位地址地址指针修正 DJNZ R2 LOOP 4 字节未处理完 继续循环处理 SJMP 结束 DATA1 EQU 30H END 4 5 以 BUFl 为起始地址的外存储区中 存放有 16 个单字节无符号二 进制数 试编一程序 求其平均值并送 BUF2 单元 解 设 R2 R3 存放和 将其除以 16 R2 R3 联合左移 4 位 即为平 均置值 单字节存放 习题 4 5 参考答案 ORG 0000H 8 SJMP START ORG 0030H START MOV R2 00H 和高字节清零 MOV R3 00H 和低字节清零 MOV DPTR DATA1 建立外部数据存储器的地址指 针 MOV R4 10H 预置计数长度 LOOP MOVX A DPTR 从外部数据存储器取数 ADD A R3 MOV R3 A MOV A R2 ADDC A 00H MOV R2 A 累加 INC DPTR 地址指针修正 DJNZ R4 LOOP 16 字节未累加完 继续循环累加 MOV R4 04H R2 R3 联合移位 4 次 除以 16 LOOP1 CLR C MOV A R2 RRC A MOV R2 A MOV A R3 RRC A 9 MOV R3 A DJNZ R4 LOOP1 平均值存放于 R3 中 SJMP 结束 DATA1 EQU 1000H END 4 6 在 DATAl 单元中有一个带符号 8 位二进制数 编一程序 按以 下关系计算 y 值 送 DATA2 5 0 0 5 0 xx yxx xx 解 1 设 DATA1 DATA2 为内部数据存储器的二个单元 假设为 30H 31H 且y的值单字节不会产生溢除出 习题 4 6 a 参考答案 ORG 0000H SJMP START ORG 0030H START MOV A 30H 取数 X 给 A JZ ZERO 若 X 0 则 Y 0 转入存储结果 10 JB ACC 7 NEG 若 X0 则 X 5 存储结果 SJMP ZERO NEG CLR C SUBB A 05H ZERO MOV 31H A 存储结果 SJMP END 解 2 考虑 Y 有可能产生溢出的更为一般的情况 DATA2 用双字节存 放 31H 32H 习题 4 6 b 参考答案 ORG 0000H SJMP START ORG 0030H START MOV A 30H 取数 X 给 A JZ ZERO 若 X 0 则 Y 0 转入存 JB ACC 7 NEG 若 X0 则 X 5 MOV 31H A 11 MOV A 00H ADDC A 00H MOV 32H A x 5 的和入存 31H 低字节 32H 高 字节 中 ED SJMP NEG CLR C X 0 用 FF X 5 SUBB A 05H MOV 31H A MOV A 0FFH SUBB A 00H MOV 32H A x 5 的差入存 31H 低字节 32H 高 字节 中 SJMP ED ZERO MOV 31H A x 0 结果入存 MOV 32H 00H SJMP ED END 4 7 设内部 RAM 中 30H 和 31H 单元中有两个带符号数 求出其中的 大数存放在 32H 单元中 解一 思路 若两数同号 则值大的数大 两数异号 正数值大 习题 4 6 a 参考答案 12 ORG 0000H SJMP START ORG 0030H START MOV A 30H XRL A 31H 两数异或 JB ACC 7 YIHAO 两数异号 TONGHAO CLR C 两数同号 MOV A 30H SUBB A 31H JC LOOP1 LOOP0 MOV A 30H 同号被减数大 值大 LOOED MOV 32H A SJMP LOOP1 MOV A 31H 异号被减数大 值小 SJMP ED YIHAO MOV A 30H 异号 哪个正 其值大 JNB ACC 7 LOOP0 SJMP LOOP1 END 解二 把两个数分别扩展成双字节的带符号数 再将两个双字节的带符 号数相减 符号位为正 表示被减数大 反之则小 若正数 扩展的高字 13 节为 00H 若负数 扩展的高字节为 FFH 习题 4 6b 参考答案 ORG 0000H SJMP START ORG 0030H START MOV 21H 30H 将 30H 的带符号数扩展成双字节 存放在 20H MOV 20H 00H 高 21H 低 中 JNB 0FH LOOP1 bitOFH 21H 7 MOV 20H 0FFH LOOP1 MOV 23H 31H 将 31H 的带符号数扩展成双字节 存放在 20H MOV 22H 00H 高 21H 低 中 JNB 1FH LOOP2 bit1FH 23H 7 MOV 22H 0FFH LOOP2 CLR C 将 20H 21H 内容减 22H 23H MOV A 21H SUBB A 23H MOV A 20H SUBB A 22H 14 JNB ACC 7 LOOP0 差为正 20H 21H 数大 即 30H 数大 MOV A 31H 差为负 22H 23H 数大 即 31H 数大 ED MOV 32H A SJMP LOOP0 MOV A 30H SJMP ED END 4 8 利用逻辑尺控制的方法 设计一个主程序 在第 1 3 5 6 次 调用 SBI 子程序 第 2 4 7 8 次调用 SB2 子程序 习题 4 8 参考答案 ORG 0000H SJMP TEST ORG 0030H TEST MOV R2 08H MOV A 10101100B LOOP RLC A JC LOOP1 15 LCALL SBI SJMP RELT LOOP1 LCALL SB2 RELT DJNZ R2 LOOP SJMP PRGO RET PRG1 RET END 4 9 将 DATA 单元存放的以 ASCII 码表示的 16 进制数转换成十进制 数存放于 DATA 1 单元 解 先将 DATA 单元的 ASCII 码转换成十六进制的数 再转转成十进制 的数 数字的 ASCII 码转成十六进制数 即为十进制数 采用减 30H 字母的 ASCII 码转成十六进制数采用减 37H 十六进制再转十进制可采 用先减 0AH 再加 10H 这样 37H 0AH 10H 31H 可采用直接减 31H 1 数字与字母的ASCII的区别 可采用对D6的检测D6 1为字母的ASCII 码 反之为数字的 ASCII 码 习题 4 9 a 参考答案 ORG 0000H SJMP TEST 16 ORG 0030H TEST MOV R0 DATA1 MOV A R0 将 DATA1 的数给 A CLR C LOOP JB ACC 6 LOOP1 是字母 转 LOOP1 SUBB A 30H 是数字减 30H ED MOV DATA1 1 A 入存 SJMP 结束 LOOP1 SUBB A 31H 是字母 减 31H SJMP ED DATA1 EQU 30H END 2 数字与字母的 ASCII 的区别 也可采用与 3AH 相比较 若大于它则 为字母的 ASCII 码 反之为数字的 ASCII 码 也可先减 30H 再对 D4位 进行检测 若为 1 则为字母的 ASCII 码 可再减 1 即为它所对应的十进 制数 反之为数字的 ASCII 码的十进制数 习题 4 9b 参考答案 ORG 0000H SJMP TEST 17 ORG 0030H TEST MOV R0 DATA1 MOV A R0 将 DATA1 的数给 A CLR C 进位位清零 LOOP SUBB A 30H 先减 30H JB ACC 4 LOOP1 是字母 转 LOOP1 ED MOV DATA1 1 A 入存 SJMP 结束 LOOP1 SUBB A 01H 是字母 减 31H SJMP ED DATA1 EQU 30H END 4 10 编一个将十六进制数转换成十进制数的子程序 1 编一个单字节 内部数据存储器 30H 的十六进制数转换成十进制 数的子程序 2 编一个将内部数据存储器 30H 起始的 10 个字节的十六进制数转换 成十进制数 从 40H 起始存放的子程序 1 解 一个单字节的十六进制的数转成十进制数一般考虑用二个字节 BCD 码来 存放 设转换后的数存放在 R3 高 R4 低 中 思路 a 一种可将其分离成高 低半字节 高半字节的数可通过查 18 表转成 BCD 码 而后与低半字节相加 DA A 调整 b 也可将高半字节的数作为计数器 以 16 BCD 连续累 加计数器的次数 而后与低半字节相加 DA A 调整 c 将单字节的十六进制 即为二进制数 反复用乘 2 用 自己加自己再进行 DA A 调整 加低位的算法 进行编程 习题 4 10a 参考答案 ORG 0000H SJMP TEST ORG 0030H TEST MOV DPTR TAB 建立表头地址 MOV A 30H ANL A 0F0H SWAP A 高半字节分离 ADD A 0E0H 高半字节数乘 2 MOV B A 暂存 MOVC A A DPTR MOV R3 A 取转换后的高半字节存 R3 INC DPTR MOV A B 19 MOVC A A DPTR MOV R4 A 取转换后的低半字节存 R4 MOV A 30H ANL A 0FH ADD A R4 DA A MOV R4 A 加原数的低半字节 DA A MOV A R3 ADDC A 00H DA A MOV R3 A RET TAB DB 00H 00H 00H 16H 00H 32H 00H 48H 00H 64H DB 00H 80H 00H 96H 01H 12H 01H 28H 01H 44H DB 01H 60H 01H 76H 01H 92H 02H 08H 02H 24H DB 02H 40H 02H 40H 02H 56H END 习题 4 10b 参考答案 ORG 0000H 20 SJMP TEST ORG 0030H TEST MOV R3 00H MOV R4 00H MOV A 30H ANL A 0F0H SWAP A MOV R2 A 高半字节分离作为 R2 的计数长 度 N LOOP MOV A R4 ADD A 16H DA A MOV R4 A MOV A R3 ADDC A 00H DA A MOV R3 A R3 R4 16 DJNZ R2 LOOP R3 R4 16 X N MOV A 30H ANL A 0FH ADD A R4 DA A 21 MOV R4 A MOV A R3 ADDC A 00H DA A MOV R3 A R3 R4 加原数的低半字节 DA A RET END 习题 4 10c 参考答案 ORG 0000H SJMP CONVONE ORG 0030H CONVONE MOV A 30H CONVONE1 MOV R3 00H MOV R4 00H R3 R4 清零 MOV R2 08H 设移位计数长度 MOV R5 A 取数暂存 R1 LOOP MOV A R5 RLC A MOV R5 A 原数左移一位 MOV A R4 22 ADDC A R4 DA A MOV R4 A MOV A R3 ADDC A R3 DA A MOV R3 A R3 R4 乘 2 加低位 DJNZ R2 LOOP 8 次移位未结束继续循环 RET END 2 解 以上题 C 的求解作为单字节转换的子程序 CONVONE1 其人口 条件为 转换的数放在 A 中 出口条件 转换后的数在 R3 R4 中 习题 4 10c 参考答案 ORG 0000H SJMP START ORG 0030H START MOV R0 30H MOV R1 40H MOV R6 10 23 ST1 MOV A R0 ACALL CONVONE1 MOV R1 03H INC R1 MOV R1 04H INC R1 INC R0 DJNZ R6 ST1 SJMP CONVONE MOV A 30H CONVONE1 MOV R3 00H MOV R4 00H R3 R4 清零 MOV R2 08H 设移位计数长度 MOV R5 A 取数暂存 R5 LOOP MOV A R5 RLC A MOV R5 A 原数左移一位 MOV A R4 ADDC A R4 DA A MOV R4 A 24 MOV A R3 ADDC A R3 DA A MOV R3 A R3 R4 乘 2 加低位 DJNZ R2 LOOP 8 次移位未结束继续循环 RET END 4 11 编一程序 将存储区 DATAl 单元开始的 20 个单字节数据依次 与 DATA2 单元为起始地址的 20 个单字节数据进行交换 1 设 DATA1 DATA2 分别为内部 RAM 30H 和 50H 单元 习题 4 11a 参考答案 ORG 0000H SJMP START ORG 0030H START MOV R0 30H 建立源地址指针 MOV R1 50H 建立目标地址指针 MOV R6 20 置计数长度 LOOP MOV A R0 取源地址数据 XCH A R1 25 MOV R0 A 源地址数据与目标地址数据交换 INC R0 源地址指针修正 INC R1 目标地址指针修正 DJNZ R6 LOOP 计数长度减 1 不等于 0 继续循环 RET END 2 设 DATA1 DATA2 分别为内部 RAM 30H 和外部 RAM 1000H 单元 习题 4 11b 参考答案 ORG 0000H SJMP START ORG 0030H START MOV R0 30H 建立源地址指针 MOV DPTR 1000H 建立目标地址指针 MOV R6 20 置计数长度 LOOP MOVX A DPTR 取源地址数据 XCH A R0 MOVX DPTR A 源地址数据与目标地址数据交 换 INC R0 源地址指针修正 INC DPTR 目标地址指针修正 26 DJNZ R6 LOOP 计数长度减 1 不等于 0 继续循 环 RET END 3 设 DATA1 DATA2 分别为外部 RAM 1040H 单元和外部 RAM 2030H 单元 习题 4 11c 参考答案 ORG 0000H SJMP START ORG 0030H START MOV R0 30H 建立源地址指针 MOV R1 40H 建立目标地址指针 MOV R6 20 置计数长度 LOOP MOV P2 10H MOVX A R0 取源地址数据 MOV B A 暂存 MOV P2 20H MOVX A R1 取目标地址数据 MOV P2 10H MOVX R0 A 将目标地址数据传送到源地址 27 MOV A B MOV P2 20H 源地址数据与目标地址数据交 换 MOVX R1 A 将源数据传送到目标地址 INC R0 源地址指针修正 INC R1 目标地址指针修正 DJNZ R6 LOOP 计数长度减 1 不等于 0 继续循环 RET END 4 12 试编写一程序 将存储区 DATAl 单元开始的 50 个单字节数逐 一移至 DATA2 单元开始的存储区中 解 本题只是数据单向传送 比上题交换更简单 将上题各解中的红色 部分指令去掉即可 4 13 试编一采用查表法求 1 20 的平方数子程序 要求 x 在累加器 A 中 1 x 20 平方数高位存在 R6 低位在 R7 解 1 为编程方便起见 每一数的平方在表中统一用双字节来存放 这 样只要把数乘 2 加表头地址 就可以找到对应的平方数的高字节存放的地 址 连续取两个字节即可 习题 4 13a 参考答案 28 ORG 0000H SJMP START ORG 0030H START MOV DPTR TAB 建立源地址指针 DEC A MOV B A ADD A B MOV B A LOOP MOVC A A DPTR MOV R5 A INC DPTR MOV A B MOVC A A DPTR MOV R6 A RET TAB DB 00H 00H 00H 01H 00H 04H

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论