8085程序用于乘以两个两位BCD数
现在让我们来看一个Intel 8085微处理器的程序。这个程序将找到两个BCD数的乘积结果。
问题陈述
编写8085汇编语言程序以查找两个BCD数的乘积。这些数字存储在8000H和8001H位置。
讨论
在这个程序中,数据是从8000H和8001H获取的。结果存储在8050H和8051H位置。
众所周知,8085没有乘法指令,因此我们必须使用重复加法方法。在这个过程中,在每次加法之后,我们都会调整累加器值以获得十进制等价物。当存在进位时,我们会增加MS-Byte的值。 我们可以使用INR指令进行递增,但这里使用ADI 01H。INR指令不影响CY标志,因此我们需要ADI指令。
输入
第一个输入
地址 | 数据 |
---|---|
. . . | . . . |
8000 | 12 |
8001 | 20 |
. . . | . . . |
第二个输入
地址 | 数据 |
---|---|
. . . | . . . |
8000 | 27 |
8001 | 03 |
. . . | . . . |
流程图
程序
地址 | 十六进制代码 | 标签 | 助记符 | 注释 |
---|---|---|---|---|
F000 | 21, 00, 80 | LXI H,8000H | 加载第一个操作数地址 | |
F003 | 46 | MOV B, M | 将第一个操作数存储到B | |
F004 | 23 | INX H | 增加HL对 | |
F005 | 4E | MOV C, M | 将第二个操作数存储到寄存器C | |
F006 | 1E, 00 | MVI E, 00H | 清除寄存器E | |
F008 | 63 | MOV H, E | 清除H寄存器 | |
F009 | 7B | MOV A, E | 清除A寄存器 | |
F00A | B9 | CMP C | 将C与A比较 | |
F00B | CA, 23, F0 | JZ DONE | 当Z=0时,跳转到DONE | |
F00E | 80 | LOOP | ADD B | 将B与A相加 |
F00F | 27 | DAA | 十进制调整 | |
F010 | 57 | MOV D, A | 将A存储到D | |
F011 | D2, 19, F0 | JNC NINC | 跳转到NINC | |
F014 | 7C | MOV A, H | 将H存储到A | |
F015 | C6, 01 | ADI 01H | 将A增加1 | |
F017 | 27 | DAA | 十进制调整 | |
F018 | 67 | MOV H, A | 从A恢复H | |
F019 | 7B | NINC | MOV A, E | 将E加载到A |
F01A | C6, 01 | ADI 01H | 将A增加1 | |
F01C | 27 | DAA | 十进制调整 | |
F01D | 5F | MOV E, A | 从A恢复E | |
F01E | B9 | CMP C | 将C与A比较 | |
F01F | 7A | MOV A,D | 将D加载到A | |
F020 | C2, 0E, F0 | JNZ LOOP | 跳转到LOOP | |
F023 | 6F | DONE | MOV L, A | 将A加载到L |
F024 | 22, 50, 80 | SHLD 8050H | 将HL对存储在8050和8051位置 | |
F027 | 76 | HLT | 终止程序 |
输出
第一个输出
地址 | 数据 |
---|---|
. . . | . . . |
8050 | 40 |
8051 | 02 |
. . . | . . . |
第二个输出
地址 | 数据 |
---|---|
. . . | . . . |
8050 | 81 |
8051 | 00 |
. . . | . . . |
广告