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 |
. . . | . . . |
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP