问题–在8085微处理器中编写汇编语言程序, 以将两个16位数字相乘。
假设–
- 程序的起始地址:2000
- 输入存储器位置:2050、2051、2052、2053
- 输出存储器位置:2054、2055、2056、2057
示例–
INPUT:
       (2050H) = 04H
       (2051H) = 07H 
       (2052H) = 02H 
       (2053H) = 01H
OUTPUT:
        (2054H) = 08H
        (2055H) = 12H
        (2056H) = 01H
        (2057H) = O0H结果如下:
因此, 我们将两个16位数字相乘。
算法–
- 加载HL对中的第一个数据。
- 将HL对的内容移动到堆栈指针。
- 将第二对数据装入HL对并将其移至DE。
- 将H寄存器设为00H, 将L寄存器设为00H。
- 添加HL对和堆栈指针。
- 检查进位是否将进位加1, 否则进入下一步。
- 然后将E移至A, 并对累加器和寄存器D执行"或"运算。
- 运算的值为零, 然后存储该值, 否则转到步骤3。
程序–
| 内存地址 | 记忆 | 注释 | 
|---|---|---|
| 2000 | LHLD 2050 | 用地址2050加载H-L对 | 
| 2003 | SPHL | 保存在栈指针中 | 
| 2004 | LHLD 2052 | 用地址2052加载H-L对 | 
| 2007 | XCHG | 交换HL和DE配对内容 | 
| 2008 | LXI H, 0000H | H <-00H, L <-00H | 
| 200B | LXI B, 0000H | B <-00H, C <-00H | 
| 200E | DAD SP | |
| 200F | JNC 2013 | 不进位时跳跃 | 
| 2012 | INX B | BC增加1 | 
| 2013 | DCX D | 递减DE 1 | 
| 2014 | MOV A, E | A <-E | 
| 2015 | ORA D | 或累加器和寄存器的内容 | 
| 2016 | JNZ 200E | 不为零则跳跃 | 
| 2019 | SHLD 2054 | L <-2054, H <-2055 | 
| 201C | MOV L, C | L <-C | 
| 201D | MOV H, B | B < H | 
| 201E | SHLD 2056 | L <-2055, H <-2056 | 
| 2021 | HLT | 终止程序 | 
说明–寄存器B, C, D, E, H, L和累加器用于通用。
- LHLD 2050:用地址2050加载HL对。
- SPHL:将HL的内容保存在堆栈指针中。
- LHLD 2052:用地址2052加载H-L对。
- XCHG:与DE交换HL对的内容。
- LXI H, 0000H:将H设为00H, 将L设为00H。
- LXI B, 0000H:将B设为00h, 将C设为00H
- DAD SP:添加HL对和堆栈指针。
- JNC 2013:如果没有进位, 请跳转至地址2013。
- INX B:将BC寄存器加1。
- DCX D:将DE寄存器对减1。
- MOV A, E:将寄存器E的内容移至累加器。
- ORA D:或累加器和D寄存器的内容。
- JNZ 200E:如果不为零, 则跳转到地址200E。
- SHLD 2054:将结果从HL对寄存器存储到内存地址2054和2055。
- MOV L, C:将寄存器C的内容移到L。
- MOV H, B:将寄存器B的内容移到H。
- SHLD 2056:将结果从HL对寄存器存储到内存地址2056和2057。
- HLT:终止程序。

 
	![从字法上最小长度N的排列,使得对于正好为K个索引,a[i] a[i]+1](https://www.lsbin.com/wp-content/themes/begin%20lts/img/loading.png)
