1.15.1 实验目的 通过编写一个阶乘计算程序,了解高级语言中的数学函数是怎样在汇编语言一级 上实现的。 1.15.2 实验内容 编写计算 N !的程序,数值 N 由键盘键入,结果在屏幕上显示。N 的范围为 0---65535。即刚好能被一个 16 位寄存器容纳。 1.15.3 编程提示 编写阶乘程序中的难点在于随着 N 的增大,其结果不是寄存器所能容纳。这样就 必须把结果放在一个内存缓冲区中。然而乘法运算只能限制于两个字相乘,因此要确 定好算法,依次从缓冲区中取数,进行两字相乘,并将 DX 中的高 16 位积作为产生的 进位。 程序根据阶乘的定义:N!=N*(N-1)*(N-2)*• • • *2*1,从左往右依次计算, 结果保存在缓冲区 BUF 中,缓冲区 BUF 按结果由低到高依次排列。程序首先将 BP 初始化存放 N 值,然后使 BP 为 N-1,以后依次减 1,直至变化为 1。每次让 BP 与 BUF 中的字单元按由低到高的次序相乘。低位结果 AX 仍保存在相应的 BUF 字单元中,最 高位结果 DX 则进到进位字单元 CY 中,以作为高字单元相乘时从低字来的进位。初 始化 CY 为 0。计算结果的长度随着乘积运算而不断增长,由字单元 LEN 指示。当最 高字单元与 BP 相乘时,若 DX 不为 0,则结果长度要扩展。 按照上述实验要求给出一个MASM for Windows环境下的汇编代码
时间: 2023-12-03 20:46:25 浏览: 196
以下是计算阶乘的汇编代码:
```assembly
.MODEL SMALL
.STACK 100H
.DATA
BUF DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
N DW ?
LEN DW 1
CY DW 0
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
; 输入阶乘数值
MOV AH, 01H
INT 21H
SUB AL, 30H ; 将 ASCII 码转换为数字
MOV N, AX
; 初始化 BUF
MOV AX, 1
MOV BX, OFFSET BUF
MOV WORD PTR [BX], AX
; 计算阶乘
MOV BP, N
DEC BP
LOOP:
MOV AX, WORD PTR [BUF] ; 取 BUF 中的字单元
MUL BP ; 与 BP 相乘
MOV WORD PTR [BX], AX ; 存入 BUF 中
ADD CX, DX ; 将 DX 加到 CX 中
ADC CY, 0 ; 将 CY 加上进位
MOV AX, CX ; 将 CX 赋给 AX
MOV CX, WORD PTR [LEN] ; 取 LEN 的值
MOV BX, OFFSET BUF ; 取 BUF 的地址
; 将 AX 按字单元存入 BUF 中,同时更新 LEN 的值
STORE:
MOV DX, WORD PTR [BX+CX*2] ; 取 BUF 中的字单元
ADD DX, AX ; 加上 AX 的低 16 位
MOV WORD PTR [BX+CX*2], DX ; 存入 BUF 中
ADC AX, 0 ; 将 AX 的高 16 位加到 CY 上
DEC CX
CMP CX, 0
JNE STORE
; 更新 LEN 的值
MOV AX, WORD PTR [LEN]
ADD AX, 1
MOV WORD PTR [LEN], AX
; 更新 BP 的值
DEC BP
CMP BP, 0
JNZ LOOP
; 输出结果
MOV AH, 02H
MOV DL, 0DH
INT 21H
MOV DL, 0AH
INT 21H
MOV CX, WORD PTR [LEN]
MOV BX, OFFSET BUF
PRINT:
MOV AX, WORD PTR [BX+CX*2-2]
ADD AL, 30H ; 将数字转换为 ASCII 码
MOV DL, AL
MOV AH, 02H
INT 21H
DEC CX
CMP CX, 0
JNZ PRINT
MOV AH, 4CH
INT 21H
MAIN ENDP
END MAIN
```
阅读全文