问题–在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) = 07H
(2057H) = O0H
结果:
因此,我们将两个16位数字相乘。
算法 –
- 加载HL对中的第一个数据。
- 将HL对的内容移到堆栈指针。
- 将第二对数据装入HL对并将其移至DE。
- 将H寄存器设为00H,将L寄存器设为00H。
- 添加HL对和堆栈指针。
- 检查进位是否将进位加1,否则进入下一步。
- 然后将E移至A并与累加器和寄存器D进行“或”运算。
- 运算的值为零,然后存储该值,否则转到步骤3。
程序 –
MEMORY ADDRESS | MNEMONICS | COMMENTS |
---|---|---|
2000 | LHLD 2050 | Load H-L pair with address 2050 |
2003 | SPHL | SAVE IT IN STACK POINTER |
2004 | LHLD 2052 | Load H-L pair with address 2052 |
2007 | XCHG | EXCHANGE HL AND DE PAIR CONTENT |
2008 | LXI H,0000H | H<-00H,L<-00H |
200B | LXI B,0000H | B<-00H,C<-00H |
200E | DAD SP | |
200F | JNC 2013 | JUMP NOT CARRY |
2012 | INX B | INCREMENT BC BY 1 |
2013 | DCX D | DECREMENT DE BY 1 |
2014 | MOV A,E | A<-E |
2015 | ORA D | OR THE CONTENT OF ACCUMULATOR AND D REGISTER |
2016 | JNZ 200E | JUMP NOT ZERO |
2019 | SHLD 2054 | L<-2054,H<-2055 |
201C | MOV L,C | L<-C |
201D | MOV H,B | B |
201E | SHLD 2056 | L<-2055,H<-2056 |
2021 | HLT | TERMINATES THE PROGRAM |
说明–寄存器B,C,D,E,H,L和累加器用于一般用途。
- LHLD 2050:将地址为2050的HL对加载。
- SPHL:将HL的内容保存在堆栈指针中。
- LHLD 2052:使用地址2052加载HL对。
- 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:终止程序。