实验十一 子程序设计

合集下载

子程序设计实验报告1

子程序设计实验报告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`,它们分别用于计算两个整数的和与差。

子程序设计实验报告范文精简处理

子程序设计实验报告范文精简处理

子程序设计实验报告范文精简处理实验报告是对实验目的、流程、结果和结论等内容的详细描述和总结。

以下是一份精简处理的子程序设计实验报告范文,共计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. 实验内容本次实验涉及三个任务,分别是: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`,计算圆形的面积并返回结果。

实验-子程序设计

实验-子程序设计

实验题目:在数据段中定义两个有符号字变量(初始值自 拟),用子程序实现求两个字变量中大的值,并使用堆栈 传入参数,AX寄存器返回结果保存到maxv变量中。
子程序设计注意事项
正确布置程序代码的结构 主程序和子程序可以放在同一代码段,也可以在不同段,甚至放 在不同模块 放在同一代码段结构:
段开头
主程序
CODE SEGMENT 'CODE' ASSUME CS:CODE, DS:DATA,SS:STACK MAIN: …… CALL MAX ; …… MOV AX, 4c00H INT 21H MAX PROC NEAR …… MAX ENDP CODE ENDS END MAIN

放在不同模块(或文件)
CODE1 SEGMENT 'CODE' ASSUME CS:CODE1, DS:DATA,SS:STACK MAIN: …… CALL MAX ; …… MOV AX, 4c00H INT 21H CODE1 ENDS END MAIN;主模块结束标志 CODE2 SEGMENT 'CODE'
子程序
段结尾
放在不同代码段结构:
CODE1 SEGMENT 'CODE' ASSUME CS:CODE1, DS:DATA,SS:STACK MAIN: …… CALL MAX ; …… MOV AX, 4c00H INT 21H CODE1 ENDS CODE2 SEGMENT 'CODE' ASSUME CS:CODE2, DS:DATA,SS:STACK MAX PROC FAR …… MAX ENDP CODE2 ENDS END MAIN;模块结束标志一定要放到最后

宏指令及子程序设计实验

宏指令及子程序设计实验

宏指令及子程序设计实验实验目的本实验旨在通过学习宏指令和子程序的设计,加深对宏指令和子程序的理解,并掌握其在程序设计中的应用。

实验要求1.理解宏指令的概念及作用,并能够熟练使用宏指令编写程序;2.熟悉子程序的概念及调用过程,并能够设计和调用子程序。

实验工具1.汇编语言编辑器;2.汇编语言调试工具;3.计算机实验环境。

实验内容一、宏指令设计与应用宏指令是在汇编语言中为了简化重复性工作而设计的一种指令。

通过宏指令,可以将一段相对独立的代码组织成一个宏过程,每次使用时可以直接调用该宏。

在本实验中,我们将通过以下步骤进行宏指令的设计与应用:1.设计一个宏指令,完成对一个给定的数组进行排序的功能;2.将该宏指令应用于一个具体的程序中,验证其效果。

二、子程序设计与调用子程序是一段相对独立的代码段,可以被主程序调用。

子程序的设计和调用能够提高程序的模块化程度,方便代码的组织和维护。

在本实验中,我们将通过以下步骤进行子程序的设计与调用:1.设计一个子程序,实现对一个给定字符串的逆序输出;2.在主程序中调用该子程序,并验证其功能。

实验步骤一、宏指令设计与应用1.根据给定的数组排序算法,设计一个宏指令,命名为SORT_ARRAY;2.在宏指令中,使用适当的寄存器和数据段定义,实现对给定数组的排序;3.在主程序中使用SORT_ARRAY宏指令,对一个给定的数组进行排序,并将结果输出。

二、子程序设计与调用1.设计一个子程序,命名为REVERSE_STRING,实现对一个给定字符串的逆序输出;2.在子程序中,使用适当的寄存器定义和字符串操作指令,实现对给定字符串的逆序输出;3.在主程序中,调用REVERSE_STRING子程序,并将一个给定的字符串作为参数传入;4.将子程序的输出结果输出。

