先决条件–找到一个数字的阶乘的8085程序
问题–编写一个汇编语言程序,以使用8086微处理器来计算数字的阶乘
例子 –
Input : 04H
Output : 18H
as In Decimal : 4*3*2*1 = 24
In Hexadecimal : 24 = 18H
Input : 06H
Output : 02D0H
as In Decimal : 6*5*4*3*2*1 = 720
In Hexadecimal : 720 = 02D0H
假设–
程序的起始地址:0400
输入存储器位置:0500
输出存储器位置:0600和0601
重要的 –
如果给定数字是16位数字,则AX寄存器将自动用作第二个参数,并且乘积将存储在DX:AX寄存器对中。这意味着DX寄存器保留32位数字的高位,而AX寄存器保留32位数字的低位。
在8086微处理器中,用户具有直接指令(MUL)将两个数字相乘,因此我们不必像8085中那样将乘数乘以乘数
8086相对于8085的优势(如果是乘法):
- 无需编写庞大的代码,因为8086的代码很小
- 容易记住
- 已经有乘法指令
算法 –
- 输入要查找其阶乘的编号,并将该编号存储在CX寄存器中(LOOP指令的条件)
- 在AX(MUL指令的条件)中插入0001,在DX中插入0000
- 使用LOOP指令将CX与AX相乘,直到CX变为零(0)
- 将AX的内容复制到内存位置0600
- 将DX的内容复制到内存位置0601
- 停止执行
程序 –
ADDRESS | MNEMONICS | COMMENTS |
---|---|---|
0400 | MOV CX, [0500] | CX <- [0500] |
0404 | MOV AX, 0001 | AX <- 0001 |
0407 | MOV DX, 0000 | DX <- 0000 |
040A | MUL CX | DX:AX <- AX * CX |
040C | LOOP 040A | Go To [040A] till CX->00 |
0410 | MOV [0600], AX | [0600]<-AX |
0414 | MOV [0601], DX | [0601]<-DX |
0418 | HLT | Stop Execution |
解释 –
- MOV CX,[0500]将0500内存位置内容加载到CX寄存器
- MOV AX,0001将0001装入AX寄存器
- MOV DX,0000用0000加载DX寄存器
- MUL CX将AX与CX相乘并将结果存储在DX:AX对中
- LOOP 040A循环运行,直到CX不等于零
- MOV [0600],AX将AX寄存器内容存储到内存位置0600
- MOV [0601],DX将DX寄存器的内容存储到内存位置0601
- HLT停止执行程序