汇编 子程序设计 阶乘
时间:2026-01-21
时间:2026-01-21
用汇编语言编写一个求N!的程序,用子程序方法实现!
昆明理工大学信息工程与自动化学院学生实验报告
( 2010 —2011 学年 第 一学期 )
课程名称:汇编与微机接口 开课实验室: 2010年12月10日
一.实验目的
1.掌握子程序设计的方法; 2.输入并汇编求N!程序; 3.观察并记录运行结果。 二.子程序设计方法 1.过程定义伪操作
过程调用伪操作用在过程(子程序)的前后,使整个过程形
成清晰的、具有特定功能的代码块,其格式为: procedure name PROC Attribute : procedure name ENDP 2.子程序调用和返回 3.保护与恢复寄存器 4.子程序的参数传递
用汇编语言编写一个求N!的程序,用子程序方法实现!
(1)通过寄存器传送参数
(2)如果过程和调用程序在同一源文件中,则过程可直接访问模
块中的变量
(3)通过地址表传送参数地址 (4)通过堆栈传送参数或参数地址 (5)多个模块之间的参数传递问题 5.增强功能的过程定义伪操作 三.输入并汇编求N!程序 1. N!程序描述
在子程序嵌套的情况下,如果一个子程序调用的子程序就是
它自身,这样的子程序称为递归子程序。显然递归调用是子程序嵌套的一种特殊情况。使用递归算法往往能设计出效率较高的程序。
递归调用最简单例子是计算阶乘。求N!本身是一个子程序,由于N!是N和(N-1)!的乘积,所以为求(N-1)!必须递归调用求N!的子程序,只是每次调用所使用的参数不同而已。 2. N!程序流程图
用汇编语言编写一个求N!的程序,用子程序方法实现!
主程序
FACT子程序
结果地址入栈
保存BP内容,建立帧首地址
结果地址入栈
保存寄存器内容
结果地址入栈
取结果地址
返回
取N
Y N=0? N 结果地址入栈
(N-1)入栈 N!=1 调用FCAT,求(N-1)
取(N-1)!
N!=N*(N-1)!
N!存入结果单元
恢复寄存器内容
返回
用汇编语言编写一个求N!的程序,用子程序方法实现!
3. N!源程序
STACKSG SEGMENT STACK 'S' ;定义堆栈
DW 128 DUP('ST') STACKSG ENDS DATA SEGMENT
N_VAL DW 4 ;定义N值 RESULT DW ? ;结果
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACKSG
FRAME STRUC SAV_BP DW SAV_CS_IP DW 2 DUP(?) N DW RESULT_ADDR DW FRAME ENDS
MAIN PROC FAR
MOV MOV LEA PUSH BX PUSH N_VAL ;N CALL FAR PTR FACT ; MOV CL,10 MOV AX,RESULT DIV CL
OR AX,3030H MOV DL,AL
MOV AH,2 INT 21H MOV AX,RESULT DIV CL
OR AX,3030H MOV DL,AH
MOV AH,2 INT 21H
R1: MOV AX,4C00H
;定义帧结构 ? ;保存BP值
;保存返回地址 ? ;当前N值 ? ;结果地址 AX,DATA DS,AX BX,RESULT
;结果地址入栈 值入栈
调用递归子程序 ;把阶乘结果转换成十进制数
;转换成ASCII码 ;显示结果的高位 ; 把阶乘结果转换成十进制数
;转换成ASCII码 ;显示结果的低位
用汇编语言编写一个求N!的程序,用子程序方法实现!
INT 21H
MAIN ENDP
FACT PROC FAR ;N!递归子程序
PUSH BP ;保存BP值
MOV BP,SP ;BP指向帧基地址 PUSH BX PUSH AX
MOV BX,[BP].RESULT_ADDR MOV AX,[BP].N ;取帧中N值 CMP AX,0
JE DONE ;N=0时退出子程序嵌套 PUSH BX;为下一次调用压入结果地址 DEC AX
PUSH AX;为下一次调用压入(N-1)值 CALL FAR PTR FACT
R2: MOV BX,[BP].RESULT_ADDR
MOV AX,[BX] ;取中间结果(N-1)! MUL [BP].N ;N*(N-1)! JMP SHORT RETURN
DONE: MOV AX,1 ;0!=1
RETURN: MOV [BX],AX ;存中间结果 POP AX POP BX POP BP RET 4
FACT ENDP CODE ENDS
END MAIN
四.实验记录和运行结果 1.用MASM程序产生OBJ文件
用汇编语言编写一个求N!的程序,用子程序方法实现!
使用jiecheng.asm作为输入文件,通过汇编程序MASM程序产生二进制的目标文件JIECHENG.OBJ。
2.用LINK程序产生EXE文件
汇编程序已产生出二进制的目标文件JIECHENG.OBJ,但JIECHENG.OBJ文件不是一个可执行文件,还必须使用连接程序(LINK)把JIECHENG.OBJ文件转换为可执行的JIECHENG.EXE文件。
3.在DOS环境中执行N!程序
输入:D:\huibian>jiecheng.exe 运行结果如图:
用汇编语言编写一个求N!的程序,用子程序方法实现!
4的阶乘为:24
五.使用DEBUG程序跟踪观察程序的执行过程
1.使用U命令查看JIECHENG.EXE可执行文件的反汇编代码
下一篇:影响弱电解质的电离平衡因素