实验结果分析通过以上的实验操作,我们可以得到下面的结果:1.宏指令设计与应用:通过排序数组的实验,我们可以验证宏指令的设计与应用的效果。

子程序设计实验报告

子程序设计实验报告

子程序设计实验报告子程序设计实验报告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、掌握子程序的设计、编写及调试方法。

3、掌握宏定义及宏调用的方法。

二、实验内容1、已知在内存数据段中GRADE开始单元连续存放着10个学生的成绩,试采用子程序结构编程实现以下功能:(1)找到最高成绩,将其偏移地址存放在内存单元MAX中。

(2)统计不及格的人数,存放在内存单元COUNT中。

(3)计算平均成绩(只取整数部分),并在屏幕上显示。

要求:将以上功能分别写成子程序,数据区定义如下DSEG SEGMENTGRADE DB 76,68,54,80,45,92,63,58,94,85MAX DW ?COUNT DB ?DSEG ENDS源代码:DATAS SEGMENTGRADE DB76,68,54,80,45,92,63,58,94,85MAX DW?COUNT DB?DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSMAIN PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,datasMOV DS,AXCALL MAXGRADECALL BUJIGECALL A VGRADERETMAIN ENDPMAXGRADE PROC FARpush axpush cxpush simov cx,10mov ax,0mov si,axstart_loop:mov ax,word ptr grade[si]cmp ax,word ptr grade[si+1]jge bigmov ax,word ptr grade[si+1]big: inc siloop start_loopmov max,axpop sipop cxpop axretMAXGRADE ENDPBUJIGE PROC FARPUSH SIPUSH CXPUSH AXMOV AX,0MOV COUNT,0MOV CX,10LOOP_START2:MOV AX,WORD PTR GRADE[SI]CMP AX,60JG SMALL2INC COUNTSMALL2:INC SILOOP LOOP_START2POP AXPOP CXPOP SIRETBUJIGE ENDPA VGRADE PROC FARpush dssub ax,axpush axmov ax,DATASmov ds,axmov cx,10 ;循环控制mov bx,0mov dx,0 ;暂存总成绩avg_grade_1:mov al,grade[bx]cbwadd dx,axinc bxloop avg_grade_1mov ax,dxmov bl,10div bl ;除第一次sub ah,ah ;清零div bl ;除第二次push axadd al,30hmov dl,almov ah,02int 21hpop axadd ah,30hmov dl,ahmov ah,02int 21hmov ah,4chint 21hretA VGRADE ENDPCODES ENDSEND2、编写程序实现十进制数的加减运算。

实验十一1讲解

实验十一1讲解

实验十一 内部子程序子程序(也称辅程序)是FORTRAN90提供的重要功能之一,FORTRAN90允许用户自己定义子程序,允许用户使用子程序来设计和编写程序。

在设计和编写一个复杂程序时,要使用科学的程序设计方法,如:结构化程序设计方法、模块化程序设计方法、面向对象程序设计方法等,子程序功能完全支持结构化和模块化程序设计方法,结构化和模块化程序设计方法可通过子程序得到应用。

使用子程序可提高程序的可读性、可理解性、可维护性和可修改性,是编写高质量、高水平、高效率程序的有效手段。

子程序分内部子程序和外部子程序。

内部子程序是包含在程序单元CONTAINS 结构中的子程序,只有定义它们的程序单元才能调用执行它们。

内部子程序包括函数子程序和子例行程序两类,通常将函数子程序简称为函数,子例行程序简称为子程序或过程。

本次实验是学习和掌握内部子程序的一次系统实验活动。

通过本次实验,能够熟练使用内部子程序设计和编写程序,求解比较复杂的实际问题。

一.实验目的1.了解内部子程序的有关基本概念,如:定义、调用、形式参数、实在参数、参数传递关系等。

