汇编 子程序设计 阶乘

时间: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可执行文件的反汇编代码

…… 此处隐藏:1019字,全部文档内容请下载后查看。喜欢就下载吧 ……

汇编 子程序设计 阶乘.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    Copyright © 2023-2025 学科文库 版权所有
    本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
    客服QQ:370150219 邮箱:370150219@qq.com
    苏ICP备16052595号-5

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:4.9 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:19元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219