微机原理实验4——子程序的定义与调用
微机原理与技术实验四:子程序结构
微机原理与技术实验四: 子程序结构实验四:子程序设计一、实验目的:掌握子程序结构, 熟悉汇编上机环•='二、实验内容: 设有数组SCORE存放学生的成绩(0-100分),编写一个子程序统计0~59分、60〜69分、70〜79分、80〜89分、90〜100分的人数,并分别存放到SCOREE. SCORED、SCOREC、SCORERSCOREA 单元中。
编写一个主程序与之配合使用。
二、实验步骤:1、在“轻松汇编”环境下编写、编译和生成程2、进入DEBUG界面,运行程序,观察SCOREE、SCORED> SCOREC、SCORED> SCOREA变量的值是否正确:在DEBUG下运行程序:F9键观察多个变量值:“Data” 9 “Add Watch” 今“输入变量1"“Data” 9 “Add Watch”今“输入变量2”DATA SEGMENTSCOREDB 80,78,45,81,90,72,60,75SCOREE DBSCORED DBSCOREC DBSCORED DBSCOREA DBDATA ENDSSTCK SEGMENTDB 10 DUP(?)STCK ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STCKSTART:;以下为子程序COUNT PROC补全程序RET COUNT ENDP CODE ENDSMOV INTAH ,4CH 21H五、实验小结说明:实验报告要包涵上述五项DATA SEGMENTSCORE DB 80,7&45,81,90,72,60,75SCOREE DB 0SCORED DB 0SCOREC DB 0SCORER DB 0SCOREA DB 0DATA ENDSSTCK SEGMENTDB 10 DUP(?)STCK ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STCKSTART:MOV AX,DATAMOV DS,AXLEA SI,SCOREMOV CX,8Al: CALLINCCOUNT SIDEC CXCMP CX,OJNZ AlMOV AH,4CHINT 21HCOUNT PROCMOV AL,[SI]CMP AL,90JNB A2CMP AL,80JNB A3CMP ALJOJNB A4CMP AL,60JNB A5INC SCOREERETA2: INC SCOREARETA3: INC SCORERRETA4: INCRETA5: INCRETCOUNT ENDP CODE ENDSEND SCOREC SCOREDSTART。
微机原理实验--子程序与宏指令
27.编制计算N(N<50)个偶数之和(2+4+6+…)的子程序和接收键入N及将结果显示在主程序。
子程序代码:stack segment stack 'stack';定义堆栈段dw 32 dup(?);堆栈段有32字空间stack endsdata segment;定义数据段input db 'please input N:','$'n db 5,0,5 dup(?);定义变量数据区nobfdb 8 dup(?)data endscode segment;定义代码段start proc far ;定义一个过程startassume ss:stack,cs:code,ds:datapush dssub ax,ax;未通过过程DOS返回做准备push axmovax,datamovds,axmovdx,offset inputmov ah,9;9号功能调用,显示器显示“please input N:”int 21hmovdx,offset nmov ah,10;10号功能调用,键盘输入并显示数据nint 21hmovsi,offset n+2mov cl,n+1mov ch,0call a;调用子程序acall sum;调用子程序sumshl ax,1;乘2movbx,segobfmoves,bxmovdi,offset obf+1call b;调用子程序bcall HH;调用子程序HHmovdx,offsetobfmov ah,9int 21hRETstart endpsum proc;定义子程序sum,sum为自然数相加子程序push cx;保护现场push bxmovcx,axmov bx,0movax,bxsm: adc bx,1;把bx,1和CF相加adcax,bx;把ax,bx和CF相加loop smpop bx;恢复现场pop cxRETsum endpa proc;定义子程序a,a为键盘输入的十进制数转化成16进制子程序mov ax,0c0: push cxmov cx,10mul cx;乘法指令调用and byte ptr[si],0fh;十进制的asc码转换成BCD码add al,[si]adc ah,0incsi;越过负号指向数字pop cxloop c0RETa endpb proc;定义过程c,b为16进制转换成asc码push axpush bxpush cxpush dxpush dior ax,ax;判断数的负号jns plus;为正转到plusmov byte ptres:[di],'-';为负送负号至输出数据区inc di;求负数的绝对值neg axplus: m ov cx,0;将ax中2进制转换成10进制mov bx,10c1: mov dx,0div bxpush dx;余数进栈inc cx;十进制位数加1or ax,ax;商不为0继续除以10jnz c1c2: pop ax;将十进制转换成asc码add al,30hstosbloop c2mov al,'$'stosbpop dipop dxpop cxpop bxpop axRETb endpHH proc;定义过程HHmov dl,0ah;换行mov ah,2int 21hmov dl,0dh;换行mov ah,2int 21hRETHH endpcode endsend start截图如下:宏指令代码:sum macro A;定义宏sum,sum为自然数相加子程序push cx;保护现场push bxmovcx,Amov bx,0movax,bxsm: adc bx,1;把bx,1和CF相加adcax,bx;把ax,bx和CF相加loop smpop bx;恢复现场pop cxendmstack segment stack 'stack';定义堆栈段dw 32 dup(?);堆栈段有32字空间stack endsdata segment;定义数据段input db 'please input N:','$'n db 5,0,5 dup(?);定义变量数据区nobfdb 8 dup(?)data endscode segment;定义代码段start proc far ;定义一个过程startassume ss:stack,cs:code,ds:datapush dssub ax,ax;未通过过程DOS返回做准备push axmovax,datamovds,axmovdx,offset inputmov ah,9;9号功能调用,显示器显示“please input N:”int 21hmovdx,offset nmov ah,10;10号功能调用,键盘输入并显示数据nint 21hmovsi,offset n+2mov cl,n+1mov ch,0call a;调用子程序aSUM ax;宏展开sumshl ax,1;乘2movbx,segobfmoves,bxmovdi,offset obf+1call b;调用子程序bcall HH;调用子程序HHmovdx,offsetobfmov ah,9int 21hretstart endpa proc;定义子程序a,a为键盘输入的十进制数转化成16进制子程序mov ax,0c0: push cxmov cx,10mul cx;乘法指令调用and byte ptr[si],0fh;十进制的asc码转换成BCD码add al,[si]adc ah,0incsi;越过负号指向数字pop cxloop c0reta endpb proc;定义过程c,b为16进制转换成asc码push axpush bxpush cxpush dxpush dior ax,ax;判断数的负号jns plus;为正转到plusmov byte ptres:[di],'-';为负送负号至输出数据区inc di;求负数的绝对值neg axplus: m ov cx,0;将ax中2进制转换成10进制mov bx,10c1: mov dx,0div bxpush dx;余数进栈inc cx;十进制位数加1or ax,ax;商不为0继续除以10jnz c1c2: pop ax;将十进制转换成asc码add al,30hstosbloop c2mov al,'$'stosbpop dipop dxpop cxpop bxpop axRETb endpHH proc;定义过程HHmov dl,0ah;换行mov ah,2int 21hmov dl,0dh;换行mov ah,2int 21hRETHH endp code endsend start 截图如下:。
子程序的调用
mov ax,data mov ds,ax call nearp lea ax,nearp call ax call nproc lea bx,nproc call word ptr [bx]
call farp call fproc lea bx,fproc
Nearp proc near
…… ret Nearp endp Code1 ends end main code2 segment
3)在调用时,NEAR 和FAR 可以强制改变 CALL FAR PTR NEARPROC CALL NEAR PTR FARPROC
子过程的调用与返回指令
子过程的调用是个”有去有回”的过程,子程序执行
完后必须返回CALL指令的下一条指令处,因此必须对
CALL指令的下条指令的地址进行保存.保存地址的操作 是通过堆栈来完成.不是采用PUSH \POP指令来实现,而
通过存储器来传递参数
当调用程序和子程序处于同一文件中,可以直接访问 块内的变量或数据。 举例3:编写程序从键盘上输入一个字符串,存于变量为INPUT中, 要求以回车键作为输入过程的结束,字符结尾部分添加0。 (1) 分析: 子程序getstring直接从键盘输入字符串,入口参数:无。出 口参数:字符串变量INPUT 变量INPUT 属于通过存储器传递参数,调用程序和子程序处 于同一文件在数据段定义变量属于局部变量
Findmax proc
mov ax,[si] Lp1: cmp ax,[si+2] jg next xchg ax,[si+2] next: add si,2 loop lp1 ret findmax endp Code ends
end main
参数的传递
数控编程中子程序的定义和调用方法
数控编程中子程序的定义和调用方法
1.子程序的定义
在编制加工程序中,有时会遇到一组程序段在-个程序中多次出现,或者在几个程序中都要使用它。
这个典型的加工程序可以做成固定程序,并单独加以命名,这组程序段就称为子程序。
2.使用子程序的目的和作用
使用子程序可以减少不必要的编程重复,从而达到减化编程的目的。
主程序可以调用子程序,一个子程序也可以调用下一级的子程序。
子程序必须在主程序结束指令后建立,其作用相当于一个固定循环。
3.子程序的调用
在主程序中,调用子程序的指令是一个程序段,其格式随具体的数控系统而定,FANUC-6T 系统子程序调用格式为
M98 P--L--
式中M98--子程序调用字;
p--子程序号;
L--子程序重复调用次数。
由此可见,子程序由程序调用字、子程序号和调用次数组成。
4.子程序的返回
子程序返回主程序用指令M99,它表示子程序运行结束,请返回到主程序。
5.子程序的嵌套
子程序调用下一级子程序称为嵌套。
上一级子程序与下一级于程序的关系,与主程序与第一层子程序的关系相同。
子程序可以嵌套多少层由具体的数控系统决定,在FANUC-6T系统中,只能有两次嵌套。
实验四 子程序调用编程设计
实验四子程序调用编程设计子程序也叫过程,过程名即子程序入口的符号地址,过程内至少有一条RET指令,过程名具有段属性、偏移地址属性、距离属性等三种属性。
其格式:过程名:PROC 属性(near or far)···RET过程名 ENDP子程序调用几种常见形式:1、段内近程调用:主程序和过程在同一代码段,过程具有NEAR属性。
2、段间调用:主程序和过程在同一模块,不同代码段,过程具有FAR属性。
3、远程调用:主程序和过程在不同模块。
主、子程序取不同文件名,分别编辑、编译,连接时连在一起,运行主程序。
LINK 主+子↙DEBUG 主.EXE↙实验内容:用主模块和段内近程调用对讲义给出的十个数从小到大排序,将排序后的数据复制到附加段。
冒泡法排序是程序设计较简单常用的排序算法:每次比较相邻的元素,如果第一个比第二个大,就交换他们两个,对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,直到没有任何一对数字需要比较,即该数列已经排序完成。
这个算法的名字由来是因为越小的元素经交换慢慢“浮”到数列的顶端而得名。
data1 segmentx db …data1 endsdata2 segmenty db 10 dmp(0) data2 endscode segment assume cs:code assume ds:data1 assume es:data2 start: mov ax,data mov ds,axcall sub1 call sub2 mov ah,4ch int 21h sub1 proc near···retsub1 endpsub2 proc near···retsub2 endpcode endsend startG=0,末地址↙(mov ah,4ch对应的地址作末地址)用T命令调试运行程序时遇到CALL语句可用P命令跳过子程序一次完成,不用进入子程序内部,否则用T命令进入到子程序内部,遇到INT 21H语句要用P命令。
微机原理实验指导书
实验八 RS-232标准全双工查询方式 异步串行通信实验
实验目的
学习RS-232C标准的串行通信接口电路及串行通信收/发程序的 设计原理与方法。
实验求
采用两台MFID平台板上的串行接口电路进行硬件连接,分别编 写甲乙两机各自的发送与接收程序,并进行调试,直至程序正 常运行。
实验内容
甲乙两台微机之间,按RS-232C标准协议,进行零MODEM方 式,全双工串行通信。所谓全双工是双方通过各自的键盘按键 发送,同时接收对方发来的字符。发送与接收的字符均在屏幕 上显示。通信数格式为起止式:1位停止位,7位数据位,无校 验,波特率因子为16。波特率为1200bps。按ESC键,退出。
微机原理实验指导书
华中科技大学计算机学院 武汉豪申光电新技术有限公司
目录
实验一 实验二 实验三 实验四 实验五 实验六 实验七 实验八 实验九 实验十
系统认识实验 分支程序设计实验 循环程序设计实验 排序程序设计实验 子程序设计实验 8255并行接口实验 音乐发声器接口实验 RS-232标准全双工查询方式异步串行通信实验 查询方式A/D转换器接口实验 D/A函数波形发生器接口实验
实验二 分支程序设计实验
实验目的
掌握分支程序的结构。 掌握分支程序的设计方法。
实验要求
编制计算下面函数值的程序(x,y的值在-128~+127之间) 1 x>=0,y>=0 a= -1 x<0,y<0 0 x,y异号 输入数据为x、y,输出数据为a。
实验内容
在MF2KP环境下输入汇编程序,编译、连接,生成.exe文 件。 2. 启动调试程序(Debug)。 3. 在程序的退出处设置断点,利用Add Watch命令查看A中 的内容是否正确。
子程序设计和调用
子程序设计和调用1.子程序:子程序是完成特定任务的一段代码,它可以接受输入参数,执行一系列操作,并返回结果。
子程序可以是函数(用于数据的转换和处理)或过程(仅用于执行一系列操作而不返回结果)。
2.调用:调用是指程序在需要使用子程序时,通过特定的语法将程序的控制权转移到子程序中执行,并在子程序执行完后返回原来的位置继续执行。
3.参数传递:在调用子程序时,可以将一些数据(参数)传递给子程序使用。
参数可以是常量、变量或表达式。
参数可以用于向子程序传递数据,也可以用于将子程序的结果返回给调用者。
1.模块化:通过将程序划分为多个子程序,可以将复杂的任务分解为小的、可独立实现的模块,提高了程序的模块化程度,使程序结构更清晰,易于理解和维护。
2.代码复用:子程序可以在程序的不同部分多次调用,避免了重复编写相同的代码,提高了代码的复用性,减少了代码量。
3.可重用性:将问题分解为多个子程序后,每个子程序都可以独立编写和测试,可以被其他程序使用,提高了代码的可重用性。
4.高效性:通过将一部分功能委托给子程序处理,可以提高程序的执行效率,减少了代码的冗长和重复。
1.定义子程序:确定需要什么功能和操作,根据需求编写子程序,包括接受参数、执行操作和返回结果。
子程序的定义包括子程序名、参数、返回值等信息。
2.调用子程序:在程序的适当位置调用子程序,使用特定的语法将程序的控制权转移到子程序中执行。
3.传递参数:在调用子程序时,传递需要的参数。
参数的传递可以是值传递,将参数的值复制给子程序;也可以是引用传递,将参数的地址传给子程序,子程序可以访问参数的值。
4.执行子程序:子程序接收参数后,执行一系列操作,可能包括数据处理、运算、条件判断等。
5.返回结果:子程序执行完毕后,将结果返回给调用者,结果可以是计算结果、处理结果等。
调用者可以使用返回的结果继续程序的执行。
6.返回控制权:子程序返回结果后,将程序的控制权返回给调用者,调用者在接收到返回结果后,根据需要继续程序的执行。
子程序的调用
主程序流程图
开始
调用子程序DECBIN,从键盘 接受一个十进制并转化为对应的二进制 调用子程序CRLF实现回车换行 调用子程序BINHEX,把二进制数转换成 16进制并显示 调用子程序CRLF实现回车换行 Y 是否退出 N 接收下一次键盘输入 END
decbin PROC NEAR push ax push cx mov bx,0 mov si,0 Newchar: mov ah,1 int 21h cmp al,’*’ je ext1 sub al,30h jl ext2 cmp al,9 jg ext2 cbw xchg ax,bx mov cx,10 mul cx xchg ax,bx add ax,bx jmp newchar
子程序的定义
3.注意问题
1)过程体内必须有一条RET指令被执行 proc1 proc mov ax,0 proc1 endp proc2 proc mov bx,-1 ret proc endp
子程序的定义
2)调用程序和过程在同一程序段时,属性选择NEAR,当调 用程序和过程不在同一程序段时,应选择FAR 3)在调用时,NEAR 和FAR 可以强制改变 CALL FAR PTR NEARPROC CALL NEAR PTR FARPROC
参数的传递
1 参数传递: 当子程序被调用时,一般需要向子程序传递若干参数, 由子程序来对这些参数完成特定功能处理;当子程序 处理后,需要向调用它的主程序传递结果。这种主程 序和子程序之间的信息的传递称为参数的传递。
参数的传递
2 参数传递方法: 寄存器传递参数 存储器传递参数 地址表传递变量地址 堆栈传递参数
子过程的调用与返回指令
4.子程序调用方式举例
分析下面程序段,说明各种调用子程序的方法和寻址方式: data segment nproc dw nearp fproc dd farp data ends code1 segment assume cs:code1,cs:data Main proc far
微机原理第04章4子程序
9 可编辑ppt
;子程序dpchar:
11 可编辑ppt
第4章:含数据区的子程序
;子程序HTOASC:十六进制数转换为ASCII码
HTOASC proc
push bx
mov bx,offset ASCII
and al,0fh
xlat CS:ASCII;换码:AL←CS:[BX+AL]
pop bx ret ;数据区
执行CALL指令调用子程序 ⑶子程序中对堆栈的压入和弹出操作要成对使用,
保持堆栈的平衡 ⑷子程序开始应该保护使用到的寄存器内容,子
程序返回前相应进行恢复 ⑸子程序应安排在代码段的主程序之外,最好放
在主程序执行终止后的位置(返回DOS后、汇 编结束END伪指令前),也可以放在主程序开 始执行之前的位置
int 21h
pop bx
;逆序出栈,恢复寄存器
pop ax
ret
;子程序返回
dpchar endp
;过程结束
6 可编辑ppt
第4章:例4.15源程序
Sse segment stack Db 30 dup(?)
本程序不需要数据段
Sse ends
Code segment
Assume cs:code,ss:sse
可选的参数指定过程的调用属性。没有指定过 程属性,则采用默认属性
NEAR属性(段内近调用)的过程只能被相同 代码段的其他程序调用
子程序调用实验
计算机科学与技术系实验报告专业名称计算机科学与技术课程名称微机原理与接口技术项目名称子程序调用实验班级学号姓名同组人员无实验日期 2016/12/5一、实验目的与要求:(简述本次实验要求达到的目的,涉及到的相关知识点,实验的具体要求。
)1、熟悉BCD码的调整指令。
2、熟悉ASCII转换成数字的方法。
3、熟悉压缩的BCD码转换成ASCII字符的方法。
4、熟悉子程序的定义和调用。
二、实验内容(根据本次实验项目的具体任务和要求,完成相关内容,可包括:实验目的、算法原理、实验仪器、设备选型及连线图、算法描述或流程图、源代码、实验运行步骤、关键技术分析、测试数据与实验结果、其他)内容:从微机键盘上输入4位被加数、加数,并显示在信息窗口中,实现双字节的BCD 码(四位数)的加法,结果显示在信息窗口中,其中获得BCD码功能,高位0消隐并显示最后结果功能,将压缩的BCD码转换成ASCII字符,使用子程序调用实现。
原理:首先输入被加数,然后调用GetBCDKey函数得到双字节十进制被加数,同样的方法处理加数,然后将两个数带进位相加,得到的数高位0消隐显示出来。
这里的得到双字节的十进制数是关键,还需要有将一个字节的压缩BCD码转换成两个字节数字的函数。
流程图:三、实验分析与小结:(实验过程中的问题分析、产生的原因以及解决方法;实验结果分析;有待优化思路)1.程序分析:.MODEL TINY.STACK 100.DATABUFFER DB 10 DUP(?);BUFFER存放8个不确定数augend DB 2 DUP(?) ;被加数addend DB 2 DUP(?) ;加数msg1 DB 0DH,0AH,'请输入被加数: $'msg2 DB 0DH,0AH,'请输入加数: $'msg3 DB 0DH,0AH,'结果: $';msg3存放结果;0DH和0AH分别是回车和换行的ASCII码,;'$'是DOS功能调用INT 21H中9号功能要求的要显示字符串的结束标志.CODESTART: MOV AX,@DATAMOV DS,AXMOV ES,AXCLD ;方向标志位清零 ;CLD与STD是用来操作方向标志位DF(Direction Flag)。
子程序调用——精选推荐
尊敬的各位评委老师:大家好,我说课的题目是《子程序调用》,下面我将从五个方面展开说明本节课的教学设计。
一、教材分析本节课选自中国劳动社会保障出版社出版的《数控车床加工工艺与编程》(第二版)的内容。
是以模块的方式编写的,有利于培养学生的数控编程与加工实际技能。
其不足是知识点零散,不利于学生系统掌握知识。
而本节课我是在第五模块多槽加工的基础上,特设的、独立的一节内容。
因为多槽加工的核心指令就是子程序的调用,第七模块复杂零件加工也需要调用子程序。
这样把子程序调用设计成独立的一节内容,能使学生对指令的运用触类旁通,有利于学生系统的理解知识点,弥补了模块教学的不足,使用子程序调用指令,可以有效简化编程,节约时间,降低操作失误。
【学情分析】:我所教授的对象为数控专业二年级的学生,他们具备一定的数控编程基础,其动手能力强,思维活跃。
但自主学习的意识有待于进一步提高,因此在教学中我科学地安排“教、学、练”相结合的步骤,注重学生潜力的开发。
营造平等、宽松的学习气氛,让学生快乐的学习,自主的探究。
【教学重点、难点的确定】:在深入分析教材的基础上我将教学的重点确定:掌握子程序指令的格式及编程方法。
通过零件的仿真加工,能够体会加工程序中的各种指令代码的作用,使学生动手能力得到较大的提高。
运用“子程序嵌套”进行程序编写是本节课一个的难点在编写子程序时要考虑程序之间的衔接问题,对初学者来说,如何运用“子程序嵌套”进行程序编写是道更高的“门槛”。
二、教学目标的确立:根据职业教育:以就业为导向、以能力为本位、以技能为核心的指导思想。
我将教学目标确定如下:【知识目标】明确子程序应用场合,掌握子程序指令格式及编程方法。
【能力目标】培养学生的创新思维能力,通过零件的仿真加工将知识转化为实践操作的能力。
【德育目标】培养学生积极探索、团结协作的科学精神;培养学生严谨、认真的做事态度第三教法与学法:【教法】大家都知道,科学合理的教学方法能使教学的效果事半功倍,达到教与学的和谐统一,因此我对教材内容进行优化整合,采用理论实践一体化教学模式,给学生提供动手的环境。
项目四子程序调用功能
03
优化。
多线程与异步编程
在多线程或异步编程环境中,子程序调 用可以用于实现任务的并行处理和异步 执行。
通过子程序调用,可以将复杂的任务分解为 多个简单的子任务,并由不同的线程或进程 执行,提高程序的执行效率和响应速度。
子程序调用可以简化多线程和异步 编程的逻辑,降低并发编程的难度 和错误率。
05
通过指针传递参数,子程序可以通过指针直接修改原 始数据。
返回值处理
返回值使用
子程序执行完毕后,返回一个或多个值给调用者。
错误码处理
子程序可以设置错误码,通过返回错误码告知调用者执行结果是否成功。
错误处理机制
异常处理
子程序在执行过程中遇到错误时,可以抛出异常给调用者处理。
错误码处理
子程序可以设置错误码,通过返回错误码告知调用者执行结果是否成功。
子程序优化策略
减少函数调用次数
通过减少函数调用次数,提高代码执行效率。
使用内联函数
将函数体直接嵌入到调用处,避免函数调用 的开销。
避免重复计算
将重复计算的结果存储在变量中,避免重复 计算。
03
子程序调用的实现方式
函数调用
总结词
函数调用是一种常见的子程序调用方式,它将子程序作为一个独立的实体进行调用,可以重复使用和 重定义。
03
在编写子程序时,应考虑线程安全问题,并采取相应
的预防措施。
优化子程序性能
01
子程序的性能对整个项目的性 能有很大影响。
02
应优化子程序的算法和数据结 构,以提高执行效率。
03
使用性能分析工具来识别子程 序的瓶颈,并进行针对性的优 化。
THANKS FOR WATCHING
子程序的定义及使用
9.1 Fortran 子程序概述
FORTRAN 90子程序,也称过程,划分为两类:函数和子例行程序。 函数是指产生一个运算结果且通过操作数调用执行的子程序。 子例行程序是指可产生多个处理结果且通过CALL语句调用执行的子 程序。 每类子程序又划分为标准子程序和用户自定义子程序。 用户自定义子程序又划分为内部子程序、外部子程序和模块子程序。 FORTRAN 90的子程序分类
不但浪费了宝贵的时间和精力,而且也容易出错。任何数学
表达式实际上都可表示成一元、二元或多元函数关系,即 F(x1,x2,…,xn),这些函数关系如果没有对应的标准函数,则 需要用户设法定义新的函数来实现它们。
FORTRAN 90提供了语句函数定义功能来定义一些简单的 函数,用于实现有关的函数关系。用户自定义语句函数其使 用方法与标准函数相同,可以作为操作数在表达式中调用。
END program
调用一般形式为: 语句函数名([<实在参数表>]) 说明: <语句函数名>同语句函数定义语句中的语句函数名相同。 <实在参数表>为实在参数或实参,其个数、次序和类型应与定 义语句中形式参数一致。实在参数之间用逗号分隔。 实参可是常数、变量、数组元素、函数名、表达式。 当调用语句函数时,其执行过程如下: 首先计算实参表达式的值; 将实参值赋予对应的形参,即形实参结合 用被赋值的形参对语句函数定义语句中的表达式进行求值运 算; 将运算后的表达式值转换为函数名类型,并将其按函数值返回 到调用位置。
F(x1,x2,x3)=3.14159*(x1+x2/60.0+x3/3600.0)/180.0 A=F(36.0,43.0,27.0) B=F(15.0,24.0,0.0) C=F(8.0,16.0,54.0) S=COS(A)**2-4*SIN(B)*TAN(C) WRITE (*,*) A,B,C,S
微机原理与接口技术:过程调用指令
4.过程调用指令过程调用指令也称为子程序调用指令。
程序设计时常常把一些功能相对完整或相对独立的程序段编写成独立的程序模块,称为子程序,子程序的应用使程序结构清晰明了。
主程序可用调用指令调用子程序,子程序执行结束后自动返回主程序,主程序继续执行。
(1)调用指令根据子程序所在的位置,调用指令分为段内调用和段间调用。
段内调用只修改IP的值,段间调用CS和IP的值都被修改。
CALL指令在执行时第一步首先保存断点,以便子程序返回主程序时从断点处继续执行;第二步取出子程序的入口地址赋给IP或CS:IP,转去执行子程序。
指令格式:CALL OPRD功能:调用OPRD指明的子程序。
说明:OPRD可以是子程序的名字或指令标号,可以是16位的寄存器,还可以是两个或4个存储单元的内容。
例如:CALL NEAR DELAYDELAY是子程序名,NEAR是属性说明符,说明DELAY子程序与这条CALL指令在同一个代码段中,NEAR可以省略。
指令执行时首先将当前IP的内容压栈,然后IP←IP+16位位移量,程序就转移到子程序执行。
16位位移量指的是CALL指令的下一条指令与DELAY之间的差值。
这种CALL指令最常见,也称为段内直接调用。
CALL AX子程序的入口地址由AX提供,即将AX的内容赋给IP,其他动作与上面相同。
CALL WORD PTR [BX]子程序的入口地址由[BX]指明的两个内存单元提供,其他动作与上面同。
这两条指令也称为段内间接调用。
CALL FAR MEMMEM是子程序名,FAR是属性说明符,说明MEM子程序与这条CALL指令不在同一个代码段中,FAR不能省略。
指令执行时首先将当前CS和IP的内容压栈,然后将MEM入口地址的段基址取出来赋给CS,将偏移地址取出来赋给IP,程序就转移到子程序执行。
这种CALL指令较常见,也称为段间直接调用。
例如:CALL 2000H:0100H ;指令直接给出子程序的段基址和偏移地址。
子程序及其调用实验
实验二 子程序及其调用实验一、 实验目的1、通过编辑练习常用指令,理解并掌握MCS-51单片机的指令系统。
2、掌握子程序调用的程序设计。
3、掌握子程序调用过程中保护现场与恢复现场以及调用程序与被调用程序之间的参数传递。
4、学习汇编语言的程序设计方法二 、实验设备计算机操作系统:Windows xp应用软件:WAVE6000三 、实验内容编写程序,计算2^i a Y ∑=。
a1,a2,...,a10存放在内部RAM 的20H 开始的存储区内,计算所得结果放入R2和R3中。
四、实验源程序ORG 0000HMAIN: MOV R0,#20HMOV R7,#10HMOV R3,#0MOV R2,#0MOV 20H,#05HMOV 21H,#04HMOV 22H,#03HMOV 23H,#02HMOV 24H,#01HMOV 25H,#09HMOV 26H,#08HMOV 27H,#07HMOV 28H,#06HMOV 29h,#00HLOOP: MOV A ,@R0ACALL SORTADD A,R2MOV R2,ACLR AADDC A,R3MOV R3,AINC R0DJNZ R7,LOOPSJMP $SORT: MOV DPTR,#TABMOVC A,@A+DPTRRETTAB: DB 0,1,4,9,16,25,36,49,64,81五、实验结果与分析本次实验是计算0到9的平方和,实验结果为011D,与计算结果相符。
子程序调用不必重复编写同样的程序,有利于提高编码效率,缩短源程序与目标程序的长度,节省程序存储的空间,使程序模块化、通用化,便于阅读、交流。
六、实验心得通过这次实验,我理解并掌握了子程序调用的程序设计,掌握子程序调用过程中保护现场与恢复现场以及调用程序与被调用程序之间的参数传递。
子程序调用能很好的提高编码效率,节省程序存储的空间,应该多加练习,熟练掌握。
(注:专业文档是经验性极强的领域,无法思考和涵盖全面,素材和资料部分来自网络,供参考。
子程序实验报告
一、实验目的1. 理解子程序的概念和作用。
2. 掌握子程序的编写方法和调用方式。
3. 学会使用子程序实现模块化编程,提高程序的可读性和可维护性。
二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 编程语言:C++三、实验内容1. 子程序的定义与调用2. 子程序的参数传递3. 子程序的递归调用4. 子程序的应用实例四、实验步骤1. 子程序的定义与调用(1)编写一个简单的子程序,实现两个整数的加法运算。
```cpp#include <iostream>using namespace std;// 定义子程序int add(int a, int b) {return a + b;}int main() {int a = 10;int b = 20;int sum = add(a, b); // 调用子程序cout << "The sum of " << a << " and " << b << " is " << sum << endl; return 0;}```(2)编译并运行程序,观察输出结果。
2. 子程序的参数传递(1)编写一个子程序,实现两个整数的交换。
```cpp#include <iostream>using namespace std;// 定义子程序void swap(int &a, int &b) {int temp = a;a = b;b = temp;}int main() {int a = 10;int b = 20;cout << "Before swap: a = " << a << ", b = " << b << endl;swap(a, b); // 调用子程序cout << "After swap: a = " << a << ", b = " << b << endl;return 0;}```(2)编译并运行程序,观察输出结果。
中断处理和子程序调用
中断处理和子程序调用一、引言中断处理和子程序调用是计算机领域中常用的两种编程技术。
中断处理是指在程序执行过程中,遇到特定事件时,暂停当前任务,转而执行特定的中断处理程序。
而子程序调用是指将一个独立的程序段作为子程序,在需要的时候进行调用,执行完毕后返回到原程序继续执行。
本文将深入探讨中断处理和子程序调用的原理、应用场景及其优缺点。
二、中断处理中断处理是计算机系统中的一种重要机制,用于处理外部事件的发生。
当特定事件发生时,中断会打断当前程序的执行,转而执行中断处理程序。
中断可以分为硬件中断和软件中断两种类型。
2.1 硬件中断硬件中断是由硬件设备触发的中断,例如外部设备的输入输出、定时器的溢出等。
硬件中断需要通过硬件电路来实现,当硬件设备触发中断时,会向CPU发送中断请求信号,CPU则根据中断向量表找到对应的中断处理程序并执行。
2.2 软件中断软件中断是由软件指令触发的中断,也称为软中断或系统调用。
软件中断通常由程序员在程序中主动设置的中断指令触发,用于处理一些特定的操作,如操作系统的系统调用。
软件中断的触发和处理过程由CPU完成,通过改变程序计数器的值,使CPU跳转到中断处理程序的入口地址执行。
2.3 中断处理过程中断处理过程主要包括中断请求、中断响应和中断处理三个阶段。
1.中断请求:当硬件设备或软件触发中断时,会向CPU发送中断请求信号,请求CPU执行中断处理程序。
2.中断响应:CPU在接收到中断请求后,会根据中断类型和中断向量表找到对应的中断处理程序的入口地址,并将当前程序的状态保存起来,以便中断处理完成后能够恢复执行。
3.中断处理:CPU跳转到中断处理程序的入口地址开始执行中断处理代码。
中断处理程序会根据具体的中断类型进行相应的处理,处理完毕后会恢复之前保存的程序状态,并返回到原程序继续执行。
三、子程序调用子程序调用是一种将一个独立的程序段作为子程序,在需要的时候进行调用的编程技术。
子程序通常用于完成某个独立的功能,可以在不同的地方多次调用,提高代码的复用性和可维护性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
班级:计科1202班姓名:陈秉耀学号:201216010106
实验4——子程序的定义与调用
1、实验目的
掌握子程序编写和调用;
掌握子程序的参数传递和返回值的获取方法;
2、实验内容
实验2(2):“调用DOS中断,完成字符串的以下输入和输出操作。
具体要求是:①调用INT 21H的AH=09H子功能输出提示信息“Input String:”,②调用INT 21H的AH=0AH 子功能输入一个字符串,③输出回车(ASCII码为0DH)、换行(ASCII码为0AH),④将输入字符逐一改大写后输出。
设计四个子程序,分别对应上面每一小步子功能,在主程序调用。
============================================================================ ====
实验报告
============================================================================ ====
DATAS SEGMENT
;此处输入数据段代码
keynum =255
string db keynum;定义键盘需要的缓冲区
db 0
db keynum dup(0)
string1 db'Input String',"$"
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
call dp1
call dp2
call dp3
call dp4
MOV AH,4CH
INT 21H
;输出提示信息Input String
dp1 proc
push dx
mov ah,09h
mov dx,offset string1
int 21h
pop dx
ret
dp1 endp
;输出回车,换行
dp2 proc
push ax
mov ah,02h
mov dl,0dh
int 21h
mov ah,02h
mov dl,0ah
int 21h
pop ax
ret
dp2 endp
;输入一个字符串
dp3 proc
push dx
mov dx,offset string
mov ah,0ah
int 21h
pop dx
ret
dp3 endp
;将输入字符逐一改大写后输出
dp4 proc
push bx
mov dl,0ah ;换行
mov ah,2
int 21h
mov bx,offset string+1
mov cl,[bx]
mov ch,0
again: inc bx
mov dl,[bx]
cmp dl,'a'
jb disp
cmp dl,'z';比较是否为小写字母
ja disp
sub dl,20h;将小写字母转化为大写字母
disp:mov ah,2
int 21h
loop again
pop bx
ret
dp4 endp CODES ENDS
end start
\。