问题–在8085微处理器中编写汇编语言程序, 以将两个16位数字相除。
假设–
- 程序的起始地址:2000
- 输入存储器位置:2050、2051、2052、2053
- 输出存储器位置:2054、2055、2056、2057。
示例–
INPUT:
(2050H) = 04H
(2051H) = 00H
(2052H) = 02H
(2053H) = 00H
OUTPUT:
(2054H) = 02H
(2055H) = 00H
(2056H) = FEH
(2057H) = FFH
结果如下:
因此, 我们将两个16位数字相除。
算法–
- 将BC初始化为0000H作为商。
- 将除数装入HL对, 并将其保存在DE寄存器对中。
- 在HL对中加载股息。
- 用E寄存器减去累加器的内容。
- 将内容A移至C, 将内容H移至A。
- 用D减去A的内容。
- 将累加器的值移到H。
- 如果CY = 1, 则转到步骤10, 否则转到下一步。
- 递增寄存器B并跳至步骤4。
- 添加DE和HL的内容。
- 将剩余的存储在内存中。
- 将C的内容移至L, 将B的内容移至H。
- 将商存储在内存中。
程序–
内存地址 | 记忆 | 注释 |
---|---|---|
2000 | LXI B, 0000H | 初始化商为0000H |
2003 | LHLD 2052H | 在HL中加载除数 |
2006 | XCHG | 交换HL和DE |
2007 | LHLD 2050 | 加载被除数 |
200A | MOV A, L | A <-L |
200B | SUB E | A <-A-E |
200C | MOV L, A | L <-A |
200D | MOV, H | A <-H |
200E | SBB D | A <-A-D |
200F | MOV H, A | H <-A |
2010 | JC 2017 | 进位时跳跃 |
2013 | INX B | B <-B + 1 |
2014 | JMP 200B | |
2017 | DAD D | HL <-DE + HL |
2018 | SHLD 2056 | HL存储在内存中 |
201B | MOV L, C | L <-C |
201C | MOV H, B | H <-B |
201D | SHLD 2054 | HL存储在内存中 |
2020 | HLT | 终止程序 |
说明–
- LXI B, 0000H:将BC初始化为0000H。
- LHLD 2052H:用地址2052加载HL对。
- XCHG:与DE对寄存器交换HL对的内容。
- LHLD 2050:用地址2050加载HL对。
- MOV A, L:将寄存器L的内容移到寄存器A中。
- SUB E:用累加器的内容减去寄存器E的内容。
- MOV L, A:将寄存器A的内容移到寄存器L中。
- MOV A, H:将寄存器H的内容移到寄存器A中。
- SBB D:用进位将累加器的内容减去寄存器D的内容。
- MOV H, A:将寄存器A的内容移到寄存器H中。
- JC 2017:如果有进位, 请跳至2017年。
- INX B:BC寄存器加1。
- JMP 200B:跳转到地址200B。
- 爸爸D:添加DE和HL对的内容。
- SHLD 2056:将HL对的内容存储到内存地址2056和2057中。
- MOV L, C:将寄存器C的内容移到寄存器L中。
- MOV H, B:将寄存器B的内容移到寄存器H中。
- SHLD 2054:将HL对的内容存储到内存地址2054和2055中。
- HLT:终止程序的执行。