实验七子程序设计
实验七 子程序设计[4]
初始化计数[ch=4,bx=0]
0
是 数 [ 数 计 [ 计数 否
[ 0 0 ]
否
]
]
计数 0
是
实验内容-1 实验内容
主 程 序 部 分 代 码 next: lea mov int call call call call jmp dx,mess ah,9 21h decin crlf hexdisp crlf next
实验内容-2 实验内容
编 程 提 示 汉诺塔问题的用递归定义描述如下: 基数: HANOI(1,X,Y,Z)输出显示X1Z; ( , , , ) ; 归纳步骤:HANOI(N, X, Y, Z)( )(N>1) ( )( ) 做以下三步:
执行HANOI(N-1, X, Z, Y) ( ) 显示XNZ 执行HANOI(N-1, Y, X ,Z) ( )
数 据 段
data mess step data segment db ‘Input N please!’,0ah,0dh,‘$‘ db 0ah,0dh, ?, ?, ?,‘$‘ ends ;提示信息 提示信息 ;操作信息 操作信息
主 程 序 部 分 代 码
exit:
lea mov int mov int cmp jle cmp jg mov mov mov mov call …
实验内容-1 实验内容
子 程 序 部 分 代 码
receive:
decin proc near
mov ch,4 mov bx,0 mov ah,1 int 21h cmp al,30h jl exit cmp al,39h jg exit sub al,30h
mov cl,al mov ax,10 mul bx mov bx,ax add bl,cl adc bh,0 dec ch jnz receive ret
实验7--子程序设计实验PPT课件
实验七 子程序设计实验
实验步骤(DOS环境):
1、输入程序经汇编、连接产生EXE文件,进入 DEBUG进行程序调试;
2、用U反汇编命令查看源程序;
3、用E命令输入8个字节的数据;
DATA SEGMENT BUF DB ‘acdfA fdsAd , 234def’ ;共计20个字节 LEN DB ?
DATA ENDS 提示:
令BX(或SI ,DI)指向BUF MOV BX , OFFSET BUF 编写循环程序,把BX所指字符的与A比较,若相同,则BX与 BUF的差值即为所求距离。 CMP [BX],‘A’; 可以不加byte ptr je / jz quit; 退出循环,计算所求距离
A4: RET
BRANCH ENDP
CODES ENDS
END START
.
2
4.4 编写程序,把CHAR1中的小写字母分别转换成大写字 母,并存放在CHAR2中。
data segment
CHAR1 DB ‘abcdef’
CHAR2 DB $-CHAR1 DUP(0) ; 数值表达式$-CHAR1 =6
实验7-1求无符号数中的最大值和最小值。
算法:
BH存放最大值,BL存放最小值 SI指向无符 号数。
若无符号数大于最大值或小于最小值,则 以无符号数替换BH或BL中的数。
JBE A2 ; AL≤BH,转A2
MOV BH,AL ; AL >BH, AL → BH
JMP A3 ; AL大于最大值,不可能小返回;
5、用G↙ 运行程序,在AX寄存器里查看运行结果, AX=F904。
子程序设计实验报告
实验名称:子程序设计实验日期: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`,计算圆形的面积并返回结果。
子程序设计 实验7
一、实验目的1.掌握CALL指令的使用方法。
2.掌握子程序的定义3.掌握主程序与子程序之间的调用关系及其调用方法4.掌握主程序与子程序间参数的传递方法(寄存器、存储器、堆栈)二、实验内容1.将AX中的值以十六进制形式显示。
要求:主程序利用寄存器把AX的值传送给子程序。
在子程序中将AX中的值以十六进制形式显示。
2.编写子程序,完成的功能是将DL中的2位十六进制数转换为对应ASCII码。
说明:入口参数AL=待转换的2位十六进制数出口参数DX=转换后的ASCII码,(高字节对应高位、低字节对应低位)举例:若AL=2AH,则DX=3241H。
0----9转换为30H----39H +30HA---F转换为41H----4FH +30H+7H三、程序流程图1.N子程序 let 2 开始显示提示 1bx < - a xbx 左移 4 位查表 , 形成十六进制数显示十六进制数显示 4 位 了 ?ret 返回主程序Y子程序 let 1 开始键盘输入ESC ? 结束YN其它字符 ?形成十进制数保存 xret 返回主程序NY 主程序开始数据段定义初始化 , x = 0start显示提示 1ax < - xcall let 1call let 22.主程序开始数据段定义初始化数据段,a<-count,si<-0startlet0取x,al<-x,call let2out1Inc si,decaa>0 ?是否结束al<-al+30h dl<-al否子程序开始bl<al,bl<al,rept1al 左移4位,保留低4位al>9 ?al<-al+37h是ch=1 ?否是dl<-al否ch=0 ?ret,返回主程序是四.代码 1.data segment x dw 0mess1 db 0dh,0ah,'input dec = $' mess2 db 0dh,0ah,'out HEX = $' hex db '0123456789ABCDEF' data endsCODE SEGMENT 'CODE'ASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXlet0: mov x,0mov dx,offset mess1mov ah,9int 21hcall let1mov ax,xcall let2jmp let0let1: ;键盘输入数并转换十进制数,入口参数ah,出口参数x mov ah,1int 21hcmp al,27jz out1sub al,30hjl exitcmp al,9jg exitmov ah,0xchg ax,xmov cx,10mul cxxchg ax,xadd x,axjmp let1exit:retlet2: ;显示十六进制数,入口参数ax,出口参数dlmov dx,offset mess2mov bx,axmov ah,9int 21hmov ch,4mov cl,4rept1:rol bx,clmov al,bland ax,000fhmov si,axmov dl,hex[si]mov ah,2int 21hdec chjnz rept1retout1:mov ah,4chint 21hcode endsend start2.data segmentx db 12h,3ah,0b4hcount=$-offset xa db ?data endsCODE SEGMENT 'CODE'ASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXmov a,countmov si,0let0:mov al,x[si]call let2jmp out1let2: ;将dl中的两位十六进制数转化成对应的ASC2码,入口参数:al,出口参数:dxmov ch,2mov cl,4mov bl,alrept1:rol bl,clmov al,bland al,0fhcmp al,9jl let1add al,37h cmp ch,1jz let3mov dh,al dec chjnz rept1let1:add al,30h cmp ch,1 jz let3mov dh,al dec chjnz rept1let3:mov dl,al dec chjnz rept1 retout1:add si,1 dec acmp a,0jnz let0 mov ah,4ch int 21hcode ends end start五.实验结果1.初始状态:调用子程序,ip=0015进栈:利用ax给子程序传值:子程序完毕,ip出栈:ip=0015直接运行时:2.初始状态:调用子程序,ip=0014进栈:3a的ASC2码显示:子程序完毕,ip出栈:ip=0014六、实验总结通过本次实验,进一步认识汇编语言和这个集成开发环境,并对汇编语言的基本语法更加熟悉,了解了CALL指令的使用方法,掌握子程序的定义,主程序与子程序之间的调用关系及其调用方法,主程序与子程序间参数的传递方法.。
子程序设计实验报告
子程序设计实验报告子程序设计实验报告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. 实验结果和分析经过上述子程序的设计和实现,我们实现了两个数相加、两个数相乘、以及一个数的平方根的计算功能。
JAVA语言程序设计实验报告
实验一、安装JDK并熟悉java的运行环境实验二、基本语法练习实验三、面向对象编程实验(4)实验四、异常处理实验实验五、小应用程序实验实验六、图形图像实验实验七、GUI(图形用户接口)实验(4)实验八、多线程实验实验九、输入输出流实验(4)实验十、数据库应用实验(4)实验一、安装JDK并熟悉java的运行环境一、实验目的熟悉JA V A的运行环境及学习简单的编程。
二、预习内容安装工具软件的基本方法。
三、实验设备与环境装有JA V A语言工具软件(Eclipse )的微机若干四、实验内容安装Eclipse及JA V A的核心编译程序J2SDK。
1、打开Eclipse的安装盘安装Eclipse。
2、在相同目录下安装J2SDK。
3、打开Eclipse软件对J2SDK文件进行配置。
4、编写一应用程序,在屏幕上显示“HELLO WORLD”和爱心标志。
Pulic class Hello{public static void main(String args[]){//在屏幕上显示“HELLO WORLD”和爱心标志}}5、编写一小程序实现上述功能:在屏幕上显示“HELLO WORLD”和爱心标志。
实验结果五、注意事项⒈认真填写实验报告⒉遵守实验室各项制度,服从实验指导教师的安排⒊按规定的时间完成实验六、说明本次实验建议学时数2学时七、实验总结与体会实验二、基本语法练习一、实验目的⒈熟悉Java的基本语法⒉编写应用程序接收命令行参数⒊编写应用程序接收用户从键盘的输入⒋掌握字符串与数组的基本方法二、预习内容java编程的基本结构三、实验设备与环境装有JA V A语言工具软件(Eclipse )的微机若干四、实验内容⒈编写一个应用程序求若干个数的平均数,原始数字要求从命令行输入。
应用程序中main方法的参数String类型的数组args能接受用户从命令行键入的参数。
(1)编辑A verage.java。
class A verage{public static void main(String args[ ]){double n,sun=0;for (int l=0;l<args.legth;l++){sum=sum+Double.valueOf(arg[l].doubleV alue();)}n=sum/args.length;System.out.println(“average=”+n);}}命令行参数:12.34 34.45 21212121注意:1)参数的个数可以利用args.length来取得。
实验七子程序设计
实验七:子程序设计一、实验目的:通过运行例题程序,了解并掌握简单子程序的编写以及调用方法。
二、实验基础知识: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指令实现。
第7章子程序设计
程序如下: ; 7-5.asm 堆栈传参。实现两个矩阵的乘法c=a*b data segment a db 1,1,1,1 db 2,2,2,2 db 3,3,3,3 b db 1,1,1 db 2,2,2 db 3,3,3 db 4,4,4 m dw 3 ;A矩阵3行4列 n dw 4 ;B矩阵4行3列 p dw 0 c db 9 dup(?) ;C矩阵3行3列 data ends code segment assume cs:code,ds:data main proc far
;子程序2:查表,显示十六进制 let2: mov dx,offset mess2 ;显示提示2 mov ah,9 int 21h mov bx,x mov ch,4 mov cl,4 rept1: rol bx,cl ;0031→0310→3100→1003→0031 mov al,bl and ax,000fh ;保留最低4位 mov si,ax mov dl,hex[si] ;查表显示高位、低位 mov ah,2 out1: int 21h mov ah,4ch dec ch int 21h jnz rept1 code ends ret end start
7.2 调用和返回
CALL指令和RET指令是机器指令。调 用指令CALL与无条件转移指令JMP一 样,都是对指令指针寄存器IP作修改 后,转移到子程序执行。 有时也需要修改代码段寄存器CS的值, 作跨段调用。因此都有转移地址的寻 址方式问题。
7.2.1 调用指令CALL
格式: CALL 子程序名 功能:转移到指令指定的地址(子程序 名)去执行子程序。CALL指令必须指定 转移的目标地址。执行时,先将断点入 栈保存,再修改IP或修改IP、CS。
;子程序3,将bx中的数显示为十进制数 subr3 proc near mov ax,bx ;bx为传参寄存器 mov cx,0 mov bx,10 let1: ;将ax变为十进制数 mov dx,0 inc cx ;统计余数个数 idiv bx ;除以10,商在AX,余数在DX push dx ;保存余数 cmp ax,0 jnz let1 let2: ;循环显示余数 pop ax add ax,0030h mov dl,al mov ah,2 int 21h loop let2 ret subr3 endp ;将余数弹入ax ;调整为ASCII码
实训七、子程序调用指令基本知识
课题实训七、子程序调用指令基本知识6课时教学要求知识目标能力目标情感目标教材分析重点难点教具与设备教法教授法、演示法、实验法板书设计教学内容复习:循环指令在的具体显现。
跳转指令有哪些?顺控继电器(SCR)指令可以应用在哪些现象中?新课教学:子程序是将程序进行分块。
主程序中使用的指令决定具体子程序的执行状况。
当主程序调用子程序并执行时,子程序执行全部指令直至结束。
然后,系统将控制返回至调用子程序网络中的主程序。
子程序用于为程序分段和分块,使其成为较小的、更易管理的块。
在程序中调试和维护时,可以利用这项优势。
通过使用较小的程序块,对这些区域和整个程序简单地进行调试和排除故障。
只在需要时才调用程序块,可以更有效地使用PLC,因为所有的程序块可能无须执行每次扫描。
子程序是应用程序中的可选组件,只有被主程序、中断程序或者其他子程序调用时,子程序才会执行。
调用子程序时可以带参数也可以不带参数。
1.子程序指令格式及功能类型梯形图指令功能子程序调用子程序调用指令(CALL)将程序控制权交给子程序SBR_N。
调用子程序时可以不带参数。
子程序执行完成后,控制权返回到调用子程序的指令的下一条指令。
带参数子程序调用子程序可以包含要传递的参数。
参数在子程序的局部变量表中定义。
参数必须有变量名(最多23个字符)、变量类型和数据类型。
一个子程序最多可以传递16个参数。
子程序有条件返回指令根据前一个逻辑终止子程序。
子程序无条件返回无系统能为每个子程序自动加入无条件返回指令当有一个子程序被调用时,系统会保存当前的逻辑堆栈,置栈顶值为1,堆栈的其他值为零,把控制交给被调用的子程序。
当子程序完成之后,恢复逻辑堆栈,把控制权交还给调用程序。
因为累加器可在主程序和子程序之间自由传递,所以在子程序调用时,累加器的值既不保存也不恢复。
当子程序在同一个周期内被多次调用时,不能使用上升沿、下降沿、定时器和计数器指令。
在被中断服务程序调用的子程序中不能再出现子程序调用。
实验七 子程序设计
5、利用RET指令退出EXE文件的方法。
二、实验设备及软件:
Masm for Windows集成实验环境2015
三、实验方法(原理、流程图)
实验原理:
在MASM中粘贴代码,调试:
在汇编语言中,子程序的调用用CALL,返回用RET指令来完成。当发生CALL过程调用时,返回地址入栈;而运行RET指令时,则由栈顶取出返回地址。
decal
callfact
x2:popcx
mulcl
ret
factendp
mainendp
codeends
endstart
步骤:
1、将程序输入,汇编并连接成EXE文件。
2、用DEBUG的断点和T命令检查并记录每层递归嵌套过程的堆栈和AL内容。
3、修改源程序,将阶乘数3改为本程序的最大允许值(是多少?),重新汇编连接之。用DEBUG运行并记录RESUL单元内容。
mainprocfar
assumecs:code,ds:data,ss:stack
start:movax,stack
movss,ax
movax,data
movds,ax
movax,5
callfact
movresul,ax
ret
factproc
andal,al
jneiia
moval,1
ret
iia:pushax
count2equ$-ary2
sum2dw?
dataends
mainsegment
assumecs:main,ds:data,ss:stack
startprocfar
movax,stack
微机原理与汇编语言 实验指导
微机原理与汇编语言实验指导书(计算机科学与技术专业本科)福建工程学院计算机与信息科学系计算机软件与理论教研室赵忠孝编2005年9月目 录实验一 学习使用DEBUG主要命令 -----------------------1 实验二 80X86指令系统和寻址方式(一) -----------------6 实验三 80X86指令系统和寻址方式(二) -----------------10 实验四 汇编语言程序格式、上机过程 -------------------14 实验五 分支程序设计 ---------------------------------17 实验六 循环程序程序 ---------------------------------20 实验七 子程序设计 -----------------------------------22 实验八 输入输出程序设计 -----------------------------27实验一 学习使用DEBUG主要命令实验目的:通过实验掌握下列知识:1、DOS命令: DIR,DEL,RENAME,FORMAT,COPY。
2、8088指令: MOV,ADD,ADC,SUB,SBB,DAA,XCHG3、DEBUG命令: A,D,E,F,H,R,T,U。
4、BCD码,ASCII码及用16进制数表示二进制码的方法。
5、8088寄存器: AX,BX,CX,DX,F,IP。
内容及步骤:一、DOS常用命令练习:1、将机房提供的系统盘插入A驱动器中,开机,出现提示符后打入命令FORMAT B:/S。
等屏幕上出现提示后将新盘插入B驱动器并打回车。
PC机即对新盘格式化并将糸统拷入。
2、打命令 COPY A:*。
* B 将糸统盘上全部文件拷到你的盘上。
3、将新盘插到 A驱动器中,用DIR命令查看盘上文件。
4、用命令 COPY DEBUG。
COM BUG 复制一个文件。
5、用命令 RENAME BUG BG 将BUG 文件改为BG。
汇编实验七子程序设计
无
教师对报告的最终评价及处理意见:
教师签字:
年月日
源代码:
DATA SEGMENT
score db 70,86,99,45,60,98,99,99,99,99,99,99,99,99,99,99,99,99,99;全班成绩数组
count dw 19;总人数
gradeN db 0,0,0,0,0;对应成绩等级为A B C D E
DATA ENDS
STACK SEGMENT STACK
成绩
4
环境参数
Dosbox-0.74
Masm 5.0
1、实验目的及要求
2、实验原理、实验内容
3、实验仪器设备及材料
4、操作方法与实验步骤
5、实验数据记录及处理
6、实验结果分析及讨论
一、实验目的:
1.掌握子程序设计方法。
2.掌握调用程序与子程序间参数传递的几种方法。
二、实验任务
1.编制一个子程序把一个十六位二进制数用十六进制形式在屏幕上显示出来,采用堆栈方法传递这个二进制数,并用一个主程序验证它。
3、计算参数的偏移地址,取出数据并存入dl中。MOV DL,SS:[BP+5]
2.设有一个数组存放学生的成绩(0~100),编制一个子程序统计0~59分,60~69分,70~79分,80~89分,90~100分的人数,并分别存放到scoreE, scoreD, scoreC, scoreB, scoreA单元中,编写一~个主程序与之配合使用。
mov al,[bx]
call grade
inc bx
loop again
mov bx,0
mov cx,5
实验七 kell 求最大值和最小值
实验七求最大值和最小值一、实验目的1、学习子程序的定义和调用方法。
2、掌握子程序设计、调试。
二、实验内容对内存中给定的几个无符号字节数,求其最大值和最小值并在数码管上显示。
三、实验程序框图四、实验步骤联机模式:(1)在内存4000H~4007H中写入任意八个字节的数,按下MON键,返回P状态。
(2)在PC机和实验系统联机状态下,运行该实验程序,可用鼠标左键单击菜单栏“文件”或工具栏“打开图标”,弹出“打开文件”的对话框,然后打开598K8ASM文件夹,点击S7.ASM文件,单击“确定”即可装入源文件,再单击工具栏中编译装载,即可完成源文件自动编译、装载目标代码功能,再单击“调试”中“连续运行”或工具图标运行,即开始运行程序。
(3)数码管显示为:“XX——XX”,最左两位为最大值,最右两位为最小值。
脱机模式:1、在P.态下,按SCAL键,然后在内存4000H~4007H中写入任意八个字节的数,按下MON键,返回P状态。
2、在P.态下,输入2E70,按EXEC键。
3、数码管显示为:“XX——XX”,最左两位为最大值,最右两位为最小值。
五、实验程序清单CODE SEGMENT ;S7.ASM,LOOK FOR MAX & MINASSUME CS:CODEORG 2E70H ;INPUT DATA 4000H--4007H START: JMP START0PA EQU 0FF20H ;字位口PB EQU 0FF21H ;字形口PC EQU 0FF22H ;键入口BUF DB ?,?,?,?,?,?data1:db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1hdb 86h,8eh,0ffh,0ch,89h,0deh,0c7h,8ch,0f3h,0bfh,8FH START0: MOV SI,4000HMOV CX,0008HCALL MAXMINCALL BUF1CON1: CALL DISPJMP CON1MAXMIN: JCXZ EXITPUSH SIPUSH CXPUSH BXMOV BH,[SI]MOV BL,BHCON2: LODSBCMP AL,BHJNA X1MOV BH,ALJMP X2X1: CMP AL,BLJNB X2MOV BL,ALX2: LOOP CON2MOV AX,BXPOP BXPOP CXPOP SIEXIT: RETDISP: MOV AL,0FFH ;00HMOV DX,PAOUT DX,ALMOV CL,0DFH ;显示子程序 ,5msMOV BX,OFFSET BUFDIS1: MOV AL,[BX]MOV AH,00HPUSH BXMOV BX,OFFSET DATA1ADD BX,AXMOV AL,[BX]POP BXMOV DX,PBOUT DX,ALMOV AL,CLMOV DX,PAOUT DX,ALPUSH CXDIS2: MOV CX,00A0HLOOP $POP CXCMP CL,0FEH ;01HJZ LX1MOV AL,0FFH ;00HMOV DX,PAOUT DX,ALINC BXROR CL,1 ;SHR CL,1JMP DIS1LX1: MOV AL,0FFHMOV DX,PBOUT DX,ALRETBUF1: MOV BH,AHCALL ZHMOV BUF+5,ALMOV BUF+4,AHMOV AL,BHCALL ZHMOV BUF,AHMOV BUF+1,ALMOV BUF+2,17HMOV BUF+3,17HRET;-------------------------------------------------------- ZH: MOV BL,ALMOV CL,4ROL AL,CLAND AL,0FHMOV AH,ALMOV AL,BLAND AL,0FHRET;------------------------------------------------------- CODE ENDSEND START、实验程序清单CODE SEGMENTASSUME CS: CODEPA EQU 0FF28HPCTL EQU 0FF2BHRSN EQU 00H ;PC0RS EQU 01HRWN EQU 02H ;PC1RW EQU 03HEN EQU 04H ;PC2E EQU 05HCS1N EQU 08H ;PC4CS1 EQU 09HCS2N EQU 0ah ;PC5CS2 EQU 0bhORG 22E0h ;JMP STARTYR DB ?ZR DB ?PAG DB ?Y16 DB ?pag7 db ?FL DB ?START: MOV DX,PCTLMOV AL,80HOUT DX,ALMOV FL,00HMOV CX,0003HCALL DELAYXMSMOV DX,PCTLMOV AL,ENOUT DX,ALMOV AL,RSOUT DX,ALMOV AL,CS1OUT DX,ALMOV AL,CS2NOUT DX,ALMOV AL,RSNOUT DX,ALMOV DX,PAMOV AL,3FH ;WR ONOUT DX,ALCALL WRITEMOV CX,0001HCALL DELAYXMSMOV DX,PCTLMOV AL,CS2OUT DX,ALMOV AL,CS1NOUT DX,ALMOV AL,RSNOUT DX,ALMOV DX,PAMOV AL,3FHOUT DX,ALCALL WRITEMAIN: MOV BX,OFFSET TAB5CALL ZXL ;DISP 1-SCREENJMP $ZXL: MOV DX,PCTL ;DISP 1-SCREENMOV AL,CS2NOUT DX,ALMOV AL,CS1 ;DISP L-SCREENOUT DX,ALCALL XPAGE ;SET X,Y,PAGCALL COM ;DISPMOV DX,PCTLMOV AL,CS1NOUT DX,ALMOV AL,CS2 ;DISP R-SCREENOUT DX,ALCALL XPAGE ;SET X,Y,PAGCALL COM ;DISPRETXPAGE: MOV ZR,0c0H ;SET Z,Y,PAG MOV YR,40HMOV PAG,0B8Hmov pag7,08hMOV DX,PCTLMOV AL,ENOUT DX,ALMOV AL,RSN ;wr instructionOUT DX,ALMOV DX,PAMOV AL,ZR ;set z=0OUT DX,ALCALL WRITEMOV DX,PAMOV AL,YR ;set yOUT DX,ALCALL WRITEMOV DX,PAMOV AL,PAG ;SET PAGOUT DX,ALCALL WRITERETCOM: MOV Y16,10HMOV CX,0040HMOV DX,PCTLMOV AL,RSOUT DX,ALJ44: push bxJ4: MOV AL,CS:[BX]MOV DX,PAOUT DX,ALpush cxCALL WRITEPOP CXinc bx ;!!!!DEC Y16CMP Y16,0000HJNZ J42MOV Y16,10HADD BX,0010HJ42: LOOP J4NOT FLCMP FL,00HJZ J45pop bxadd bx,0010hJ46: INC PAGdec pag7cmp pag7,00Hjz j43MOV AL,RSNMOV DX,PCTLOUT DX,ALMOV DX,PAMOV AL,YR ;set yOUT DX,ALCALL WRITEMOV DX,PAMOV AL,PAG ;SET PAGOUT DX,ALCALL WRITEJMP COMJ43: RETJ45: pop bxadd bx,0070hJMP J46;----------------------WRITE: MOV DX,PCTLMOV AL,RWNOUT DX,ALMOV AL,ENOUT DX,ALMOV AL,EOUT DX,ALCALL DELAY2MSMOV AL,ENOUT DX,ALRETDELAY2MS:MOV CX,78HLOOP $RETDELAYXMS:PUSH CXMOV CX,0040HDELY2:PUSH CXMOV CX,3E8HLOOP $POP CXLOOP DELY2POP CXLOOP DELAYXMSRETTAB5:、实验程序清单CODE SEGMENTASSUME CS: CODEPA EQU 0FF28HPCTL EQU 0FF2BHRSN EQU 00H ;PC0RS EQU 01HRWN EQU 02H ;PC1RW EQU 03HEN EQU 04H ;PC2E EQU 05HCS1N EQU 08H ;PC4CS1 EQU 09HCS2N EQU 0ah ;PC5CS2 EQU 0bhORG 22E0h ;JMP STARTYR DB ?ZR DB ?PAG DB ?Y16 DB ?pag7 db ?FL DB ?START: MOV DX,PCTLMOV AL,80HOUT DX,ALMOV FL,00HMOV CX,0003HCALL DELAYXMSMOV DX,PCTLMOV AL,ENOUT DX,ALMOV AL,RSOUT DX,ALMOV AL,CS1OUT DX,ALMOV AL,CS2NOUT DX,ALMOV AL,RSNOUT DX,ALMOV DX,PAMOV AL,3FH ;WR ONOUT DX,ALCALL WRITEMOV CX,0001HCALL DELAYXMSMOV DX,PCTLMOV AL,CS2OUT DX,ALMOV AL,CS1NOUT DX,ALMOV AL,RSNOUT DX,ALMOV DX,PAMOV AL,3FHOUT DX,ALCALL WRITEMAIN: MOV BX,OFFSET TAB5CALL ZXL ;DISP 1-SCREENJMP $ZXL: MOV DX,PCTL ;DISP 1-SCREENMOV AL,CS2NOUT DX,ALMOV AL,CS1 ;DISP L-SCREENOUT DX,ALCALL XPAGE ;SET X,Y,PAGCALL COM ;DISPMOV DX,PCTLMOV AL,CS1NOUT DX,ALMOV AL,CS2 ;DISP R-SCREENOUT DX,ALCALL XPAGE ;SET X,Y,PAGCALL COM ;DISPRETXPAGE: MOV ZR,0c0H ;SET Z,Y,PAG MOV YR,40HMOV PAG,0B8Hmov pag7,08hMOV DX,PCTLMOV AL,ENOUT DX,ALMOV AL,RSN ;wr instructionOUT DX,ALMOV DX,PAMOV AL,ZR ;set z=0OUT DX,ALCALL WRITEMOV DX,PAMOV AL,YR ;set yOUT DX,ALCALL WRITEMOV DX,PAMOV AL,PAG ;SET PAGOUT DX,ALCALL WRITERETCOM: MOV Y16,10HMOV CX,0040HMOV DX,PCTLMOV AL,RSOUT DX,ALJ44: push bxJ4: MOV AL,CS:[BX]MOV DX,PAOUT DX,ALpush cxCALL WRITEPOP CXinc bx ;!!!!DEC Y16CMP Y16,0000HJNZ J42MOV Y16,10HADD BX,0010HJ42: LOOP J4NOT FLCMP FL,00HJZ J45pop bxadd bx,0010hJ46: INC PAGdec pag7cmp pag7,00Hjz j43MOV AL,RSNMOV DX,PCTLOUT DX,ALMOV DX,PAMOV AL,YR ;set yOUT DX,ALCALL WRITEMOV DX,PAMOV AL,PAG ;SET PAGOUT DX,ALCALL WRITEJMP COMJ43: RETJ45: pop bxadd bx,0070hJMP J46;----------------------WRITE: MOV DX,PCTLMOV AL,RWNOUT DX,ALMOV AL,ENOUT DX,ALMOV AL,EOUT DX,ALCALL DELAY2MSMOV AL,ENOUT DX,ALRETDELAY2MS:MOV CX,78HLOOP $RETDELAYXMS:PUSH CXMOV CX,0040H DELY2:PUSH CXMOV CX,3E8HLOOP $POP CXLOOP DELY2POP CXLOOP DELAYXMSRETTAB5:。
单片机实验七拼字程序
实验七拼字程序
一、实验目的
进一步掌握汇编语言设计和调试方法
二、实验内容
把7000H、7001H的低位相拼后送入7002H中
三、实验程序框图及源程序
ORG 0070H
MOV DPTR,#7000H
MOVX A,@DPTR
ANL A,#0FH
SW AP A
MOV B,A
INC DPTR
MOVX A,@DPTR
ANL A,#0FH
ORL A,B
INC DPTR
MOVX @DPTR,A
SJMP $
四、实验步骤
(1)在闪动“P.”状态,按PCDBG键
(2)进入PC机C盘DV598子目录下,输入DBUG回车,选择PE子菜单,进入全屏幕编辑,输入实验源程序后,按F2或F3存盘,F4退出,文件名为PWORD.ASM。
(3)再进入主菜单选择Assemble子菜单,进行源程序的交叉汇编。
(4)再选择Load装入HEX(HEX)file代码文件,待传送结束后按回车键,
(5)按F7键显示指令代码,用F3命令将PC值修改为0030H
(6)按TAB键进行各个窗口的切换,Ctrl+M把存储器窗口改为片外RAM7000H,并把7000H 和7001H置为03H和04H。
(7)按F8键单步运行或F9键连续运行实验程序
(8)单步、运行完实验程序后,在存贮器窗口检查7002H中的内容是否全为34H。
汇编语言实验报告(子程序)
西安财经学院信息学院
《汇编语言程序设计》 实验报告
实验名 子程序结构程序设计 实验室 实验楼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、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七:子程序设计
一、实验目的:
通过运行例题程序,了解并掌握简单子程序的编写以及调用方法。
二、实验基础知识:
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 near
cmp al,61h
jb next
cmp al,7ah
ja next
sub al,20h;小写改大写
next:ret
stob endp
4、子程序的调用方法
子程序调用由CALL指令实现。
根据主程序与子程序在内存中所处的位置关系和使用不同的寻址方式,可以分为段内直接、段内间接、段间直接、段间间接4种调用方式。
段内直接调用
格式:CALL 子程序名
功能:程序转到子程序处执行。
SP←SP-2,SS:[SP] ←IP(保存16位返回地址),IP ←子程序入口的偏移地址
例如:CALL PROC1 ,其中PROC1就是一个子程序名。
三、实验内容
1)输入以下源程序并将其保存为汇编语言源文件(.asm),在MASM中汇编、连接并运行。
DATA SEGMENT
ARRAY1 DW 1,3,4,5,7,125
LEN1 EQU $-ARRAY1
SUM1 DW ?
DATA ENDS
STACK1 SEGMENT STACK
DW 256 DUP (?)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
MAIN PROC FAR
START:MOV AX,STACK1
MOV SS,AX
MOV AX,DATA
MOV DS,AX
MOV CX,LEN1/2
LEA SI,ARRAY1
MOV AX,0
CALL SUM
MOV SUM1,AX
CALL DISP
MOV AH,4CH
INT 21H
MAIN ENDP
SUM PROC NEAR
LOOP1: ADD AX,[SI]
ADD SI,2
LOOP LOOP1
RET
SUM ENDP
DISP PROC NEAR
NEXT:CWD
MOV BX,10
DIV BX
PUSH DX
INC CX
CMP AX,0
JNZ NEXT
OUTP:POP DX
ADD DL,30H
MOV AH,2
INT 21H
LOOP OUTP
RET
DISP ENDP
CODE ENDS
END START
2)分析程序的结构和功能。
找出主程序中包括几个子程序,每个子程序的功能以及入口和出口参数分别是什么?
3)参考以上子程序的功能,将下列程序补充完整,实现将W的值以十进制数的形式输出的功能。
datarea segment
x dw 18
y dw 45
z dw 24
v dw 1500
w dw ?
datarea ends
program segment
main proc far
assume cs:program, ds:datarea start:
mov ax,datarea
mov ds,ax
mov ax,x
imul y
add ax,z
adc dx,0
sub ax,540
sbb dx,0
mov cx,ax
mov bx,dx
mov ax,v
cwd
sub ax,cx
sbb dx,bx
idiv x
mov w,ax
()
main endp
(
)
program ends
end start。