2.掌握内部子程序定义、调用、形式参数、实在参数、参数传递的基本内容和使用规则3.掌握结构化程序设计方法。

4.掌握使用内部子程序设计和编写程序的方法。

二.实验内容11.问题描述已知二项式公式如下:其中: 为二项式系数,通过下面公式计算:r=0,1,2,…,n计算(X+Y)5的二项展开式系数,并输出。

通过内部函数子程序计算阶乘和二项式系数,编写程序实现之。

2.任务分解分析问题,进行任务分解,得到求解问题的分层结构图,如图11-1所示。

图11-1 任务分解及分层结构图n nn 1n 11n n r r n r n 11n 1n n 0n n Y C Y X C Y X C Y X C X C )Y X (++++++=+---- r n C !r )!r n (!n C r n -=问题:求n 阶的二项式系数 子问题1:计算r n C 子问题2:计算n!根据任务分解图,用户对求解总问题设计和编写主程序,对求解子问题分别设计和编写子程序。

子程序设计实验报告

子程序设计实验报告

子程序设计实验报告子程序设计实验报告引言:子程序是计算机程序中的一个重要组成部分,它能够将一个大的任务分解成若干个小的子任务,使得程序结构更加清晰,并且提高了代码的可复用性和可维护性。

本次实验旨在通过设计和实现一些子程序,来加深对子程序设计的理解和应用。

一、实验目的本次实验的主要目的是掌握子程序的基本概念和设计方法,并通过实际编程实现一些常见的子程序功能。

具体目标如下: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-调试:在程序开发过程中,通过排除错误和异常情况,使程序正常运行的过程。

汇编语言程序 掌握子程序的设计(2023版)

汇编语言程序 掌握子程序的设计(2023版)

汇编语言程序掌握子程序的设计汇编语言程序设计——子程序的设计一、引言汇编语言是一种低级别程序设计语言,与计算机硬件之间的联系非常紧密。

掌握子程序的设计是汇编语言程序设计的重要环节之一,本文档将详细介绍汇编语言程序中子程序的设计方法。

二、子程序的概念⒈子程序的定义子程序是一段独立的代码段,用于完成特定的功能,可以被主程序或其他子程序调用。

⒉子程序的优点⑴提高程序的模块化和可读性⑵重复利用代码,减少代码冗余⑶便于程序的维护和调试三、子程序的设计⒈子程序的设计要素⑴子程序的输入参数⑵子程序的返回值⑶子程序的功能描述⒉子程序的设计步骤⑴确定子程序的功能和输入参数⑵设计子程序的算法⑶编写子程序的代码⑷调试子程序并验证其正确性四、子程序的调用与返回⒈子程序的调用⑴传递参数⑵调用子程序⑶获取返回值⒉子程序的返回⑴返回值的存储⑵返回地质的存储五、子程序的参数传递⒈参数传递的方式⑴寄存器传递参数⑵栈传递参数⑶内存传递参数⒉参数传递的注意事项⑴参数传递的顺序⑵参数传递的大小和类型⑶参数传递的规范六、子程序的返回值⒈返回值的存储方式⑴寄存器存储返回值⑵内存存储返回值⒉返回值的类型⑴整型返回值⑵实型返回值⑶字符串返回值七、附件本文档没有附件。

八、法律名词及注释⒈子程序:在计算机程序中,独立完成特定功能的代码段。

⒉模块化:将程序分成多个独立的模块,每个模块负责完成特定功能。

⒊可读性:指程序的易读程度,便于程序员理解和维护。

⒋代码冗余:程序中重复出现的代码。

⒌算法:解决问题的一系列步骤。

子程序设计报告(1)

子程序设计报告(1)

昆明理工大学信息工程与自动化学院学生实验报告( 2011 —2012 学年第 1 学期)课程名称:汇编语言程序设计开课实验室:445 2011年 11 月 30 日一、实验目的:1、掌握子程序的设计方法。

2、输入并汇编求N!程序。

3、观察并记录运行结构。

二、实验原理及基本线路图:1、子程序设计:子程序:当把一段共享的语句组织成子程序后,一旦需要实现该功能,就由调用程序调用之,当子程序调用结束后再返回到主程序继续执行。

调用程序和子程序有两种结构,一种是调用程序和子程序在同一个代码段中,子程序类型必须是NEAR型的。

另外一种调用程序和子程序在不同的代码段中,要注意的是若一个子程序被段间调用又被段内调用,则其类型必须是FAR型的。

2、N!的阶乘求解算法流程图:三、实验仪器、平台:PC机、WINDOWS XP系统四、实验步骤:1、熟悉子程序设计方法,了解递归实现求N!的算法。

2、正确编写并汇编求N!的程序。

3、执行程序并观察分析结果。

五、实验过程原始记录:1、求N!源程序:STSG SEGMENT STACK 'S'DW 128 DUP(?)STSG ENDSDATA SEGMENTN_VAL DW 3RESULT DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STSG FRAME STRUCSAV_BP DW ?SAV_CS_IP DW 2 DUP(?)N DW ? RESULT_ADDR DW ? FRAME ENDSMAIN PROC FAR MOV AX,DATAMOV DS,AXLEA BX,RESULTPUSH BXPUSH N_VALCALL FAR PTR FACT MOV AX,4C00HINT 21HMAIN ENDPFACT PROC FAR PUSH BPMOV BP,SPPUSH BXPUSH AXMOV BX,[BP].RESULT_ADDR MOV AX,[BP].NCMP AX,0JE DONEPUSH BXDEC AXPUSH AXCALL FAR PTR FACTMOV BX,[BP].RESULT_ADDRMOV AX,[BX]MUL [BP].NJMP SHORT RETURNDONE: MOV AX,1RETURN: MOV [BX],AXPOP AXPOP BXPOP BPRET 4FACT ENDPCODE ENDSEND MAIN2、程序运行截图:(1)、程序初始化,各个寄存器指向自己的段地址。

子程序的设计方法

子程序的设计方法

子程序的设计方法子程序又称为过程,相当于高级语言中的过程和函数。

在一个程序的不同部分,往往要用到“类似”的程序段,即这些程序段的功能和结构形式都相同,只是某些变量赋值不同。

此时就可以把这些程序段写成子程序形式,以便需要时调用它。

一、过程定义伪操作过程名PROC Attribute……过程名ENDP其中,过程名是子程序入口的符号地址,与标号的作用相同。

属性(Attribute)可以是NEAR或FAR。

过程属性的确定原则很简单,即:(1)如果调用程序和过程在同一个代码段中,则使用NEAR属性。

(2)如果调用程序和过程不在同一个代码段中,则使用FAR属性。

二、过程的调用和返回过程的调用和返回由CALL和RET指令完成。

三、过程调用的注意事项1、过程属性要正确选择。

2、由于CALL指令使断点地址入栈,而RET指令使断点地址出栈。

如果子程序不能正确使用堆栈而造成RET指令执行前SP并未指向断点地址,则必然会导致运行出错,因此子程序中对堆栈的使用应该特别小心,以免发生错误。

3、必要时应保存与恢复寄存器。

如果子程序调用之前的某个寄存器内容在子程序调用完后还有用,而子程序恰好会使用该寄存器,这就会破坏该寄存器的原有内容,从而造成程序运行错误。

为避免这种错误的发生,在一进入子程序后,就应该把子程序所需要使用的寄存器的内容保存在堆栈中,而在退出子程序前把寄存器内容恢复原状。

但是,如果通过寄存器在调用程序和子程序之间传送参数的话,则这些寄存器就不一定需要保存,特别是用来向主程序回送结果的寄存器,就更不应该因保存和恢复寄存器而破坏了应该向调用程序传送的信息。

四、调用程序和子程序之间的参数传送调用程序在调用子程序时,经常需要传送一些参数给子程序;子程序运行完后也经常要回送一些信息给调用程序。

这种调用程序和子程序之间的信息传送称为参数传送。

调用程序和子程序之间的参数传送方式有以下几种:1、通过寄存器传送参数这是最常用的一种方式,使用方便,但参数较多时不能使用这种方法,因为寄存器个数有限。

汇编语言实验报告(子程序)

汇编语言实验报告(子程序)

西安财经学院信息学院
《汇编语言程序设计》 实验报告
实验名 子程序结构程序设计 实验室 实验楼403 实验日期 2013/06/09 一、实验目的及要求
1. 学习子程序的编写,主子程序的调用
2. 不同模块间程序的调用和调试
二、实验环境
硬件环境:一台微型计算机; 软件环境:windows 7 链接程序:LINK.EXE
调试环境:DOSBOX 虚拟平台。

三、实验内容
数据段中的
6个字符,“ABCDEF ”,调用子程序将其逐个显示出来。

子程
序的功能是显示一个字符。

四、实验过程
1. 通过编译程序、链接程序分别生成OBJ 和EXE 文件后,直接运行查看结果
如下:
2. 反汇编,查看程序的指令,如下所示:
姓名 学号 10051704 班级 计本1004班 指导教师 张娟
3. 用-d 查看数据段内存放的数据:
4. 单步执行
查看堆栈段的内容:继续单步执行:
五、源程序清单
程序源代码如下:
DATA SEGMENT
MAG DB ‘ABC DEF’
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
MOV DS, AX
MOV SI, 0
MOV CX, 6
LL: MOV DL, MAG[SI]
CALL MADD
INC SI
LOOP LL
MOV AH, 4CH
INT 21H
MADD PROC。

实验报告 子程序设计实验

实验报告 子程序设计实验

实验报告子程序设计实验实验报告:子程序设计实验一、实验目的本次实验的主要目的是深入理解和掌握子程序设计的概念、原理和方法,通过实际编程实现,提高我们的编程能力和问题解决能力。

二、实验环境本次实验使用的编程语言为 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.学习子程序的定义和调试方法。

2.掌握子程序、子程序的嵌套、递归子程序的结构;3.掌握子程序的程序设计及调试方法。

二、实验设备PC 机一台,TD-PITE 实验装置一套。

三、实验内容及步骤1.求无符号字节序列中的最大值和最小值设有一字节序列,其存储首地址为3000H,字节数为08H。

利用子程序的方法编程求出该序列中的最大值和最小值。

程序流程图如图4-1所示。

图4-1 程序流程图实验程序SSTACK SEGMENT STACKDW 64 DUP(?)SSTACK ENDSCODE SEGMENTASSUME CS:CODESTART: MOV AX, 0000HMOV DS, AXMOV SI, 3000H ; 数据区首址MOV CX, 0008HCALL BRANCH ; 调用子程序HERE: JMP HEREBRANCH PROC NEARJCXZ A4PUSH SIPUSH CXPUSH BXMOV BH, [SI]MOV BL, BHCLDA1: LODSBCMP AL, BHJBE A2MOV BH, ALJMP A3A2: CMP AL, BLJAE A3MOV BL, ALA3: LOOP A1MOV AX, BXPOP BXPOP CXPOP SIA4: RETBRANCH ENDPCODE ENDSEND 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的内容小,则修改之。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验十一子程序设计知识提要:1、掌握子程序的定义语句;过程名 PROC [near/far]过程体RET过程名 ENDP其中过程名的命名方法与变量名相同,同一源程序中不能有相同的过程名.PROC为过程定义开始的伪指令,ENDP为过程定义结束伪指令,且PROC-ENDP必须配对使用。

配对的PROC-ENDP 前面的过程名应相同。

NEAR/FAR定义了过程的属性,前者表示所定义的过程只能被相同代码段的程序调用,称为段内调用;而后者所表示的过程只能被不同代码段的程序调用,称为段间远调用。

2.子程序结构形式一个完整的子程序一般应包含下列内容:1.)子程序的说明部分在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法.说明时,应含如下内容:.子程序名:命名时要见名中意..子程序的功能:说明子程序完成的任务;.子程序入口参数:说明子程序运行所需参数及存放位置;.子程序出口参数:说明子程序运行结果的参数及存放位置;.子程序所占用的寄存器和工作单元;.子程序调用示例;2、)掌握子程序的调用与返回在汇编语言中,子程序的调用用CALL,返回用RET指令来完成。

