昆明理工大学信息工程与自动化学院学生实验报告
( 2010 —2011 学年第一学期)
课程名称:汇编与微机接口开课实验室: 2010年12月10日
年级、专业、班
计科083
学号
姓名
成绩
实验项目名称
子程序设计
指导教师
教师评语
教师签名:
年月日
;
!程序;
。
过程调用伪操作用在过程(子程序)的前后,使整个过程形成清晰的、具有特定功能的代码块,其格式为:
procedure name PROC Attribute
:
procedure name ENDP
(1)通过寄存器传送参数
(2)如果过程和调用程序在同一源文件中,则过程可直接访问模块中的变量
(3)通过地址表传送参数地址
(4)通过堆栈传送参数或参数地址
(5)多个模块之间的参数传递问题
!程序
1. N!程序描述
在子程序嵌套的情况下,如果一个子程序调用的子程序就是它自身,这样的子程序称为递归子程序。显然递归调用是子程序嵌套的一种特殊情况。使用递归算法往往能设计出效率较高的程序。
递归调用最简单例子是计算阶乘。求N!本身是一个子程序,由于N!是N和(N-1)!的乘积,所以为求(N-1)!必须递归调用求N!的子程序,只是每次调用所使用的参数不同而已。
2. 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 ? ;保存BP值
SAV_CS_IP DW 2 DUP(?) ;保存返回地址
N DW ? ;当前N值
RESULT_ADDR DW ? ;结果地址
FRAME ENDS
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX
LEA BX,RESULT
PUSH BX ;结果地址入栈
PUSH N_VAL ;N值入栈
CALL FAR PTR FACT ;调用递归子程序
MOV CL,10
MOV AX,RESULT
DIV CL
;把阶乘结果转换成十进制数
OR AX,3030H ;转换成ASCII码
MOV DL,AL
MOV AH,2 ;显示结果的高位
INT 21H
MOV AX,RESULT
DIV CL
; 把阶乘结果转换成十进制数
OR AX,3030H ;转换成ASCII码
MOV DL,AH
MOV AH,2 ;显示结果的低位
INT 21H
R1: MOV AX,4C00H
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
,。
汇编程
汇编 子程序设计 阶乘 来自淘豆网m.daumloan.com转载请标明出处.