8085程序将16位二进制数转换为BCD
现在让我们来看一个英特尔 8085 微处理器的程序。在这个程序中,我们将看到如何将 16 位二进制数据转换为 BCD 数据。
问题陈述:
编写 8085 汇编语言程序,将 16 位二进制数据转换为 BCD 数据。二进制数据存储在 8000H 和 8001H 位置。
讨论:
这个问题通过实现 16 位计数器来解决。我们首先存储 16 位数,然后逐个减少数字,并通过调整十进制值来增加十进制值。要增加值,我们可以使用 INR 指令,但 INR 指令不影响进位标志。因此,这里我们使用 ADI 01H 将其增加 1。
二进制数取自 8000H 和 8001H 位置,最终结果存储在 8050H 到 8052H 位置。
输入:
地址 | 数据 |
---|---|
. . . | . . . |
8000 | FF |
8001 | FF |
. . . | . . . |
流程图:
程序:
地址 | 十六进制代码 | 标签 | 助记符 | 注释 |
---|---|---|---|---|
F000 | 2A, 00, 80 | LHLD 8000H | 用16位数据初始化HL | |
F003 | 11, 00, 00 | LXI D,0000H | 清零DE寄存器 | |
F006 | AF | XRA A | 清零A寄存器 | |
F007 | C6, 01 | LOOP | ADI 01H | 将01与A相加 |
F009 | 21 | DAA | 调整十进制 | |
F00A | 47 | MOV B,A | 将A存储到B | |
F00B | D2, 1B, F0 | JNC SKIP | 如果CY=0,则跳转到skip | |
F00E | 7B | MOV A,E | 将E加载到A | |
F00F | C6, 01 | ADI 01H | 将01H与A相加 | |
F011 | 27 | DAA | 十进制调整 | |
F012 | 5F | MOV E,A | 将A的值赋给E | |
F013 | D2, 1B,F0 | JNC SKIP | 如果CY=0,则跳转到skip | |
F016 | 7A | MOV A,D | 将D的值赋给A | |
F017 | C6, 01 | ADI 01H | 将01H与A相加 | |
F019 | 27 | DAA | 调整十进制 | |
F01A | 57 | MOV D,A | 将A的值赋给D | |
F01B | 2B | SKIP | DCX H | 减少DE |
F01C | 7C | MOV A,H | 将H加载到A | |
F01D | 85 | ORA L | 对A和L进行或运算 | |
F01E | 78 | MOV A,B | 将B加载到A | |
F01F | C2, 07, F0 | JNZ LOOP | 跳转到Loop | |
F022 | EB | XCHG | 交换DE和HL | |
F023 | 22, 51, 80 | SHLD 8051H | 将HL内容存储到内存中 | |
F026 | 32, 50, 80 | STA 8050H | 将A存储到内存中 | |
F029 | 76 | HLT | 终止程序 |
输出:
地址 | 数据 |
---|---|
. . . | . . . |
8050 | 35 |
8051 | 55 |
8052 | 06 |
. . . | . . . |
广告