当发生CALL过程调用时,返回地址入栈;而运行RET指令时,则由栈顶取出返回地址。

CALL指令执行分两步走;第一步,保护返回地址,利用堆栈实现,即将返回的地址压入堆栈;第二步,转向子程序,即把子程序的首地址送入IP 或CS :IP 。

RET 指令功能是返回主程序,即把子程序的返回地址送入IP 或CS :IP 。

.段内调用与返回:调用子程序指令与子程序同在一个段内。

因此只修改IP ;.段间调用与返回:调用子程序与子程序分别在不同的段,因此在返回时,需同时修改CS :IP 。

3.)子程序的现场保护与恢复保护现场:在子程序设计时,CPU 内部寄存器内容的保护和恢复,在运行主程序时已经占用了一定数量的寄存器,子程序执行时也要使用寄存器。

子程序执行完返回主程序后,要保证主程序按原来状态执行,这就需要对那些在主程序和子程序中都要使用的寄存器的内容在子程序体执行之前加以保护,这就是保护现场。

恢复现场:子程序执行完后再恢复这些主程序中寄存器的内容,称为恢复现场。

一般利用堆栈实现现场保护和恢复的格式:过程名PROC [NEAR/FAR]PUSH AXPUSH BX..PUSH DX...POP DX...POP AXRET过程名 ENDP4.子程序的参数传递方法1. 寄存器传递参数这种方式是最基本的参数传递方式。

