问题–使用8085微处理器编写一个汇编语言程序来计算数字的阶乘。
例子 –
Input : 04H
Output : 18H
as 04*03*02*01 = 24 in decimal => 18H
在8085微处理器中,不存在直接指令将两个数字相乘,因此乘法是通过重复加法完成的,因为4×3等于4 + 4 + 4(即3倍)。
在D寄存器中加载04H->添加04H 3次-> D寄存器现在包含0CH->添加0CH 2次-> D寄存器现在包含18H->加18H 1次-> D寄存器现在包含18H->输出为18H
算法 –
- 将数据加载到寄存器B
- 要开始乘法,请将D设置为01H
- 跳至步骤7
- 递减B乘以先前的数字
- 跳至第3步,直到B> 0的值
- 将内存指针指向下一个位置并存储结果
- 向E加载B的内容并清除累加器
- 重复将D的内容添加到累加器E次
- 将累加器内容存储到D
- 转到步骤4
Address | Label | Mnemonic | Comment |
---|---|---|---|
2000H | Data | Data Byte | |
2001H | Result | Result of factorial | |
2002H | LXI H, 2000H | Load data from memory | |
2005H | MOV B, M | Load data to B register | |
2006H | MVI D, 01H | Set D register with 1 | |
2008H | FACTORIAL | CALL MULTIPLY | Subroutine call for multiplication |
200BH | DCR B | Decrement B | |
200CH | JNZ FACTORIAL | Call factorial till B becomes 0 | |
200FH | INX H | Increment memory | |
2010H | MOV M, D | Store result in memory | |
2011H | HLT | Halt | |
2100H | MULTIPLY | MOV E, B | Transfer contents of B to C |
2101H | MVI A, 00H | Clear accumulator to store result | |
2103H | MULTIPLYLOOP | ADD D | Add contents of D to A |
2104H | DCR E | Decrement E | |
2105H | JNZ MULTIPLYLOOP | Repeated addition | |
2108H | MOV D, A | Transfer contents of A to D | |
2109H | RET | Return from subroutine |
解释 –
- 首先用数据设置寄存器B。
- 通过一次调用MULTIPLY子例程将寄存器D设置为数据。
- 通过调用MULTIPLY子例程4 * 3等于4 + 4 + 4(即3次)来减少B并将D加到自身B上。
- 重复上述步骤,直到B达到0,然后退出程序。
- 结果在存储在存储器中的D寄存器中获得