8085程序:加两个多字节BCD数
现在让我们来看一个Intel 8085微处理器的程序。这个程序主要用于添加多位BCD(二进制编码的十进制)数。
问题陈述
编写8085汇编语言程序,以添加两个多字节BCD(二进制编码的十进制)数。
讨论
我们使用4字节BCD数。这些数字存储在内存位置8501H和8505H中。一个额外的信息存储在位置8500H。在这里,我们存储字节计数。结果存储在位置85F0H。
HL对存储第一个操作数的字节地址,DE存储第二个操作数的字节地址。C保存字节计数。我们使用堆栈来存储结果的中间字节。在加法运算完成后,我们从堆栈中弹出并存储到目标位置。
输入
| 地址 | 数据 |
|---|---|
| . . . | . . . |
| 8500 | 04 |
| 8501 | 19 |
| 8502 | 68 |
| 8503 | 12 |
| 8504 | 85 |
| 8505 | 88 |
| 8506 | 25 |
| 8507 | 17 |
| 8508 | 20 |
| . . . | . . . |
流程图

程序
| 地址 | 十六进制代码 | 标签 | 助记符 | 注释 | |
|---|---|---|---|---|---|
| F000 | 31,00, 20 | LXI SP, 2000H | 初始化堆栈指针 | ||
| F003 | 21,00, 85 | LXI H,8500H | 加载内存地址以获取字节计数 | ||
| F006 | 4E | MOV C,M | 将内存内容加载到C寄存器 | ||
| F007 | 06,00 | MVI B,00H | 清除B寄存器 | ||
| F009 | 21,01, 85 | LXI H, 8501H | 加载第一个参数地址 | ||
| F00C | 11,05, 85 | LXI D, 8505H | 加载第二个参数地址 | ||
| F00F | 1A | LOOP | LDAX D | 将DE与第二个操作数地址加载 | |
| F010 | 8E | ADC M | 将内存内容和进位与累加器相加 | ||
| F011 | 27 | DAA | 对累加器内容进行十进制调整 | ||
| F012 | F5 | PUSH PSW | 将累加器内容存储到堆栈中 | ||
| F013 | 4 | INR B | 将B增加1后压入堆栈 | ||
| F014 | 23 | INX H | 增加HL对以指向下一个地址 | ||
| F015 | 13 | INX D | 增加DE对以指向下一个地址 | ||
| F016 | 0D | DCR C | 减少C,直到所有字节都未用尽 | ||
| F017 | C2,0F, F0 | JNZ LOOP | 当字节未被考虑时,再次循环 | ||
| F01A | D2,21, F0 | JNC SKIP | 当进位=0时,跳转到存储 | ||
| F01D | 3E,01 | MVIA, 01H | 当进位=1时,将其压入堆栈 | ||
| F01F | F5 | PUSH PSW | 将累加器内容存储到堆栈中 | ||
| F020 | 04 | INR B | 将B增加1后压入堆栈 | ||
| F021 | 21,F0, 85 | SKIP | LXIH, 85F0H | 加载目标指针 | |
| F024 | F1 | L1 | POP PSW | 弹出AF以从堆栈中取回字节 | |
| F025 | 77 | MOV M, A | 将累加器数据存储在HL指向的内存位置 | ||
| F026 | 23 | INX H | 增加HL对以指向下一个地址 | ||
| F027 | 05 | DCR B | 减少B | ||
| F028 | C2,24, F0 | JNZ L1 | 转到L1以存储堆栈内容 | ||
| F02B | 76 | HLT | 终止程序 | ||
输出
| 地址 | 数据 |
|---|---|
| . . . | . . . |
| 85F0 | 01 |
| 85F1 | 05 |
| 85F2 | 29 |
| 85F3 | 94 |
| 85F4 | 07 |
| . . . | . . . |
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP