实验3 子程序实验
实验3 循环与子程序汇编语言程序设计实验
六、执行到 5!,r2=1!+2!+3!+4!+5!=153=0x99
汇编程序代码:
4、 选做:利用 1 题中找最大数的方法,对内存中 19、21、4、33、51、16、72、28、39,2 的 10 个数据进行选择法升序排序。
5、 选做:用递归调用方法求 n!,n=6。 一、调试状态
12
二、执行 STRAT,开始给定义的寄存器赋值,然后跳转到 LOOP 子程序执行
分析:寄存器 r5 的值是 0x78,即是:1*2*3*4*5=120 汇编程序代码
9
3、 编写子程序调用程序 p3xxxx3.s,求 1!+2!+3!…+5!;其中子程序完成求 n!任务, 主程序完成求阶乘和的任务。
一、开始调试,执行 STRAT,给寄存器赋值,然后跳转到 LOOp 子程序执行
二、开始执行,r0=r0+1=1+1=2,同时 r3=r0*r1=2*1=2,如下面的图中的寄存器显示
分析:上面的图显示,r0=1,r1=1 三、开始执行 1*2
分析:上面的图显示:r0 自加 1,r0=2,r1=1 四、下面的图显示,r1*r0=r3=1*2=3
五、把 1*2=2 的值赋给 R1,
13
六、r0=2+1=3
七、R1*R0=2*3=6,值送到寄存器 R3 存放,r3=6
八、r0 自加 1 成 4,R0=4,R2=6
3
五、
分析:上面的图显示,寄存器 r0 的值是 0x28,即是 2*16+8=40=19+21 六、
分析:上面的图显示,寄存器 r0 的值是 0x2c, 即是 2*16+12=44=19+21+4 七、
子程序设计实验报告
实验名称:子程序设计实验日期: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 子程序实验
实验三子程序实验一.实验目的1.掌握主程序与子程序之间的调用关系及调用方法;2.掌握子程序调用过程中近程调用与远程调用的区别;3.掌握通过堆栈转送参数的方法。
二.实验内容1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
三.实验要求1.第一个实验程序用子程序的近程调用实现。
由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。
实验过程中可以从堆栈的内容看到两个子程序的返回地址值。
由于是近调用,地址值只包括返回地址的段内偏移量。
在每个子程序的执行中,检查CS值是不变的。
2.第二个程序是利用远调用的方法调用子程序的。
在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。
子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。
3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。
一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。
有关该方法的原理此处不再介绍。
4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。
四.实验环境PC微机DOS操作系统或Windows 操作系统MASM.EXE,LINK.EXE,或宏汇编集成环境五.实验步骤1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)实验一;CONV.ASMDATA SEGMENTBUF DB 0ABH,0CDH,0DEH,01H,02H,03H DB 3AH,4BH,5CH,6FHDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV CX,10LEA BX,BUFAGAIN:MOV AL,[BX]CALL HEXASCINC BXLOOP AGAINMOV AH,4CHINT 21HHEXASC PROC NEARMOV DL,ALPUSH CXMOV CL,4SHR DL,CLPOP CXCALL DISP ;显示高位HEX数MOV DL,ALAND DL,0FHCALL DISPRETHEXASC ENDPDISP PROPCMP DL,9JBE NEXTADD DL,7NEXT:ADD DL,30HMOV AH,2INT 21H ;显示RETDISP ENDPCODE ENDSEND START修改符号再次修改实验二;COUNTER.ASM DATA SEGMENT CHAR DB ‘b’BUF DB 50H,? ,50H DUP(?)DATA ENDSMCODE SEGMENTASSUME CS:MCODE,DS:DATA START:MOV AX,DATAMOV DS,AXLEA DX,BUFMOV AH,0AHINT 21HMOV DL,0AHMOV AH,02INT 21HLEA SI ,BUFMOV CL,[SI+1]MOV CH,0 ;CX中为字符串长度INC SIINC SI ;SI指向串首址TABLEMOV AL,CHARMOV AH,0 ;AX中为待查字符PUSH SIPUSH CXPUSH AX ;参数送堆栈CALL FAR PTR CHECKPOP AX ;统计个数在AL中PUSH AXMOV DL,ALAND DL,0FHCMP DL,9JBE NEXTADD DL,7NEXT:ADD DL,30HMOV AH,2INT 21H ;显示统计个数MOV AH,4CHINT 21HM CODE ENDSSCODE SEGMENTASSUME CS:SCODECHECK PROC FARPUSH BPMOV BP,SPMOV SI,[BP+10]MOV CX,[BP+8]MOV AX,[BP+6]XOR AH,AHAGAIN:CMP AL,[SI]JNE NEXT1INC AHNEXT1:INC SILOOP AGAINMOV AL,AHMOV [BP+10],AXPOP BPRET 4CHECK ENDPEND START修改符号后2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。
单片机实验3 拆字、拼字子程序设计
单片机实验3 拆字、拼字子程序设计拆字和拼字是人类阅读、语言学习和表达中的基本技能。
在这个实验中,我们将设计一个单片机程序,通过拆字和拼字的子程序来练习和提高汉字的识别和组词能力。
一、实验目的1. 加深对单片机中汇编语言的理解和掌握。
2. 熟悉单片机的输入、输出、延时等基本指令。
3. 实现汉字的拆字和拼字的子程序,提高汉字识别和组词能力。
二、实验器材1. 单片机开发板(AT89C52)2. 八位数码管3. 九键键盘4. 连接线5. 电脑、Keil C51集成开发环境三、实验内容A.数码管显示编写一个数码管驱动程序,通过按键输入一个数字,将其显示在数码管上。
数码管由8个LED组成,每个LED对应一个二进制位。
因此,我们需要将输入的数字转换为二进制数,并控制相应的LED显示。
B.拆字子程序编写一个拆字子程序,将输入的汉字拆成单个的汉字拼音。
汉字的拼音有一个对应的二进制编码,可参考GB2312中的表格。
在程序中,我们需要首先读取键盘输入的汉字,然后将汉字转换为相应的二进制代码,并将其存储在单片机中。
接着,我们需要将二进制代码分解成单个的拼音,并依次显示在数码管上。
四、程序设计在程序中,我们首先需要定义数码管所对应的输出端口和数码管的位数。
```;定义IO端口和数码管位数MOV P0,#0MOV P2,#0x01MOV DPTR,#TABLEMOVX A,DPTRMOV P2,#0x00MOV R0,#0x00MOV R1,#0x01MOV R2,#0x00MOV R3,#0x00MOV R4,#0x00MOV R5,#0x00MOV R6,#0x00MOV R7,#0x00```在键盘输入数字后,我们需要将其转换为二进制数,并存储在单片机的寄存器中。
对于一个单独的数字,我们可以用以下程序将其转换为二进制码:```;循环显示DISPLAY:MOV P0,#0xFFCLR CJNB R0,SKIP1MOV P0,#0xFESKIP1:RRC AJNB R1,SKIP2MOV P0,#0xFDSKIP2:RRC AJNB R2,SKIP3MOV P0,#0xFBSKIP3:RRC AJNB R3,SKIP4MOV P0,#0xF7SKIP4:RRC ADJNZ R5,DISPLAY```在将汉字转换为二进制编码之后,我们需要编写一个循环程序来分解二进制编码,并将每个拼音对应的二进制代码显示在数码管上。
子程序设计实验报告范文精简处理
子程序设计实验报告范文精简处理实验报告是对实验目的、流程、结果和结论等内容的详细描述和总结。
以下是一份精简处理的子程序设计实验报告范文,共计1245字。
#实验报告名称:子程序设计实验##一、实验目的1.熟悉子程序的定义和使用方法;2.掌握子程序设计的基本思路和技巧;3.实践并提高对程序模块化设计的理解和能力。
##二、实验设备和材料-计算机-C语言编程环境##三、实验方法与流程1.根据实验要求,在C语言编程环境中编写一个独立的子程序;2.使用该子程序计算并输出指定的结果;3.程序编写完成后,编译并运行该程序,观察结果是否符合要求。
##四、实验内容1. 设计一个名为`sum`的子程序,接受一个整型数组和数组长度作为参数,计算数组元素之和,并返回该和;2.编写主程序,使用该子程序求解一个整型数组的元素之和;3.输出求和结果,观察是否正确。
##五、实验结果与分析实验中,我们使用了一组测试数据进行验证。
首先,定义一个整型数组`arr`,其中包含5个元素:{1, 2, 3, 4, 5}。
然后,将该数组和数组长度传递给`sum`子程序进行求和操作。
经过运行,我们得到的结果是15,与我们预期的结果一致。
因此,可以判断子程序设计正确,并成功实现了数组元素之和的计算功能。
##六、实验总结通过本次实验,我们成功设计并实现了一个独立的子程序,在主程序中调用该子程序计算了一个整型数组的元素之和。
通过此次实验,我们进一步熟悉了子程序的定义和使用方法,掌握了子程序设计的基本思路和技巧,并提高了对程序模块化设计的理解和能力。
这对于今后的软件开发和编程工作具有重要意义。
##七、实验心得本次实验让我更加深入地理解了子程序设计的重要性和作用。
通过将功能模块化,我们可以方便地组织和管理程序代码,提高代码的复用性和可维护性。
在实际的软件开发中,子程序设计及其正确使用是非常关键的,能够大大提高开发效率和代码的可靠性。
因此,我会继续学习和掌握更多的子程序设计技巧,并应用于未来的编程工作中。
实验三流水灯实验(io口和定时器实验)
实验三流水灯实验(I/O口和定时器实验)一、实验目的1.学会单片机I/O口的使用方法和定时器的使用方法;2.掌握延时子程序的编程方法、内部中断服务子程序的编程方法;3.学会使用I/O口控制LED灯的应用程序设计。
二、实验内容1.控制单片机P1口输出,使LED1~LED8右循环轮流点亮(即右流水),间隔时间为100毫秒。
2.控制单片机P1口输出,使LED1~LED8左循环轮流点亮(即左流水),间隔时间为100毫秒。
3.使用K1开关控制上面LED灯的两种循环状态交替进行;4. 用定时器使P1口输出周期为100ms的方波,使LED闪烁。
5.使用定时器定时,使LED灯的两种循环状态自动交替,每一种状态持续1.6秒钟(选作)。
三、实验方法和步骤1.硬件电路设计使用实验仪上的E1、E5和E7模块电路,把E1区的JP1(单片机的P1口)和E5区的8针接口L1~L8(LED的驱动芯片74HC245的输入端)连接起来,P1口就可以控制LED 灯了。
当P1口上输出低电平“0”时,LED灯亮,反之,LED灯灭。
E7区的K1开关可以接单片机P3.0口,用P3.0口读取K1开关的控制信号,根据K1开关的状态(置“1”还是置“0”),来决定LED进行左流水还是右流水。
综上,画出实验电路原理图。
2.程序设计实验1和实验2程序流程图如图3-1实验3程序流程图如图3-2所示。
图3-1 实验1,2程序流程图图3-2 实验3程序流程图实验4程序流程图如图3-3,3-4所示。
实验5程序流程图如图3-5,3-6所示。
图3-5 实验5主程序流程图图3-6 定时器中断服务子程序流程图图3-4 定时器中断服务子程序流程图图3-3 实验4主程序流程图编程要点:(1)Pl,P3口为准双向口,每一位都可独立地定义为输入或输出,在作输入线使用前,必须向锁存器相应位写入“1”,该位才能作为输入。
例如:MOV P1,A; P1口做输出MOV P1,#0FFHMOV A,P1;P1口做输入SETB P3.0MOV C,P3.1;从P3.1口读入数据(2)每个端口对应着一个寄存器,例:P1→90H(P1寄存器地址);P3→B0H(P3寄存器地址);寄存器的每一位对应着一个引脚,例:B0H.0→P3.0(3)对寄存器写入“0”、“1”,对应的外部引脚则输出“低电平”、“高电平”。
子程序设计实验报告
子程序设计实验报告子程序设计实验报告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`,计算圆形的面积并返回结果。
实验三 代码转换程序设计
MOV CH,AL;是则更新CH的值
INPUT
JUDGE
CMP AL,CL
JB K;
MOV CL,AL
JMP LOOP1
EXIT:PRESENT 0DH,0AH
MOV AH,09H
MOV DX,SEG STRING
MOV DS,DX
LEA DX,STRING
INT 21H
CMP CH,'0';判断最小数的符号是否为负(通过负数最高位是否被修改判断)
INT 21H
ILLEGAL PROC;显示不合法字符串
MOV AH,09H
MOV DX,SEG STRING1
MOபைடு நூலகம் DS,DX
LEA DX,STRING1
INT 21H
RET
ILLEGAL ENDP
CODE ENDS
END START
七、程序设计思路与总结
程序分为字符输入模块、字符显示模块、判断合法模块、以及主程序的比较模块。
CMP AL,'-';判断数的符号
JZ NEAR PTR NEGT;负数则转去NEGT处执行
JUDGE;判断数的合法性
CMP AL,BH;输入的值与最小正数的十位相比较
JNA NEXT;当前输入的值有可能比得到的最小数小
K: INPUT;把下一个不符合条件的字符读出
JMP NEAR PTR LOOP1
MOV CL,'0';CL中存放负的最小值的十位
MOV AH,09H
MOV DX,SEG STRING3
MOV DS,DX
LEA DX,STRING3
INT 21H
LOOP1: INPUT
子程序设计实验报告
子程序设计实验报告子程序设计实验报告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. 实验结果和分析经过上述子程序的设计和实现,我们实现了两个数相加、两个数相乘、以及一个数的平方根的计算功能。
计算机基础 raptor实验报告
大学计算机基础实验报告实验名称基于流程图的可视化程序设计指导教师李媛实验日期 2019年10月31日专业自动化类学生姓名钱仪嘉班级/学号 1907/2019010737 成绩实验三Raptor循环结构设计一.实验目的基本掌握Raptor中包含循环结构的算法的设计,并能写出正确流程图。
二.实验内容1. 第一题(1)实验题目:输出1-200之间的所有完全平方数。
(2)算法设计:步骤1:令n=1。
步骤2:如果n*n<=200,则输出n*n。
步骤3:n加1。
步骤4:重复执行第2、3步,直到n*n>200,算法结束。
(3)RAPTOR流程图:(4)程序运行结果:2. 第二题(1)实验题目:判断一个正整数是否是素数,如果是则输出提示信息“Yes”,否则输出“No”。
(2)算法设计:步骤1:输出正整数n。
步骤2:令flag为1。
步骤3:令m为2。
步骤4:如果m*m<=n,则步骤4-1:如果n mod m等于0;则令flag为0。
步骤4-2:m的值增1。
步骤4-3:返回第4步的开头继续执行。
步骤5:如果flag值为0,则n不是素数,输出“No”,否则输出“Yes”(3)RAPTOR流程图:(4)程序运行结果:三.实验体会掌握了Raptor循环结构设计和flag的运用。
实验三RAPTOR子程序设计一.实验目的理解Raptor中子程序的定义和调用。
二.实验内容1. 第一题(1)实验题目:设计一个算法,将华氏温度100-200度转换为对应的摄氏温度值。
(2)算法设计:子程序利用摄氏温度C与华氏温度F的关系:C=(F-32)*5/9实现F和C的转化。
主程序输入F并限制F的范围,输出 C。
(3)RAPTOR流程图:(4)程序运行结果:能基本掌握Raptor中子程序的设计和运用。
子程序设计实验报告
子程序设计实验报告子程序设计实验报告引言:子程序是计算机程序中的一个重要组成部分,它能够将一个大的任务分解成若干个小的子任务,使得程序结构更加清晰,并且提高了代码的可复用性和可维护性。
本次实验旨在通过设计和实现一些子程序,来加深对子程序设计的理解和应用。
一、实验目的本次实验的主要目的是掌握子程序的基本概念和设计方法,并通过实际编程实现一些常见的子程序功能。
具体目标如下:1. 理解子程序的定义和调用过程;2. 掌握参数传递和返回值的方法;3. 设计和实现一些常见的子程序功能。
二、实验环境本次实验使用的是C语言编程环境,具体使用的是GCC编译器。
三、实验内容1. 子程序的定义和调用子程序是一个独立的代码块,可以在程序中被多次调用。
在C语言中,子程序的定义使用函数的方式进行,通过函数名来调用子程序。
在定义子程序时,需要指定子程序的返回类型、参数类型和参数个数。
在调用子程序时,需要提供相应的参数。
2. 参数传递和返回值在子程序的调用过程中,参数的传递是一个重要的问题。
参数可以通过值传递、引用传递或指针传递的方式进行。
在值传递中,实参的值会被复制到形参中;在引用传递中,实参的地址会被传递给形参;在指针传递中,实参的指针会被传递给形参。
返回值可以通过return语句来实现,返回值的类型需要与子程序的返回类型相匹配。
3. 子程序的设计和实现根据实际需求,设计和实现一些常见的子程序功能,例如求两个数的最大公约数、判断一个数是否为素数等。
在设计子程序时,需要考虑输入参数的合法性和边界条件,以及返回值的正确性。
四、实验步骤1. 确定子程序的功能和输入输出要求;2. 设计子程序的算法和流程;3. 编写子程序的代码,并进行调试和测试;4. 在主程序中调用子程序,并验证其正确性;5. 对实验结果进行分析和总结。
五、实验结果与分析通过实验,我们成功设计和实现了一些常见的子程序功能,例如求两个数的最大公约数和判断一个数是否为素数。
汇编(循环、分支、子程序)实验报告
分别为十个成绩、成绩总个数、分段的5个区间申请内存单元,初始化数据段;将AX,BX,CX压栈,保留原始数据。选取第一个成绩,存入AX中,该数据除以10,得到商存入BX,判断商的所属区间,给所属区间加1,继续下一个,循环直到十个全部判断结束,pop出栈,得到属于各区间的成绩个数,程序结束。
2.源程序清单
2.源程序清单
datasegment
xdw 1ah
ydw 0ah
zdw 01h
maxdw ?
dataends ;数据段定义
codesegment
assume ds: data, cs: code
start:
mov ax, data
mov ds, ax ;初始化数据段
mov ax, x
cmp ax, y
《汇编语言程序设计》实验报告
实验名循环、分支、子程序设计实验室实验楼实验日期2014-06-09
一、实验目的及要求
1.熟悉命令格式,功能,加强对指令系统的理解
2.编写简单循环、选择、子程序的结构程序
3.单步跟踪调试,观察寄存器的变化和指令执行的结果
二、实验环境
硬件环境:一台微型计算机
软件环境:windows xp,debug环境,masm
2.源程序清单
datarea segment;定义数据段
buffer db 80 dup(?) ;预申请了以buffer为首地址的内存单元
flag db ?
datarea ends
prognam segment;定义编码段
main proc far
assume cs:prognam,ds:datarea
(5).初始数据段
(6).分别将AX,BX,CX,SI压栈,保留初始数据,
汇编语言程序设计实验报告三(子程序设计实验)
汇编语言程序设计实验报告三(子程序设计实验)汇编语言程序设计实验报告三(子程序设计实验)实验目的掌握主程序与子程序之间的调用关系及其调用方法。
掌握子程序调用过程中近程调用与远程调用的区别。
熟练掌握码型变换的程序。
实验内容从键盘输入二位非压缩BCD数,存入AX寄存器中,编程实现将其转换为二进制数,并在屏幕上显示。
要求码型转换程序用远程子程序编写,字符显示用近程子程序编写。
数据可循环输入,遇‘00’结束。
实验准备预习子程序设计的基本方法,根据实验内容要求编写出实验用程序。
熟悉键盘输入和字符显示的程序段的编制。
实验步骤编辑、汇编源程序,生成可执行文件。
执行程序,检查输入、输出结果,看是否正确。
如不正确,用DEBUG检查,修改源程序,再汇编、运行,直到程序正确为止。
用DEBUG的T命令或P命令跟踪程序的执行,观察在远程和近程调用过程中,堆栈的变化情况。
实验报告要求分析近程调用和远程调用的主要区别。
用DEBUG命令观察执行过程有何不同。
分析实验结果及所遇到的问题的解决方法。
程序流程图开始TRAN程序标准序开始读入十进制数据放AX中AXAXAND0F0FH是00?YBLALN调用转换子程序结束AL左移3位回车、换行BL左移1位于ALAL+BL主程序流程图ALAL+AHRET转换子程序TRAN流程图程序清单STASEGMENTSTACK’STACK’DB100DUP(0)STAENDS GSAGSEGMENTPARA‘CODE’ASSUMECS:CSAG MAINPROCFARSTRAT:PUSHDSSUBAX,AXPUSHAXREV:MOVAH,1INT21HMOVBL,ALINT21HMOVAH,ALMOVAL,BLCMPAX,3030H JEENDTRAN CALLNEARPTRTRAN CALLFARPTRCON MOVAL,0DH CALLFARPTRDISP MOVAL,0AH CALLFARPTRDISP MOVAL,0AH CALLFARPTRDISP JMPREV ENDTRAN:RET MAINENDP TRANPROCNEAR ANDAX,0F0FHMOVBL,ALMOVBL,ALMOVCL,3SHLAL,CLMOVCL,1SHLBL,CLADDAL,BLADDAL,AHRETTRANENDPCSAGENDS CSBGSEGMENTPARA’CODE’ASSUMECS:CSBG CONPROCFARPUSHAXMOVCL,4 SHRAL,CL ADDAL,30H CMPAL,39H JBECON2 ADDAL,7CON2:PUSHAX MOVAL,0DH CALLFARPTRDISP MOVAL,OAH CALLFARPTRDISP POPAX CALLFARPTRDISP POPAX ANDAL,0FHADDAL,30H CMPAL,39H JBECON1ADDAL,7CON1:CALLFARPTRDISP RETCONEDNP DISPPROCFAR PUSHBXMOVBX,0MOVAH,14INT10HPOPBXRETDISPENDPCSBGENDS ENDSTART。
子程序设计实验报告
子程序设计实验报告子程序设计实验报告一、实验目的本实验旨在通过实践学习子程序设计的基本原理和方法,并掌握在程序中编写和调用子程序的技巧。
二、实验环境及工具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-调试:在程序开发过程中,通过排除错误和异常情况,使程序正常运行的过程。
汇编语言实验报告(子程序)
西安财经学院信息学院
《汇编语言程序设计》 实验报告
实验名 子程序结构程序设计 实验室 实验楼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```通过调用这两个函数进行相应的计算和判断。
PLC实验指导书-实验三-变延时循环灯控制实验
实验报告三 变延时循环灯控制实验
一、实验目的:
1、 熟练使用S7-200梯形图编制变延时循环控制实验。
2、 学习子程序的使用方法。
二、实验内容及步骤:
按照以下实验要求编制PLC 控制程序,使用仿真软件和PLC 实验箱分别进行调试实验.
1) 按下开关I0.0按照时序图5-1运行。
2) 按下开关I0.1按照时序图5-2运行
图5-1 按下开关 I0.0 时输出灯的时序状态
图5-2 按下开关 I0.0 时输出灯的时序状态
实验步骤 :
1.按图5-1编制PLC 控制程序,使用仿真软件进行调试。
2. 按图5-1、按图5-2使用子程序编制PLC 控制程序,将其下载到PLC 中,运行并调试程序。
Q0.0
Q0.1
Q0.2
Q0.3
Q0.4
Q0.5
三.实验说明及注意事项
1.在接5V电源时,一定要接好线后,再打开电源,以防电源短路
2.若发生线路松动的现象,需认真观察线路,弄清原理后方可动手接线。
3.不要按下板上的其他实验按钮开关。
四.实验用仪器工具
计算机1台
实验箱 1台
直流电源1台
PC/PPI电缆1根
220~三相电缆1根
5V电源导线2根
螺丝刀1把
五.实验前的准备
复习定时器指令,写预习报告,编写变延时循环控制程序,设计调试方案,。
六.实验报告要求
记录试验结果,并与预习报告比较,思考你能采用几种方法实现程序要求。
实验8汇编实验
.实验八编写子程序(4学时)在本次实验中,我们将编写3个子程序,通过它们来认识几个常见的问题和掌握解决这些问题的方法。
同前面的所有实验一样,这个实验室必须独立完成的,在后面的课程中,将要用到这个实验中编写的3个子程序。
1、显示字符串显示字符串是下现实工作中经常要用到的功能,应该编写一个通用的字程序来实现这个功能。
我们应该提供灵活的调用接口,使调用者可以决定显示的位置(行、列)、内容和颜色。
该子程序描述如下:名称:show_str功能:在指定位置用指定颜色显示一个用0结束的字符串。
参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),(cl)=颜色,ds:si 指向字符串的首地址。
返回:无应用举例:在屏幕的8行3列,用绿色显示data段中的字符串。
assume cs: codedata segmentdb ‘Welcome to masm!’, 0data endscode segmentstart: mov dh, 8mov dl, 3mov cl, 2mov ax, datamov ds, axmov si, 0call show_strmov ax, 4c00hint 21hshow_str: :::code endsend start提示:(1)子程序的入口参数是屏幕上的行号和列号,注意在子程序内部要将它们转化为显存中的地址,首先要分析一下屏幕上的行列位置和显存地址的对应关系;(2)注意保存子程序中用到的相关寄存器;(3)这个子程序的内部处理和显存的结构密切相关,但是向外提供了与显存结构无关的接口。
通过调用这个子程序,进行字符串的显示时可以不必了解显存的结果,为编程提供了方便。
在实验中,注意体会这种设计思想。
. data segmentdb "Welcome to masm!"data endsstack segmentdb "Welcome to masm!"stack endscode segmentstart:mov dh, 8mov dl, 3mov cl, 2mov ax, datamov ds, axmov si, 0mov ax,0B800hmov es,axmov ax, stackmov ss, axmov sp,10hcall show_strmov ax, 4c00hint 21hshow_str:push dxpush cxmov al,160dec dhmul dhmov bx,axadd dx,siadd dl,dladd bl,dlmov cl,[si]mov ch,0jcxz okmov es:[bx],clpop cxmov es:[bx+1],clinc sipop dxjmp short show_strok:pop cxpop dxretcode endsend start2、解决除法溢出的问题前面讲过,div指令可以做除法。
汇编判断三边是否可构成三角形
实验三子程序设计实验一、实验目的1.掌握汇编语言源程序子程序设计方法;2.会使用CV软件工具。
二、实验内容编写子程序:判断三边能否构成三角形;编写主程序:输入三边,调用子程序判断,若能,则输出“Y”,否则输出“N”。
共判断10次。
实验代码如下:.686.model flat,stdcalloption casemap:noneinclude\masm32\include\include\masm32\include\includelib\masm32\lib\.dataszMsg1 db '请输入第一条边长:',0szMsg2 db '请输入第二条边长:',0szMsg3 db '请输入第三条边长:',0szMsgY db 'Y',0szMsgN db 'N',0_insize dword 10szInput dw 20 dup(0) ;将三条边存储于szInput里szmsg db 13,10_size dword 80.codestart:mov si ,10.while si!=0invoke GetStdHandle,STD_OUTPUT_HANDLEmov ebx,eaxinvoke WriteConsole,eax,offset szMsg1,sizeof szMsg1,offset _size,0invoke GetStdHandle,STD_INPUT_HANDLEinvoke ReadConsole,eax,offset szInput,sizeof szInput,offset _insize,0and szInput,000fhinvoke WriteConsole,ebx,offset szMsg2,sizeof szMsg2,offset _size,0invoke GetStdHandle,STD_INPUT_HANDLEinvoke ReadConsole,eax,offset szInput+2,sizeof szInput+2,offset _insize,0and szInput+2,000fhinvoke WriteConsole,ebx,offset szMsg3,sizeof szMsg3,offset _size,0invoke GetStdHandle,STD_INPUT_HANDLEinvoke ReadConsole,eax,offset szInput+4,sizeof szInput+4,offset _insize,0and szInput+4,000fhdec sicall judge.endwinvoke ExitProcess,0judge procagain:mov ax ,szInputmov bx,szInput+2mov cx,szInput+4add ax,bxadd bx,cxadd cx,szInput.if ((ax>szInput+4)&& (bx>szInput)&&(cx>szInput+2))invoke GetStdHandle,STD_OUTPUT_HANDLEinvoke WriteConsole,eax,offset szMsgY,sizeof szMsgY,offset _size,0invoke GetStdHandle,STD_OUTPUT_HANDLEinvoke WriteConsole,eax,offset szmsg,sizeof szmsg,offset _size,0.elseinvoke GetStdHandle,STD_OUTPUT_HANDLEinvoke WriteConsole,eax,offset szMsgN,sizeof szMsgN,offset _size,0invoke GetStdHandle,STD_OUTPUT_HANDLEinvoke WriteConsole,eax,offset szmsg,sizeof szmsg,offset _size,0.endifretjudge endpend start程序运行结果如下:三、实验要求同实验二。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三子程序实验
一.实验目的
1.掌握主程序与子程序之间的调用关系及调用方法;
2.掌握子程序调用过程中近程调用与远程调用的区别;
3.掌握通过堆栈转送参数的方法。
二.实验内容
1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
三.实验要求
1.第一个实验程序用子程序的近程调用实现。
由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。
实验过程中可以从堆栈的内容看到两个子程序的返回地址值。
由于是近调用,地址值只包括返回地址的段内偏移量。
在每个子程序的执行中,检查CS值是不变的。
2.第二个程序是利用远调用的方法调用子程序的。
在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。
子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。
3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。
一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。
有关该方法的原理此处不再介绍。
4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。
四.实验环境
PC微机
DOS操作系统或Windows 操作系统
MASM.EXE,LINK.EXE,或宏汇编集成环境
五.实验步骤
1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)
实验一
;CONV.ASM
DATA SEGMENT
BUF DB 0ABH,0CDH,0DEH,01H,02H,03H DB 3AH,4BH,5CH,6FH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA
MOV DS,AX
MOV CX,10
LEA BX,BUF
AGAIN:MOV AL,[BX]
CALL HEXASC
INC BX
LOOP AGAIN
MOV AH,4CH
INT 21H
HEXASC PROC NEAR
MOV DL,AL
PUSH CX
MOV CL,4
SHR DL,CL
POP CX
CALL DISP ;显示高位HEX数
MOV DL,AL
AND DL,0FH
CALL DISP
RET
HEXASC ENDP
DISP PROP
CMP DL,9
JBE NEXT
ADD DL,7
NEXT:ADD DL,30H
MOV AH,2
INT 21H ;显示
RET
DISP ENDP
CODE ENDS
END START
修改符号
再次修改
实验二
;COUNTER.ASM DATA SEGMENT CHAR DB ‘b’
BUF DB 50H,? ,50H DUP(?)
DATA ENDS
MCODE SEGMENT
ASSUME CS:MCODE,DS:DATA START:MOV AX,DATA
MOV DS,AX
LEA DX,BUF
MOV AH,0AH
INT 21H
MOV DL,0AH
MOV AH,02
INT 21H
LEA SI ,BUF
MOV CL,[SI+1]
MOV CH,0 ;CX中为字符串长度
INC SI
INC SI ;SI指向串首址TABLE
MOV AL,CHAR
MOV AH,0 ;AX中为待查字符
PUSH SI
PUSH CX
PUSH AX ;参数送堆栈
CALL FAR PTR CHECK
POP AX ;统计个数在AL中
PUSH AX
MOV DL,AL
AND DL,0FH
CMP DL,9
JBE NEXT
ADD DL,7
NEXT:ADD DL,30H
MOV AH,2
INT 21H ;显示统计个数
MOV AH,4CH
INT 21H
M CODE ENDS
SCODE SEGMENT
ASSUME CS:SCODE
CHECK PROC FAR
PUSH BP
MOV BP,SP
MOV SI,[BP+10]
MOV CX,[BP+8]
MOV AX,[BP+6]
XOR AH,AH
AGAIN:CMP AL,[SI]
JNE NEXT1
INC AH
NEXT1:INC SI
LOOP AGAIN
MOV AL,AH
MOV [BP+10],AX
POP BP
RET 4
CHECK ENDP
END START
修改符号后
2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。
特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。
3.检查程序执行的结果是否正确。
六.实验报告要求
1.说明用堆栈传送参数的过程及其具体方法。
题一
主程序子程序HEXASC
子程序DISP
题二
主程序 子程序
2.分析实验结果及所遇到问题,并说明解决的方法。
七.思考题
分析远程调用与近程调用的区别,在用DEBUG 有关命令观察时,执行过程有何不同。