子程序设计实验
子程序设计实验报告1
子程序设计实验报告学号:0740303104姓名:雷凤子程序设计实验报告一、实验目的:1、训练子程序;调用程序以及DOS功能调用程序的编制,进一步熟悉和灵活使用系统功能调用,培养根据具体情况合理划分程序模块的能力2、掌握主、子程序之间的调用关系,联结方法,提高使用各种参数传递方法的正确性和灵活性。
3、掌握调试主、子程序的基本方法,通过调试进一步理解和加深堆栈在子程序设计中的重要意义的认识4、上机前要求写好被调试程序的程序文本,并进行静态调试,然后拟定好调试计划和上机操作步骤。
二、实验要求:1、具体了解和掌握call指令,主,子程序之间的调用和在使用时应注意的问题2、学习子程序设计和调用的一般方法。
三、实验内容1、实验任务试编制一程序,分别对NUM字节单元数组中统计出有多少个20,有多少个5,有多少个2,有多少个1.统计的个数分别放在NUM20、num5、num2、num1单元中。
1. 程序要求用主程序-子程序的结构形式编制。
2. 并且传递参数的方式为堆栈方法。
2、实验的原理在主程序部分,将统计个数的单元分别放在俩个通用寄存器——AH,AL,DH,DL中,数组首址和数组长度都压栈,设置一个循环次数,送给CX,再调用输出语句进行输出。
最重要的是子程序JUSUAN,做好保护现场等准备工作后就将数组中的每个元素分别与20,5,2,1比较,根据不同的结果转到不同的分支语句,对应的不同的计数器相应地增1,并修改地址,继续循环比较。
3、程序设计流程图子程序流程图四、实验步骤1、编辑(纪事本)DATAS SEGMENTNUM DB 20,1,20,5,2,5,2,2,2,20 COUNT EQU $-NUMNUM20 DB?NUM5 DB?NUM2 DB?NUM1 DB?;此处输入数据段代码DATAS ENDSSTACK SEGMENT PARA STACK 'STACK' STAPN DB 100 DUP(?);此处输入堆栈段代码STACK ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACK MAIN PROC FARPUSH DSSUB AX,AXPUSH AXMOV AX,DATASMOV DS,AXMOV AX,STACKMOV SS,AXSTART:MOV BX,OFFSET NUM ;取偏移地址MOV CX,COUNT ;数组长度送给CXPUSH BX ;数组首地址入栈PUSH CX ;数组长度进栈 CALL JISUAN ;调用子程序MOV NUM20,AH ;将统计的个数保存MOV NUM5,ALMOV NUM2,DHMOV NUM1,DLMOV CX,4 ;设置循环次数LEA DI,NUM20 ;取偏移地址COUT:ADD [DI],30H ;输出MOV DL,[DI]MOV AH,02HINT 21HINC DILOOP COUTRETMAIN ENDPJISUAN PROC;PUSH Bx ;保护现场PUSH CXPUSH BPMOV BP,SP ;当前栈顶地址送BP BEGIN:MOV DI,[BP+10] ;DIMOV CX,10 ;CXSUB AX,AX ;计数器清零SUB DX,DX ;计数器清零GO:CMP BYTE PTR [DI],20JE NEXT1 ;比较,相等就转CMP BYTE PTR [DI],5JE NEXT2CMP BYTE PTR [DI],2JE NEXT3CMP BYTE PTR [DI],1JE NEXT4DO: INC DI ;修改地址LOOP GOJMP ANEXT1: INC AH ;计数器加1 JMP DONEXT2: INC ALJMP DONEXT3: INC DHJMP DONEXT4: INC DL JMP DOA: ;POP BX ;恢复现场POP CXPOP BPRET 4;此处输入代码段代码;JISUAN ENDPCODES ENDSEND MAIN2、汇编(masm/ML)3、连接(link)4、调试(debug)5、运行3241Press any key to continue五、实验中各个步骤遇到的问题及解决方法、1、汇编(masm/ML)虽然思路比较清晰,但在用堆栈方式进行参数传递时出现了一些语法错误,不知道该何时进栈,对到底应该哪个寄存器进栈也没弄太明白。
子程序设计实验报告
实验名称:子程序设计实验日期:2023年X月X日实验地点:XX大学计算机实验室实验目的:1. 理解子程序的概念和作用。
2. 掌握子程序的设计方法和调用方式。
3. 学会使用子程序提高程序的可读性和可维护性。
实验内容:一、实验背景子程序是程序设计中常用的一种结构,它可以将一段具有独立功能的代码封装起来,方便在其他程序中调用。
使用子程序可以提高程序的可读性、可维护性和模块化程度。
二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 编程语言:C++三、实验步骤1. 创建一个新的C++项目,命名为“子程序设计”。
2. 在项目中创建一个头文件“Subroutine.h”,用于声明子程序。
3. 在头文件中声明两个子程序:`Add` 和 `Subtract`。
4. 在头文件中定义一个全局变量 `Result`。
5. 在源文件“Subroutine.cpp”中实现头文件中声明的子程序。
6. 在主函数中调用子程序,并输出结果。
7. 编译并运行程序,观察输出结果。
四、实验代码1. 头文件“Subroutine.h”:```cpp#ifndef SUBROUTINE_H#define SUBROUTINE_Hvoid Add(int a, int b);void Subtract(int a, int b); int Result;#endif // SUBROUTINE_H```2. 源文件“Subroutine.cpp”:```cpp#include "Subroutine.h"void Add(int a, int b) {Result = a + b;}void Subtract(int a, int b) { Result = a - b;}```3. 主函数“main.cpp”:```cpp#include <iostream>#include "Subroutine.h"int main() {int a = 10;int b = 5;Add(a, b);std::cout << "Add: " << Result << std::endl;Subtract(a, b);std::cout << "Subtract: " << Result << std::endl;return 0;}```五、实验结果与分析1. 编译并运行程序,输出结果如下:```Add: 15Subtract: 5```2. 分析:(1)在实验中,我们首先在头文件中声明了两个子程序 `Add` 和 `Subtract`,它们分别用于计算两个整数的和与差。
实验四 子程序设计
数据分析并记录
3)根据上机操作进行记录(模仿实验三设计本实验执行情
况表格并记录)
表一
寻找最大数执行情况表 (实三)
DS:0000 DS:0001 DS:0002 1234H 5678H 2597H
SUM 8E43H
编写实验报告
子程序设计
6、实验报告要求(见附录)
1)实验报告要求有实验目的、要求、设备或仪 器、程序设计、步骤、数据分析。数据分析填 在报告本的原始数据栏。 2)画出实验内容1)2)程序设计流程图、写出程 序清单并有简要注释。 3)写出实验过程中所遇到的问题与解决的办法。
实验设备 仿真软件使用
子程序设计 d. 对原程序进行汇编与链接,通过观察输出 窗口的信息,确定对汇编程序的修改。有错误, 进行修改,随即汇编与链接,直到无错误为止, 形成 *.exe可执行的文件。 e. 在调试界面中采用不同方式调试程序(采用 单步、连续等运行方式,调试程序),通过 “vars”功能,观察符号变量数据变化。查 看????单元中的内容。
1)多数求和程序设计(求和部分使用子程序) 。 2) N!(N=6)计算程序设计。
2、实验目的
了解子程序结构,掌握其编程与调试方法
实验设备 仿真软件使用
子程序ቤተ መጻሕፍቲ ባይዱ计
3、实验设备与仪器
PC机、emu8086仿真软件。
4、实验步骤
a. 检查实验设置外接电源,开启PC机。 b. 进入软件集成操作环境主界面,按NEW建立新 文件,即可开始输入源程序。 c. 输入程序后,按Ctrl+S保存程序(规定扩展 名为 *.asm源程序文件)。
数据分析并记录
子程序设计
5、程序设计
1)工作原理 子程序又称过程,由过程伪操作指令PROC定 义开始,ENDP定义结束,属性可以是NEAR或FAR。 与主程序在同一代码段中的子程序使用NEAR属性, 与主程序不在同一代码段中的子程序使用FAR属 性。
实验报告 子程序设计实验
实验5 子程序实验一.实验目的1.掌握主程序与子程序之间的调用关系及调用方法;2.掌握子程序调用过程中近程调用与远程调用的区别;3.掌握通过堆栈转送参数的方法。
4. 掌握多模块程序设计方法二.实验内容1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
DATAS SEGMENTBUF DB00000111B,00100001B,00100010B,00000011B,00000101B,B,B,00100100B,B,01010010BCAN DB $-BUF ;定义常量CANDATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASMAIN PROC FAR ;主程序块START:MOV AX,DATASMOV DS,AXMOV CL,10LEA SI,BUFLOOP1: ;调用子程序语句call HEXACcall DISPDEC CANJNZ LOOP1EXIT:MOV AH,4CHINT 21HMAIN ENDPHEXAC PROC NEAR ;二进制转换成十六进制子程序MOV BL,[SI]INC SIRETHEXAC ENDP显示子程序DISP PROC NEAR ;MOV CL,4MOV CH,2MOVE: ;移位语句ROL BL,CLMOV DL,BLAND DL,0FHADD DL,30HCMP DL,'9'JBE PRINTADD DL,07HPRINT:MOV AH,02H ;显示语句INT 21HDEC CHJNZ MOVEMOV DL,' 'MOV AH,02HINT 21HRETDISP ENDPCODES ENDSEND START2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符'b'的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
子程序设计实验报告范文精简处理
子程序设计实验报告范文精简处理实验报告是对实验目的、流程、结果和结论等内容的详细描述和总结。
以下是一份精简处理的子程序设计实验报告范文,共计1245字。
#实验报告名称:子程序设计实验##一、实验目的1.熟悉子程序的定义和使用方法;2.掌握子程序设计的基本思路和技巧;3.实践并提高对程序模块化设计的理解和能力。
##二、实验设备和材料-计算机-C语言编程环境##三、实验方法与流程1.根据实验要求,在C语言编程环境中编写一个独立的子程序;2.使用该子程序计算并输出指定的结果;3.程序编写完成后,编译并运行该程序,观察结果是否符合要求。
##四、实验内容1. 设计一个名为`sum`的子程序,接受一个整型数组和数组长度作为参数,计算数组元素之和,并返回该和;2.编写主程序,使用该子程序求解一个整型数组的元素之和;3.输出求和结果,观察是否正确。
##五、实验结果与分析实验中,我们使用了一组测试数据进行验证。
首先,定义一个整型数组`arr`,其中包含5个元素:{1, 2, 3, 4, 5}。
然后,将该数组和数组长度传递给`sum`子程序进行求和操作。
经过运行,我们得到的结果是15,与我们预期的结果一致。
因此,可以判断子程序设计正确,并成功实现了数组元素之和的计算功能。
##六、实验总结通过本次实验,我们成功设计并实现了一个独立的子程序,在主程序中调用该子程序计算了一个整型数组的元素之和。
通过此次实验,我们进一步熟悉了子程序的定义和使用方法,掌握了子程序设计的基本思路和技巧,并提高了对程序模块化设计的理解和能力。
这对于今后的软件开发和编程工作具有重要意义。
##七、实验心得本次实验让我更加深入地理解了子程序设计的重要性和作用。
通过将功能模块化,我们可以方便地组织和管理程序代码,提高代码的复用性和可维护性。
在实际的软件开发中,子程序设计及其正确使用是非常关键的,能够大大提高开发效率和代码的可靠性。
因此,我会继续学习和掌握更多的子程序设计技巧,并应用于未来的编程工作中。
汇编实验报告--子程序设计实验
实验五子程序设计实验学生姓名:何茂杰学号:2010305104 专业班级:计算机本科一班指导老师:文远熔实验日期:实验成绩:一、实验目的1.掌握主程序与子程序之间的调用关系及调用方法;2.掌握子程序调用过程中近程调用与远程调用的区别;3.掌握通过堆栈转送参数的方法。
二、实验内容1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
三、实验环境PC微机DOS操作系统或Windows 操作系统四、实验要求1.第一个实验程序用子程序的近程调用实现。
由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。
实验过程中可以从堆栈的内容看到两个子程序的返回地址值。
由于是近调用,地址值只包括返回地址的段内偏移量。
在每个子程序的执行中,检查CS值是不变的。
2.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。
五、主要实验步骤1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。
特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。
3.检查程序执行的结果是否正确。
六.实验结果:七.心得体会了解了把BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码源代码:.MODEL SMALL.336.STACK 200H.DA TAAS CV AL DB ‘12345’BINV AL DW ?.CODEMAIN PROCSTART:MOV AX,@DA TAMOV DS,AXLEA BX ASCV ALPUSH BXLEA BX,BINV ALPUSH BXCALL CONV ASCBINMOV AX,4C00HINT 21HMAIN ENDPCONV ASCBIN PROCPUSH BPMOV BP,SPADD SP AXPUSH AXPUSH BXPUSH CXPUSH SIPUSH DIMOV BX,0AHMOV SI,[BP+6]MOV DI,[BP+4]SUB DI,SIMOV [BP-2],DIMOV CX,[BP-2]ADD SI,[BP-2]DEC SIMOV WORDE PTR[BP-4],0001MOV DI,[BP+4]MOV WORD PTR[DI],0 NEXT:MOV AL,[SI]AND AX,000FHMUL WORD PTR[BP-4]ADD [DI],AXMOV AX,[BP-4]MUL BXMOV [BP-4],AXDEC SILOOP NEXTPOP DIPOP SIPOP CXPOP BXPOP AXMOV SP,BPPOP BPRET 0004CONV ASCBIN ENDPEND MAIN。
实验五 子程序设计实验(设计性实验)
实验五子程序设计实验(设计性实验)一、实验要求和目的1.熟悉汇编语言程序设计结构;2.熟悉汇编语言子程序设计方法;3.熟悉利用汇编语言子程序参数传递方法;4.熟悉汇编语言字符串处理基本指令的使用方法;5.掌握利用汇编语言实现字符串的输入输出程序设计方法;6.掌握数制转换程序实现方法。
二、软硬件环境1、硬件环境:计算机系统 windows;2、软件环境:装有MASM、DEBUG、LINK、等应用程序。
三、实验涉及的主要知识子程序知识要点:1、掌握子程序的定义语句;过程名 PROC [near/far]过程体RET过程名 ENDP2.子程序结构形式一个完整的子程序一般应包含下列内容:1. )子程序的说明部分在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法。
说明时,应含如下内容:.子程序名:命名时要名中见意..子程序的功能:说明子程序完成的任务;.子程序入口参数:说明子程序运行所需参数及存放位置;.子程序出口参数:说明子程序运行结果的参数及存放位置;.子程序所占用的寄存器和工作单元;.子程序调用示例;2、)掌握子程序的调用与返回在汇编语言中,子程序的调用用CALL,返回用RET 指令来完成。
.段内调用与返回:调用子程序指令与子程序同在一个段内。
因此只修改IP;.段间调用与返回:调用子程序与子程序分别在不同的段,因此在返回时,需同时修改CS:IP。
3.)子程序的现场保护与恢复保护现场:在子程序设计时,CPU 内部寄存器内容的保护和恢复。
一般利用堆栈实现现场保护和恢复的格式:过程名PROC [NEAR/FAR]PUSH AXPUSH BXPUSH DX……POP DXPOP BXPOP AXRET过程名 ENDP4.子程序的参数传递方法1.寄存器传递参数这种方式是最基本的参数传递方式。
2.存储器单元传(变量)递参数这种方法是在主程序调用子程序前,将入口参数存放到约定的存储单元中;子程序运行时到约定存储位置读取参数;子程序执行结束后将结果也放在约定存储单元中。
子程序设计实验报告
子程序设计实验报告子程序设计实验报告1. 实验背景子程序是一种可重复使用的程序代码片段,能够被主程序调用执行。
本次实验旨在通过编写子程序来加深对子程序设计的理解,并能够熟练使用子程序进行程序的模块化设计。
2. 实验目的通过本次实验,我将掌握以下技能:- 理解子程序的概念和作用- 掌握子程序的定义和调用- 理解子程序的参数传递方式- 学会使用子程序进行程序的模块化设计3. 实验内容本次实验涉及三个任务,分别是:1. 编写一个计算两个数之和的子程序2. 编写一个计算阶乘的子程序3. 编写一个计算圆形面积的子程序4. 实验步骤4.1 编写计算两个数之和的子程序首先,我们需要编写一个子程序用来计算两个数之和。
以下是该子程序的代码示例:pythondef add_numbers(num1, num2):sum = num1 + num2return sum上述代码中,我们定义了一个名为`add_numbers`的子程序,该程序接收两个参数`num1`和`num2`,计算它们的和并返回结果。
4.2 编写计算阶乘的子程序接下来,我们需要编写一个子程序用来计算一个数的阶乘。
以下是该子程序的代码示例:pythondef factorial(n):if n <= 1:return 1else:return n factorial(n-1)上述代码中,我们定义了一个名为`factorial`的子程序,该程序接收一个参数`n`,计算`n`的阶乘并返回结果。
我们使用递归的方式实现了阶乘的计算。
4.3 编写计算圆形面积的子程序最后,我们需要编写一个子程序用来计算圆形的面积。
以下是该子程序的代码示例:pythondef calculate_circle_area(radius):pi = 3.14159area = pi radius radiusreturn area上述代码中,我们定义了一个名为`calculate_circle_area`的子程序,该程序接收一个参数`radius`,计算圆形的面积并返回结果。
子程序设计实验报告
子程序设计实验报告子程序设计实验报告1. 实验目的本实验旨在让学生通过设计和实现子程序,深入了解子程序的概念、使用方法和设计原则,培养学生的程序设计思维和编程能力。
2. 实验背景子程序是一个独立于主程序的独立程序段,它可以完成特定的任务并返回结果。
子程序可以被主程序调用多次,不仅可以提高程序的可读性和可维护性,还可以节省重复代码的编写和修改时间。
在实际的程序设计中,子程序被广泛应用于各种领域,如算法实现、功能模块划分、错误处理等。
3. 实验内容在这个实验中,我们将设计一个简单的子程序,实现一个猜数字的游戏。
游戏的规则是计算机随机一个1到100之间的整数,用户通过输入猜测的数字,计算机根据用户的猜测给出相应的提示,直到用户猜中为止。
实验要求:- 使用 Python 编程语言实现。
- 设计一个子程序,用于随机数。
- 设计一个子程序,用于接受用户输入并判断是否猜中。
- 设计一个子程序,用于给出猜测结果的提示。
4. 实验步骤4.1 设计子程序:随机数,我们需要设计一个子程序,用于一个1到100之间的整数。
可以使用 Python 的 random 模块中的 randint 函数来实现。
pythonimport randomdef generate_random_number():return random.randint(1, 100)4.2 设计子程序:接受用户输入并判断是否猜中接下来,我们设计一个子程序,用于接受用户输入的猜测数字,并判断是否猜中。
可以使用 Python 的 input 函数来接受用户输入,并使用 if 语句来判断用户猜测的数字是否与的随机数一致。
pythondef get_user_guess():guess = int(input(\。
子程序设计实验报告简版修正
子程序设计实验报告1. 实验目的本实验旨在通过设计子程序,巩固和提升学生对于子程序设计的理解和运用能力,培养学生的逻辑思维和程序设计能力。
2. 实验内容2.1 设计一个子程序,实现两个数相加的功能。
2.2 设计一个子程序,实现两个数相乘的功能。
2.3 设计一个子程序,实现对一个数的平方根的计算。
3. 实验步骤3.1 子程序1:实现两个数相加assemblyadd_numbers:; 输入:寄存器R1和R2分别存放两个待相加的数; 输出:寄存器R0存放相加结果; 保存现场PUSH R1PUSH R2; 执行相加操作ADD R0, R1, R2; 恢复现场POP R0POP R2POP R1; 返回RET3.2 子程序2:实现两个数相乘assemblymultiply_numbers:; 输入:寄存器R1和R2分别存放两个待相乘的数 ; 输出:寄存器R0存放相乘结果; 保存现场PUSH R1PUSH R2; 执行相乘操作MUL R0, R1, R2; 恢复现场POP R0POP R2POP R1; 返回RET3.3 子程序3:实现对一个数的平方根的计算assemblycalculate_sqrt:; 输入:寄存器R1存放待计算平方根的数 ; 输出:寄存器R0存放计算结果; 保存现场PUSH R1PUSH R0; 初始化结果为0XOR R0, R0; 循环计算平方根LDR R2, 1 ; 设定计算误差精度为1 sqrt_loop:; 比较结果的平方与待计算数的大小MUL R3, R0, R0CMP R3, R1; 结果满足精度要求,跳出循环BHI sqrt_done; 调整结果ADD R0, R0, R2; 继续循环B sqrt_loopsqrt_done:; 恢复现场POP R0POP R1; 返回RET4. 实验结果和分析经过上述子程序的设计和实现,我们实现了两个数相加、两个数相乘、以及一个数的平方根的计算功能。
实验七子程序设计
实验七:子程序设计一、实验目的:通过运行例题程序,了解并掌握简单子程序的编写以及调用方法。
二、实验基础知识:1、什么是子程序?子程序又称为过程,是能完成特定功能有一定通用性的程序段,在需要时能被其它程序调用。
调用子程序的程序常称为主程序。
一般把源程序中反复出现的程序段或常用的功能独立的程序段设计成子程序供用户使用。
这样可以简化源程序结构、节省目标程序的存储空间,提高程序设计的效率。
子程序结构也是模块化程序设计的基础。
2、子程序的定义子程序的定义是由过程定义伪指令PROC和ENDP实现,格式如下:过程名PROC [NEAR|FAR]…;过程体(实现某功能的指令集合体)过程名ENDP说明:NEAR属性的过程只能被相同代码段的其他程序调用,FAR属性的过程可以被不同代码段的程序调用。
过程体中必须包括RET(返回主程序)指令。
其中PROC表示过程定义开始,ENDP表示过程定义结束。
过程名是过程入口地址的符号表示。
(1)子程序和主程序在同一个代码段中,则子程序定义为NEAR属性。
(2)子程序和主程序不在同一个代码段中,则子程序定义为FAR属性。
(3)主程序通常定义为FAR属性,这是因为主程序被看作DOS调用的一个子程序,以便执行完返回DOS。
3、子程序的设计方法子程序可以放在代码段主程序开始执行之前的位置,也可放在代码段的末尾主程序执行终止后的位置。
为了便于其他程序员能正确使用子程序,在编写子程序时,还要养成书写子程序说明信息的良好习惯。
子程序说明信息一般包括以下内容:(1)子程序名(2)功能描述(3)入口和出口参数(4)调用注意事项和说明等子程序实例:;子程序名:stob;功能:将小写字母修改为大写字母;入口参数:al存放输入的字符;出口参数:al存放修改后的字符stob proc nearcmp al,61hjb nextcmp al,7ahja nextsub al,20h;小写改大写next:retstob endp4、子程序的调用方法子程序调用由CALL指令实现。
实验6 子程序程序设计
4.1实验6 子程序程序设计4.1.1实验目的掌握子程序设计及参数传递的方法。
学会使用子程序优化程序结构,提高代码效率。
4.1.2实验设备PC机一台。
4.1.3实验内容⑴编写计算平方子程序,用子程序计算0~15的平方。
要求:计算平方子程序采用查表法,子程序返回0~15的平方。
⑵编写计算N!子程序,用子程序计算0~7!。
要求:计算阶乘子程序采用查表法,子程序返回0~7!,阶乘用BCD码表示。
⑶编写N字节累加和子程序,计算30H~33H 4个字节的累加和,结果保存到40H、41H单元。
4.1.4实验参考程序⑴计算0~15的平方程序;Exp6_1:调用子程序计算0~15的平方;ORG 0000Hmov A,#5 ;入口参数赋值push DPL ;保护DPTRpush DPHlcall SQR ;调用子程序pop DPH ;恢复DPTRpop DPLsjmp $;子程序名:SQR;功能:查表计算0~15的平方;入口参数:A;出口参数:A 平方值;占用资源:A,DPTRSQR: mov DPTR,#TBLSQRmovc A,@A+DPTRretTBLSQR: DB 0,1,4,9,16,25,36,49,64,81,100DB 11*11,12*12,13*13,14*14,15*15END⑵计算0~7!的阶乘;Exp6_2:调用子程序计算0~7!的阶乘;阶乘用BCD码表示;结果存入31H 30HORG 0000Hmov R0,#5 ;入口参数赋值push DPL ;保护DPTRpush DPHpush ACC ;保护ACClcall FAC ;调用子程序pop ACC ;恢复ACCpop DPH ;恢复DPTRpop DPLmov 30H,R1mov 31H,R2sjmp $;子程序名:FAC;功能:查表计算0~7!的阶乘;入口参数:R0:待求值;出口参数:R2R1 R2:高位 R1:低位;占用资源:A,DPTRFAC: mov A,R0add A,R0 ;2字节表,R0*2mov R2,A ;保存到R2,为查表第2字节准备mov DPTR,#TBLFACmovc A,@A+DPTRxch A,R2inc Amovc A,@A+DPTRmov R1,AretTBLFAC:DB 00H,01H,00H,01H,00H,02H,00H,06H;0!,1!,2!,3! DB 00H,24H,01H,20H,07H,20H,50H,40H;4!,5!,6!,7! END⑶计算N字节累加和;Exp6_3:调用子程序计算N字节累加和;结果存入41H 40HORG 0000Hmov R0,#30H ;入口参数赋值mov R7,#4push PSW ;保护PSWpush ACC ;保护ACClcall SUM ;调用子程序pop ACC ;恢复ACCpop PSW ;恢复PSWmov 40H,R1mov 41H,R2sjmp $;子程序名:SUM;功能:计算N字节累加和;入口参数:R0:数据区首地址 R7:数据区字节数;出口参数:R2R1 R2:高位 R1:低位;占用资源:A,PSWSUM: clr Aclr Cmov R1,Amov R2,ALoop: mov A,@R0addc A,R1mov R1,Ainc R0jnc Nextinc R2Next: djnz R7,LoopretEND4.1.5思考题⑴如果不用查表法,计算平方子程序该如何写?⑵子程序嵌套的深度与哪些因素有关?⑶试编写一个把数字00H~09H,0AH~0FH转换为ASCII码的子程序。
实验四子程序设计实验
实验四:子程序设计实验专业班级姓名:学号:联系方式一、任务要求:1. 调试程序dmove.asm,观察片外数据区7000H、A000H开始的单元内容变化规律。
修改程序将7010H-7073H单元内容传送至B000H开始的存储区中。
2. 设计一个子程序,统计片外数据区从2000H开始的256个符号数中偶数的个数,低位存入R3,高位存入R2。
3.(选作题)设计子程序,实现对片外数据存储器的测试。
具体要求如下:1)测试方法自选2)数据存储区首地址、长度可变。
3)可统计坏单元数目,并记录坏单元地址。
4)利用LED指示灯,提示测试过程和结果状态。
二、设计思路实验一:1.用MOVX @DPTR, A 指令,向片外数据区7000H到70FFH单元内容送值。
2.用同样的指令,将7010H-7073H单元内容传送至B000H开始的存储区中。
实验二:1.将要检验的地址区域内容逐个取出,进行奇偶判断2.是偶数则统计加一,之后对下一位进行判断3.不是则对下一位进行判断4.结束后返回实验三:1.先将监测区域内赋值2.赋值完成后通过改变区域内的内容,再进行检测3.若两次的内容不相同,则统计数加一并记录地址4用P1,P2,P3口的状态来表示LED指示灯的工作状态三、资源分配实验一:1.起始地址为0090H2.向片外数据区7000H、A000H开始的单元赋值。
3.将7010H-7073H单元内容传送至B000H开始的存储区中。
实验二:1. 起始地址1000H2. 统计片外数据区从2000H开始的256个符号数中偶数的个数,低位存入R3,高位存入R2。
实验三:(选作题)1.起始地址2000H2.向7000H开始的片外RAM空间送监测数3.错误数目放在R2中4.错误地址放在片内IDA TE中四、流程图2.五、源代码(含文件头说明、资源使用说明、语句行注释)试验一代码:;File name: dmove.asm;Date:;Designed by:;Description: 数据块传送;Resource used: R0: 计数器; DPTR: 片外数据指针; R2, R3 源地址; R4, R5 目的地址; R6, R7 传送字节数ORG 0090HSTART: ;初始化7000H开始的片外RAM空间MOV R0, #00H ;设循环计数器MOV DPTR, #7000H ;设数据指针MOV R1, #00HLOOP1:MOV A, R1MOVX @DPTR, A ;传送到片外RAMINC DPTR ;修改数据指针INC R0 ;修改循环计数器INC R1CJNE R0, #00H, LOOP1 ;判断是否结束;给R2,R3,R4,R5,R6,R7赋初值MOV R2, #70HMOV R3, #10HMOV R6, #01HMOV R7, #00HMOV R4, #0b0HMOV R5, #00H;数据串传送DMVE: MOV SP, #70H ;设栈底MOV DPL, R3MOV DPH, R2MOVX A, @DPTR ;取一个字节MOV DPL, R5MOV DPH, R4MOVX @DPTR, A ;传送一个字节CJNE R3, #73H, DMVE1SJMP LP ;源地址加1 DMVE1: INC R3CJNE R5, #0FFH, DMVE2INC R4 ;目的地址加1 DMVE2: INC R5CJNE R7, #00H, DMVE3CJNE R6, #00H, DMVE4 ;数据传送结束?SJMP $ ;原地踏步DMVE3: DEC R7 ;字节数减1SJMP DMVEDMVE4: DEC R7DEC R6SJMP DMVELP : SJMP LPEND实验二代码:ORG 1000HMOV R2, #00H ;统计数目高位MOV R3, #00H ;低位MOV R1, #00H ;定义判定区间长度MOV DPTR,#2000H ;预先定义ALLER : MOVX A,@DPTR ;将目的地址中的内容送到A累加器中ANL A,#01H ;与1进行与运算CJNE A,#01H,COUNTN ;判定是否为偶数,是则跳至COUNTNINC DPTR ;指向下一地址SJMP GOCOUNTN: CJNE R3,#0FFH,COUNT1 ;判断低位是否将要溢出INC R2 ;高位进一MOV R3,#00HINC DPTRSJMP GOCOUNT1 : INC R3 ;低位加一INC DPTRSJMP GOGO: INC R1CJNE R1,#00H,ALLER;判定循环是否结束SJMP LPLP : SJMP LPEND实验三代码:ORG 2000HMOV P0,#00H ;显示送数与检测功能MOV P1,#00H ;显示程序执行结束MOV P2,#00H ;显示警告功能MOV P3,#00HSTART: ;初始化7000H开始的片外RAM空间MOV P0, #0FH ;LED显示开始送数MOV R0, #00H ;设循环计数器MOV R1, #10H ;坏地址MOV R2, #00H ;坏地址个数MOV DPTR,#7000H ;设数据指针ORGINAL DATA 7000H ;定义数据存放初始地址TEST DATA 00H ;定义判定值TEST的大小LOOP1:MOV A, #TEST ;MOVX @DPTR, A ;传送到片外RAMINC DPTR ;修改数据指针INC R0 ;修改循环计数器CJNE R0, #00H, LOOP1 ;判断是否结束MOV P0,#0FFH ;LED显示检错状态MOV DPTR,#ORGINAL ;返回数据区首地址CHECK: MOVX A,@DPTR ;将数据送入A累加器中CJNE A,#TEST,WARN ;与指定内容比较,不相同则出错SJMP GOGO : INC DPTRINC R0CJNE R0, #00H, CHECK;判断循环是否结束SJMP LPWARN : MOV P2,#0FFH ;LED显示出错状态INC R2 ;记录出错数目MOV A,DPHMOV @R1,AINC R1MOV A,DPLMOV @R1,A ;记录出错地址并存于R1中INC R1INC R1 ;留出间隔SJMP GOLP : MOV P0,#00HMOV P1,#0FFH ;LED显示程序结束状态SJMP LPEND注释:通过改变TEST 的数值来决定输送的检测数(可为任意数)再用手动改变区域的值来完成检验六、程序测试方法与结果、软件性能分析实验一:1. 片外数据区7000H、A000H开始的单元内容变化规律2. 7010H-7073H单元内容传送至B000H开始的存储区实验二:1. 向检测区送偶数2.检测结果(显示为十六进制)实验三:1. 向检测区送检测值以及LED状态送书完毕2. 篡改检测区内容3. 检测结果:(1)坏区数目R2(2)坏区地址(3)LED报警状态七、心得与体会这次实验通过传送数据的具体程序实验,进一步加深了对数据传送的基本步骤和思路的理解,在选作实验中也进一步对I/O的数据处理有了了解,在实验设计中对子程序和重复步骤的运用是相当重要的,对数据区的数据移动和传送也是要重点了解的。
子程序设计实验报告
子程序设计实验报告子程序设计实验报告引言:子程序是计算机程序中的一个重要组成部分,它能够将一个大的任务分解成若干个小的子任务,使得程序结构更加清晰,并且提高了代码的可复用性和可维护性。
本次实验旨在通过设计和实现一些子程序,来加深对子程序设计的理解和应用。
一、实验目的本次实验的主要目的是掌握子程序的基本概念和设计方法,并通过实际编程实现一些常见的子程序功能。
具体目标如下:1. 理解子程序的定义和调用过程;2. 掌握参数传递和返回值的方法;3. 设计和实现一些常见的子程序功能。
二、实验环境本次实验使用的是C语言编程环境,具体使用的是GCC编译器。
三、实验内容1. 子程序的定义和调用子程序是一个独立的代码块,可以在程序中被多次调用。
在C语言中,子程序的定义使用函数的方式进行,通过函数名来调用子程序。
在定义子程序时,需要指定子程序的返回类型、参数类型和参数个数。
在调用子程序时,需要提供相应的参数。
2. 参数传递和返回值在子程序的调用过程中,参数的传递是一个重要的问题。
参数可以通过值传递、引用传递或指针传递的方式进行。
在值传递中,实参的值会被复制到形参中;在引用传递中,实参的地址会被传递给形参;在指针传递中,实参的指针会被传递给形参。
返回值可以通过return语句来实现,返回值的类型需要与子程序的返回类型相匹配。
3. 子程序的设计和实现根据实际需求,设计和实现一些常见的子程序功能,例如求两个数的最大公约数、判断一个数是否为素数等。
在设计子程序时,需要考虑输入参数的合法性和边界条件,以及返回值的正确性。
四、实验步骤1. 确定子程序的功能和输入输出要求;2. 设计子程序的算法和流程;3. 编写子程序的代码,并进行调试和测试;4. 在主程序中调用子程序,并验证其正确性;5. 对实验结果进行分析和总结。
五、实验结果与分析通过实验,我们成功设计和实现了一些常见的子程序功能,例如求两个数的最大公约数和判断一个数是否为素数。
子程序设计实验报告
子程序设计实验报告子程序设计实验报告一、实验目的本实验旨在通过实践学习子程序设计的基本原理和方法,并掌握在程序中编写和调用子程序的技巧。
二、实验环境及工具1-操作系统:Windows 102-集成开发环境(IDE):Visual Studio Code3-编程语言:C++三、实验内容1-子程序的定义和调用2-子程序的参数传递方式3-子程序的返回值4-子程序的递归调用5-子程序的调试技巧四、实验步骤1-子程序的定义a-定义子程序的语法格式b-编写一个简单的子程序示例2-子程序的调用a-了解调用子程序的方式b-调用之前的准备工作c-编写一个完整的程序,调用已定义的子程序3-子程序的参数传递方式a-值传递b-引用传递c-指针传递d-编写不同参数传递方式的子程序示例4-子程序的返回值a-子程序的返回值类型和语法格式b-编写一个子程序,并返回一个值5-子程序的递归调用a-了解递归调用的概念和优点b-编写递归调用的子程序6-子程序的调试技巧a-使用调试工具进行单步跟踪b-设置断点c-使用调试输出语句辅助调试五、实验结果与分析1-对每个实验步骤进行实验,并记录实验结果2-分析实验结果,总结子程序设计的特点和应用场景六、实验总结通过本次实验,我对子程序设计有了更深入的了解,并掌握了基本的子程序编写和调用技巧。
子程序设计在程序开发中起到了重要的作用,在提高代码的模块化和可重用性方面具有显著优势。
七、附件本文档无附件。
八、法律名词及注释1-子程序:也称为函数或方法,是封装了一段代码的独立执行单元,可以接受输入参数并返回一个值。
2-调试:在程序开发过程中,通过排除错误和异常情况,使程序正常运行的过程。
实验四子程序设计
实验四子程序设计实验目的:通过编写子程序来实现函数的封装和代码的重用。
实验原理:子程序是一段具有特定功能的代码,可以在程序中多次调用。
在实际的软件开发过程中,为了提高代码的可读性、可维护性和代码的重用,我们经常使用子程序。
子程序的定义一般包括以下几个要素:1.子程序名称:子程序的名称用于被调用和调用。
子程序名称一般要具有描述性,能够清晰地表达其功能和作用。
2.输入参数:子程序可以接收输入参数,用于在子程序内部进行计算和处理。
输入参数可以是实际的数值,也可以是变量、数组等。
3.输出参数:子程序可以具有输出参数,用于将计算结果或者处理结果返回到主程序中。
输出参数可以是实际的数值,也能是变量、数组等。
4.子程序体:子程序体是子程序内部的代码块,用于实现具体的功能。
子程序体可以包含多条语句和控制结构,以完成复杂的操作和计算。
实验步骤:本次实验我们将编写一个求取三角形面积的子程序,实现代码的封装和重用。
1.编写主程序:首先,我们先编写一个主程序,用来调用子程序并输出计算结果。
```pythondef main(:a = float(input("请输入三角形的底边长: "))h = float(input("请输入三角形的高: "))area = triangle_area(a, h)print("三角形的面积为: ", area)def triangle_area(base, height):area = (base * height) / 2return areaif __name__ == "__main__":main```2. 编写子程序: 根据主程序中调用的子程序名称,我们可以编写一个名为`triangle_area`的子程序来计算三角形的面积。
```pythondef triangle_area(base, height):area = (base * height) / 2return area```3.运行程序:运行主程序,输入三角形的底边长和高,程序将输出计算结果。
实验3(子程序设计)
SI,CX赋初值
取第一个数 存于BH、BL
INC SI 取数存于AL
是
BH:存放较大值 BL:存放较小值 AL:当前值 比较分以下三种情况: AL比BL小 AL比BH大 AL在BL、BH之间
AL<BL 否 否 AL>BH 是 BH←AL DEC CX 否 CX=0? 是 结束
BL←AL
(3)编程要点
Hale Waihona Puke 3、编程提示(1)数据要求
可在数据段内定义;也可从键盘接收任意字符。
(2)子程序设计
①子程序定义格式
子程序名 PROC … RET ;子程序返回 NEAR或FAR;NEAR可省略
子程序名 ENDP ②子程序调用 CALL 子程序名
3、编程提示
开始
(3)编程要点(重点)
• 如何找最大、最小数?
( 子程序流程图如右图所示)
找到后,如何显示?
•考虑以下情况:
①一位十进制,如0~9如何显示?(必须完成) (常用DOS功能调用中的2号功能调用,注意数字与ASCII值对应关系。) ②两位十六进制,如3EH,80H,12H…如何在屏幕上显示?(建议试做) (分高低位显示,请参考实验指导书P76。)
4.注意事项
(1)段内调用时,子程序所处的位置。
子程序设计2实验报告中必须有程序流程图3实验报告中必须有对程序调试的小结4实验报告中必须有源程序清单及注释
1、实验项目
设有10个无符号数的字节序列,利用子程序的方法编写 程序,找出其中的最大、最小值,并在屏幕上显示。
2、实验目的
(1)掌握子程序设计的基本方法,包括子程序的定义、 调用和返回。 (2)巩固常用DOS功能调用。
(2)数据变量定义格式。
实验8_子程序设计
mov bx,[bp+4] xor ax,ax adn: add al,[bx] adc ah,0 inc bx loop adn mov [bx],ax ret 4 sum endp proce ends end star 2. 下列程序实现了子程序递归调用求阶乘。请汇编并调试程序,学习程序的设计方法 和堆栈的变化过程。 程序: stack segment stack db 100h dup(?) stack ends data segment resuldw ? data ends code segment mainproc far assume cs:code,ds:data,ss:stack start:push ds sub ax,ax push ax mov ax,data mov ds,ax mov ax,5 call fact mov resul,ax ret fact proc and al,al jne iia mov al,1 ret iia: push ax dec al call fact x2: pop cx mul cl ret fact endp
实验八 子程序设计
8.1 实验目的
(1)掌握子程序设计方法,合理划分层次 (2)掌握子程序的调用与返回的方法 (3)掌握子程序间传递参数的方法。 (4)了解子程序的嵌套与递归
8.2 预备知识
8.2.1 基本概念
子程序也称为过程,使用子程序可以缩短源程序的长度、节省目标程序的存储空间,也 可以提高程序的可维护性和共享性。汇编语言的子程序相当于高级语言中的过程和函数。在 同一个程序中经常出现的功能和结构形式相同,但变量的赋值不同的程序段可以定义为子程 序。有些程序对于某个用户可能只用到一次,但是对于用户来说经常用到(如二进制到十进 制的转换),这些常用的特定功能的程序段也可以定义为子程序的形式。
实验报告 子程序设计实验
实验报告子程序设计实验实验报告:子程序设计实验一、实验目的本次实验的主要目的是深入理解和掌握子程序设计的概念、原理和方法,通过实际编程实现,提高我们的编程能力和问题解决能力。
二、实验环境本次实验使用的编程语言为 Python,开发工具为 PyCharm。
操作系统为 Windows 10。
三、实验内容(一)简单函数的定义与调用首先,我们定义了一个简单的函数来计算两个数的和。
```pythondef add_numbers(a, b):return a + b```然后,通过调用这个函数来计算并输出结果。
```pythonresult = add_numbers(5, 3)print("两数之和为:", result)```(二)带参数的函数接下来,定义了一个函数可以根据给定的半径计算圆的面积。
```pythonimport mathdef calculate_area(radius):return mathpi radius 2```调用该函数计算半径为 4 的圆的面积并输出。
```pythonarea = calculate_area(4)print("半径为 4 的圆的面积为:", area)```(三)函数的返回值定义了一个函数,判断一个数是否为偶数。
```pythondef is_even(number):if number % 2 == 0:return Trueelse:return False```调用该函数对多个数进行判断并输出结果。
(四)函数的嵌套调用定义了两个函数,一个函数计算两个数的平均值,另一个函数判断一个数是否大于平均值。
```pythondef calculate_average(a, b):return (a + b) / 2def is_greater_than_average(number, a, b):average = calculate_average(a, b)if number > average:return Trueelse:return False```通过调用这两个函数进行相应的计算和判断。
实验 子程序设计
实验子程序设计-十六进制数显示实验目的:1.掌握CALL指令的使用方法。
2.掌握子程序的定义。
3.掌握主程序与子程序之间的调用关系及其调用方法。
实验内容:使用子程序调用实现:从键盘输入十进制数,然后按十六进制显示。
实验准备1.预习子程序定义的方法。
2.根据实验内容,选择合适的主程序与子程序参数传递的方法。
3.给出完整的子程序的描述(入口参数、出口参数、功能),子程序的流程图及代码。
4.给出完整的源代码:STACK SEGMENT PARA STACK 'STACK'DB 100H DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK ;分配段址START:MOV AX,STACKMOV SS,AX ;给段寄存器DS付值call din ;接收十进制数的子程序call binihex ;转换为十六进制数的子程序call crlf ;屏幕显示信息的子程序MOV AH,4CHINT 21H ;主程序的返回din proc near ;定义键盘接收十进制数子程序push axpush cxpushfmov bx,0newchar: mov ah,1 ;键盘输入int 21hsub al,30hjl exit ; <0退出cmp al,9jg exit ; >9退出cbwxchg ax,bxmov cx,10mul cxxchg ax,bxadd bx,axjmp newcharexit: popfpop cxpop axretdin endpbinihex proc near ;定义转换为十六进制数子程序push axpush cxpush dxpushfmov ch,4rotate: mov cl,4rol bx,clmov al,bland al,0fhadd al,30h ; ’0’~’9’ ASCII 30H~39Hcmp al,3ahjl printitadd al,7h ; ’A’~’F’ ASCII 41H~46H printit: mov dl,almov ah,2int 21hdec chjnz rotatemov dl,'H'mov ah,2int 21hpopfpop dxpop cxpop axretbinihex endpcrlf proc near ;定义屏幕显示子程序push axpush dxpushfmov dl,0dhmov ah,2int 21hmov dl,0ahmov ah,2int 21hpopfpop dxpop axretcrlf ENDPCODE ENDSEND START实验步骤:1.编写源程序2.汇编、连接,产生可执行的文件,若有错误,分析错误的原因,修改,直至程序正确,运行程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四子程序设计实验
一、实验目的
1.学习子程序的定义和调试方法。
2.掌握子程序、子程序的嵌套、递归子程序的结构;
3.掌握子程序的程序设计及调试方法。
二、实验设备
PC 机一台,TD-PITE 实验装置一套。
三、实验内容及步骤
1.求无符号字节序列中的最大值和最小值
设有一字节序列,其存储首地址为3000H,字节数为08H。
利用子程序的方法编程求出该序列中的最大值和最小值。
程序流程图如图4-1所示。
图4-1 程序流程图
实验程序
SSTACK SEGMENT STACK
DW 64 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE
START: MOV AX, 0000H
MOV DS, AX
MOV SI, 3000H ; 数据区首址
MOV CX, 0008H
CALL BRANCH ; 调用子程序
HERE: JMP HERE
BRANCH PROC NEAR
JCXZ A4
PUSH SI
PUSH CX
PUSH BX
MOV BH, [SI]
MOV BL, BH
CLD
A1: LODSB
CMP AL, BH
JBE A2
MOV BH, AL
JMP A3
A2: CMP AL, BL
JAE A3
MOV BL, AL
A3: LOOP A1
MOV AX, BX
POP BX
POP CX
POP SI
A4: RET
BRANCH ENDP
CODE ENDS
END START
实验步骤:
(1)根据程序流程图编写实验程序;
(2)经编译、链接无误后装入系统;
(3)键入E3000命令,输入8个字节的数据,如:D9 07 8B C5 EB 04 9D F9;
(4)运行实验程序;
(5)点击停止按钮,停止程序运行,观察寄存器窗口中AX的值,AX应为F9 04,其中AH中为最大值,AL中为最小值;
(6)反复测试几组数据,检验程序的正确性。
程序说明:该程序使用BH和BL暂存现行的最大值和最小值,开始时初始化成首字节的内容,然后进入循环操作,从字节序列中逐个取出一个字节的内容与BH和BL相比较,若取出的字节内容比BH的内容大或比BL的内容小,则修改之。
当循环操作结束时,将BH送AH,将BL送AL,作为返回值,同时恢复BX原先的内容。
2. 求N!
利用子程序的嵌套和子程序的递归调用,实现N!的运算。
根据阶乘运算法则,可以得:N!=N(N-1)!=N(N-1)(N-2)!=……
0!=1
由此可知,欲求N的阶乘,可以用一递归子程序来实现,每次递归调用时应将调用参数减1,即求(N-1)的阶乘,并且当调用参数为0时应停止递归调用,且有0!=1,最后将每次调用的参数相乘得到最后结果。
因每次递归调用时参数都送入堆栈,当N为0而程序开始返回时,应按嵌套的方式逐层取出相应的调用参数。
定义两个变量N及RESULT,RESULT中存放N!的计算结果,N在00H~08H之间取值。
实验程序
SSTACK SEGMENT STACK
DW 64 DUP(?)
SSTACK ENDS
PUBLIC N, RESULT ;设置全局变量
DA TA SEGMENT
N DB ? ;N的范围在1~8之间
RESULT DW ? ;N!的结果存于该变量中
DA TA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV AX, OFFSET RESULT
PUSH AX
MOV AL, N
MOV AH, 00H
PUSH AX
MOV DI, 0000H
CALL branch
JMP START ;在此处设置断点,观察变量
branch: PUSH BP
MOV BP,SP
PUSH BX
PUSH AX
MOV BX,[BP+DI+06H]
MOV AX,[BP+DI+04H]
CMP AX,0000H
JZ A1
PUSH BX
DEC AX
PUSH AX
CALL branch ;递归调用
MOV BX,[BP+DI+06H]
MOV AX,[BX]
PUSH BX
MOV BX,[BP+DI+04H]
MUL BX
POP BX
JMP A2
A1: MOV AX, 0001H
A2: MOV RESULT, AX
POP AX
POP BX
POP BP
RET 0004H
CODE ENDS
END START
实验步骤
(1)依据设计思想绘制程序流程图,编写实验程序;
(2)经编译、链接无误后装入系统;
(3)将变量N及RESULT加入变量监视窗口,并修改N值,N在00~08H之间取值;(4)在JMP START语句行设置断点,然后运行程序;
(5)当程序遇到断点后停止运行,此时观察变量窗口中RESULT的值是否正确,验证程序的正确性;
(6)改变变量N的值,然后再次运行程序,当程序停止在断点行后观察实验结果。
表4-2 阶乘表。