即主程序调用子程序前,将入口参数送到约定的寄存器中。

子程序可以直接从这些寄存器中取出参数进行加工处理,并将结果也放在约定的寄存器中,然后返回主程序,主程序再从寄存器中取出结果。

2.存储器单元传(变量)递参数这种方法是在主程序调用子程序前,将入口参数存放到约定的存储单元中;子程序运行时到约定存储位置读取参数;子程序执行结束后将结果也放在约定存储单元中。

3.用堆栈传递参数利用共享堆栈区,来传递参数是重要的的方法之一。

主程序将子程序的入口参数压入堆栈,子程序从堆栈中依次取出这些参数;经过子程序处理后,子程序将出口参数压入堆栈,返回主程序后再通过出栈获取它们。

一、实验要求和目的1.熟悉汇编语言程序设计结构;2.熟悉汇编语言子程序设计方法;3.熟悉利用汇编语言子程序参数传递方法;二、软硬件环境1.硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存;2.软件环境:装有MASM 5.0、DEBUG、LINK和EDIT等应用程序。

三、实验涉及的主要知识单元在实际应用中,经常根据遇到使用汇编语言子程序来实现,其中还发涉及到参数传递方法。

可以应用寄存器、堆栈、变量来进行,调用子程序的入口参数和调用子程序后的出口参数。

