使用子程序的8085程序,用于累加十个压缩BCD数。
我们将在此了解如何使用8085累加十个压缩BCD数。
问题陈述
一组十个压缩BCD数存储在从8040H到8049H开始的内存位置。
编写一个带有子程序的程序来以BCD形式累加这些数字。如果产生进位,则将其保存到寄存器B中,并将其调整为BCD。最终的和将小于9999BCD。将和存储在8060H和8061H位置。
编写第二个子程序来解压存储在寄存器A和B中的BCD和,并将它们存储在从8062H开始的OutputBuffer内存中。最高有效位(BCD4)应存储在8065H,最低有效位(BCD1)应存储在8062H。
讨论
数字从8040开始。由于B将存储进位,因此我们必须先清除B。在第一阶段,我们必须从内存中获取数字,然后将它们作为BCD数字相加,并相应地存储它们。在下一阶段,将完成解压任务。在该部分中,我们获取16位BCD数,然后将其分解为4位数字。然后将它们存储到指定位置。
Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.
输入
地址 | 数据 |
---|---|
… | … |
8040 | 12 |
8041 | 23 |
8042 | 42 |
8043 | 55 |
8044 | 10 |
8045 | 99 |
8046 | 35 |
8047 | 45 |
8048 | 76 |
8049 | 81 |
… | … |
流程图
程序
地址 | 十六进制代码 | 标签 | 助记符 | 注释 |
---|---|---|---|---|
8000 | 21, 40, 80 | | LXI H 8040H | 用IN-BUFFER的第一个位置初始化指针 |
8003 | 0E, 0A | | MVI C 0AH | 用要累加的数据个数初始化计数器 |
8005 | AF | | XRA A | 清除累加器和寄存器B的内容 |
8006 | 47 | | MOV B, A | |
8007 | CD, 23, 80 | NEXTBCD | CALL BCDADD | 累加BCD数的子程序 |
800A | 23 | | INX H | 转到下一个位置 |
800B | 0D | | DCR C | 递减计数器,直到达到0 |
800C | C2, 07, 80 | | JNZ NEXTBCD | |
800F | 32, 60, 80 | | STA 8060 H | 存储A中可用的结果字节 |
8012 | 57 | | MOV D, A | 临时D = A |
8013 | 78 | | MOV A, B | 将B放入A |
8014 | 32, 61, 80 | | STA 8061 H | 将其存储到OUT-BUFFER中 |
8017 | 7A | | MOV A, D | 恢复A |
8018 | 21, 62, 80 | | LXI H 8062H | 用OUT-BUFFER的最后一个位置初始化指针 |
801B | CD, 2E, 80 | | CALL UNPAK | 从压缩BCD数中分离两个半字节的子程序 |
801E | 78 | | MOV A, B | 将B复制到A |
801F | CD, 2E, 80 | | CALL UNPAK | 从压缩BCD数中分离两个半字节的子程序 |
8022 | 76 | | HLT | 终止程序 |
8023 | 86 | BCDADD | ADD M | 将HL寄存器对指定的内存位置的内容与A相加 |
8024 | 27 | | DAA | 十进制调整累加器 |
8025 | D0 | | RNC | 如果没有产生进位,则返回到调用程序 |
8026 | 57 | | MOV D, A | 将A复制到D |
8027 | 78 | | MOV A, B | 如果产生进位,则调整寄存器B的内容 |
8028 | C6. 01 | | ADI 01H | |
802A | 27 | | DAA | |
802B | 47 | | MOV B, A | |
802C | 7A | | MOV A, D | 将D复制到A |
802D | C9 | | RET | 返回到调用程序 |
802E | 57 | UNPAK | MOV D, A | 将A复制到D |
802F | E6, 0F | | ANI 0FH | 屏蔽掉最高有效四位 |
8031 | 77 | | MOV M, A | 将A写入内存 |
8032 | 23 | | INX H | 转到下一个位置 |
8033 | 7A | | MOV A, D | 将D复制到A |
8034 | E6, F0 | | ANI F0H | 屏蔽掉最低有效四位 |
8036 | 0F | | RRC | 旋转累加器4次以获得第一个BCD数字 |
8037 | 0F | | RRC | |
8038 | 0F | | RRC | |
8039 | 0F | | RRC | |
803A | 77 | | MOV M, A | 将A写入内存 |
803B | 23 | | INX H | 转到下一个位置 |
803C | C9 | | RET | 返回到调用程序 |
输出
地址 | 数据 |
---|---|
… | … |
8060 | 78 |
8061 | 04 |
8062 | 08 |
8063 | 07 |
8064 | 04 |
8065 | 00 |
… | … |
广告