如:编写一程序,将3个8位有符号数中的最大值存入MAX单元中。

分析:编制一个求两个数中最大值的过程,然后对其进行调用;由于程序中的数是符号数,所以,比较后的转移指令应该采用JL或JG。

Data segmentA db 0f1hB db 12hC db 7fhMax db ?Data endsStack segment para ‘stack’Stapn dw 20 dup(?)Top EQU length stapnStack endsCode segmentAssume cs:code ,ds:data,ss:stackMain proc farStart: push dsMov ax,0Push axMov ax,dataMov ds,axMov ax,stackMov ss,axMov sp,topMov ah,aMov al,bCall maxfMov al,cCall maxfMov max,ahRetMain endp;子程序名为MAXF。

功能:求两个数中较大者;入口参数:AH,AL=2个有符号数;出口参数:较大者在AH中,较小者在AL中Maxf proc nearCmp ah,alJg nextXchg ah,alNext:retMaxf endpCode endsEnd start四、实验内容1、实验内容编制一个程序,显示任意两个16进制数的加法或减法表达式及其运算结果。

在减法运算中,如果被减数小于减数,显示“Overflow”的提示信息。

2、部分参考代码DATA SEGMENTCC DB '+'ww db '-'GG DB '='II DB 0DH,0AH,'$'AA DB 5 DUP(?)www dw 0ghh db '0',0dh,0ah,'$'bnm dw 0DATA ENDSSTACK SEGMENTDB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV CX,20CALL RAND ;产生一随机数CALL MCAT ;将随机数转换为16进制表示的ASCII码字符 MOV AX,BXPUSH AXCMP www,0 ;WWW=0?JE A1 ;执行'+'CMP www,1 ;www=1?JE A2 ;执行'-'A1: MOV DL,CC ;显示'+'MOV AH,2INT 21HCALL RAND ;产生另一随机数add bx,0fhCALL MCAT ;将随机数转换为16进制表示的ASCII码字符 MOV DL,GG ;显示'='MOV AH,2INT 21HPOP AXADD AX,BXcmp ax,0jne yjw1lea dx,ghhmov ah,9int 21hjmp qq1yjw1: JMP B1A2: MOV DL,WW ;显示'-'MOV AH,2INT 21Hmov cx,65535mai1: loop mai1CALL RAND1CALL MCATMOV DL,GGMOV AH,2INT 21HPOP AXSbb AX,BXcmp ax,0jne yjw2lea dx,ghhmov ah,9int 21hjmp qq1yjw2: JMP B1B1: MOV BX,AXCALL MCATlea DX,IIMOV AH,9INT 21HQQ1: MOV AH,4CHINT 21HMCAT PROC ;将随机数转换为16进制表示的ASCII码字符子程序push bxPUSH CXPUSH DXCMP BX,9JA S1PUSH AXPUSH BXPUSH CXPUSH DXmov ax,bxmov bl,5div blcmp ah,3jae vb1mov www,1jmp vn1vb1:mov www,0vn1:pop dxpop cxpop bxpop axADD BL,30H MOV AA,BLMOV AA+1,'$' LEA DX,AAMOV AH,9INT 21HJMP s3s1:MOV CL,4PUSH BXSHL BX,CL CMP BH,9 JBE V1SUB BH,9 ADD BH,40H JMP MM1V1:ADD BH,30H MM1:MOV AA,BH POP BXAND BL,0FH PUSH AXPUSH BXPUSH CXPUSH DXmov ax,bx mov bl,5 div blcmp ah,3 jae vb2mov www,1 jmp vn2vb2:mov www,0 vn2:pop dxpop cxpop bxpop axCMP BL,9 JBE TT1ADD BL,40HJMP RR1TT1: ADD BL,30HRR1: MOV AA+1,BLMOV AA+2,'$'LEA DX,AAMOV AH,9INT 21Hs3:POP DXPOP CXPOP BXPOP AXRETMCAT ENDPRAND PROCPUSH CXPUSH DXPUSH AXSTIMOV AH,0 ;读时钟计数器值INT 1AHMOV AX,DX ;清高6位AND AH,3MOV DL,101 ;除101,产生0~100余数 DIV DLMOV BL,AH ;余数存BX,作随机数POP AXPOP DXPOP CXRETRAND ENDPRAND1 PROCPUSH CXPUSH DXPUSH AXSTIMOV AH,0INT 1AHMOV ax,cxAND AH,3MOV DL,101DIV DLMOV BL,AHPOP AXPOP DXPOP CXRETRAND1 ENDPCODE ENDSEND START END START。

相关文档
最新文档