




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第六章
子程序结构26子程序结构在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用在汇编语言中,子程序又称过程子程序:功能和结构相同,只是某些变量得值有所不同调用子程序的程序称为主调程序或主程序36子程序结构子程序的基本结构包括以下几个部分:(1)子程序定义(2)保护现场和恢复现场(3)子程序体(4)子程序返回46.1子程序的设计方法
6.1.1过程定义伪操作子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:过程名PROC[NEAR/FAR]┆过程名ENDP其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性(NEAR和FAR)56.1子程序的设计方法
6.1.1过程定义伪操作NEAR/FAR属性子程序定义时指定,CALL和RET时则由汇编程序来确定过程属性的确定原则:NEAR:在同一代码段中FAR:在不同代码段中主程序MAIN应定义为FAR属性例66.1子程序的设计方法
6.1.1过程定义伪操作SEGX SEGMENT ┆SUBT PROC FAR ;虽然有一次调用是在本段内,但是
;由于还有段外调用,所以要用FAR ┆ RETSUBT ENDP ;第一次调用 ┆CALL SUBT ┆SEGX ENDS;SEGY SEGMENT ┆ CALL SUBT ;第二次调用 ┆SEGY ENDS76.1子程序的设计方法
6.1.2子程序的调用和返回CALL和RET完成调用和返回的操作注意运行时的堆栈状态CALL调用时使返回地址入栈RET时应该能使返回地址正确出栈86.1子程序的设计方法
6.1.3保护现场和恢复现场当主程序和子程序使用的寄存器发生冲突时要注意保存和恢复原有信息可以利用堆栈来实现PROG PROC PUSH AX PUSH BX
PUSH CX ;保护现场
PUSH DX ┆POP DX POP CX POP BX ;恢复现场
POP AX RET ;返回断点处PROC ENDP子程序所使用到的寄存器都要引起注意96.1子程序的设计方法
6.1.4主程序和子程序的参数传递通过寄存器传递参数使用十分方便,是最常用的一种方式只能用于参数不多的情况开始调用DECIBIN调用CRLF调用BINIHEX调用CRLF结束从键盘取得十进制数,保存到BX中显示回车和换行用十六进制形式显示BX中的数例:十进制到十六进制转换的程序:要求从键盘取得一个十进制数,然后把该数以十六进制的形式在屏幕上显示出来源程序106.1子程序的设计方法
6.1.4主程序和子程序的参数传递如果过程和调用在同一源文件(同一程序模块中),则过程可以直接访问模块中的变量例6.4主程序MAIN和过程PROADD在同一源文件中,要求用过程PROADD累加数组的所有元素,并把和(不考虑溢出的可能性)送到指定的存储单元中去源程序116.1子程序的设计方法
6.1.4主程序和子程序的参数传递通过地址表传递参数在主程序中建立一个地址表,将要传递给子程序的参数都存放在地址表中,然后将地址表的首地址通过寄存器BX传到子程序中去子程序通过地址表取得所需参数,并将结果存入指定的存储单元中去源程序126.1子程序的设计方法
6.1.4主程序和子程序的参数传递通过堆栈传送参数或参数地址主程序将参数(参数地址)保存在堆栈中,子程序则从堆栈中取出参数(参数地址)例:把内存中字变量num的值,转换为4个用ASCⅡ码表示的16进制数码,串的起始地址为string源程序131500af250200spstring地址Num图1.进入子程序后的堆栈状态001525af0002spstring地址NumLeadx,string地址(IP)flagcxbxdiaxbp(Sp→)bpbp+2bp+4bp+6Bp-6Bp-4Bp-2子程序执行完部分代码后堆栈状态堆栈状态146.1子程序的设计方法
6.1.4主程序和子程序的参数传递例:数的累加源程序Sum地址Count地址Ary地址spMOVAL,SUM地址disicxaxbp(Sp→)bpIPCS[bp+0ah][bp+08h][bp+06h]156.1子程序的设计方法
6.1.4主程序和子程序的参数传递多个模块之间的参数传递问题PUBLIC伪指令格式:PUBLIC符号[,符号]功能:说明其后的符号是全局符号。全局符号能被其他模块引用。EXTRN伪指令格式:EXTRN符号:类型[,符号:类型]功能:说明在本模块中需要引用的、由其他模块定义的符号,即外部符号。16sourcemodule1
extrna:word
Data1segmentbdw?Data1endscode1segmentassumecs:code1,ds:data1Mainprocfarstart:movax,data1movds,ax
…movah,4chint21hMainendpCode1endsEndstartsourcemodule2
publica
Data2segmentadw?Data2endscode2segmentassumecs:code2,ds:data2Mainprocfarstart:movax,data2movds,ax
…movah,4chint21hMainendpCode2endsEndstart注意:应先有public定义,然后才有extrn说明17例:用模块化程序设计方法建立两个模块MOD1.ASM和MOD2.ASM的数据通讯。NAME MOD1
EXTRN DISP:FAR
PUBLIC STR1,N,BUFDATA1 SEGMENT STR1DB 'HOWDOYOUDO?' N=$-STR1BUFDB'THISISANEXAMPLEOFMODULESPROGRAM$'DATA1 ENDSSTACK SEGMENTSTACK DB200DUP(0)STACK ENDSCODE1 SEGMENT ASSUMECS:CODE1,DS:DATA1,SS:STACKSTART: MOV AX,DATA1 MOV DS,AX
CALL DISP MOV AH,4CH INT 21HCODE1 ENDSEND START18NAME MOD2EXTRN STR1:BYTE,BUF:BYTE,N:ABSPUBlIC DISPDATA2 SEGMENTSTR2 DB81DUP(0)DATA2 ENDSCODE2 SEGMENT ASSUMECS:CODE2,ES:DATA2DISP PROC FAR MOV AX,DATA2 MOV ES,AXLEA BX,STR1 MOV CX,N LEA SI,STR2NEXT: MOV AL,[BX] MOV ES:[SI],AL INC BX INC SI LOOP NEXT LEA DX,BUF MOV AH,9 INT 21H RETDISP ENDPCODE2 ENDS END196.1子程序的设计方法
6.1.5增强功能的过程定义伪操作ProcnamePROC[attributesfield][USERregisterlist][,parameterfield]
…
ProcnameENDPAttributesfield(属性字段)包括:
Distance:near、farLanguagetype:说明是那种高级语言的子程序如pascal、c等。
Visibility:说明程序的可见性是private或是public。
Prologue:是一个宏的名字,允许用宏来控制过程的入口或出口有关的代码USER:该字段用来指定用户所需保存和恢复的寄存器表。Parameterfield:参数字段,允许用户指定该过程所用的参数。标识符:类型[,标识符:类型]20DatasegmentArydb10dup(?)Countdb10Sumdb?DataendsStacksegmentparastack‘stack’db100dup(?)StackendsCode1segmentassumecs:code1,ds:data,ss:stackMainprocfarStart:pushdsxorax,axpushax
movax,datamovds,axMovbx,offsetaryPushbxMovbx,offsetcountPushbxMovbx,offsetsumPushbx
Callfarptrproadd
moval,summovdl,almovah,2int21hretMainendpCode1ends21Code2segmentassumecs:code2Proaddprocfar
pushbpmovbp,sppushaxpushcxpushsipushdimovsi,[bp+0ah]movdi,[bp+08h]movcl,[di]movdi,[bp+06h]xoral,alAgain:addal,[si]incsideccljnzagainmov[di],al
popdipopsipopcxpopaxpopbp
ret6ProaddendpCode2endsendstart22Code2segmentassumecs:code2Proaddproc
pascal
user
axcxsidi,
para:word,parc:word,pars:wordmovsi,paramovdi,parcmovcl,[di]movdi,parsxoral,alAgain:addal,[si]incsideccljnzagainmov[di],alretProaddendpCode2endsendstartSum地址Count地址Ary地址(bp)IPCS
(
bp+2)(bp+4)(bp+6)(bp+8)(bp+a)原始bp
para
parsparc局部变量disicxax
(
bp-2)236.1子程序的设计方法
6.1.5增强功能的过程定义伪操作增强功能的过程定义伪操作除了以上功能外,还可以在过程中定义局部变量。局部变量是在过程内部使用的变量,他是在过程调用是在堆栈中建立的,在退出过程是被释放可以用LOCAL定义
LOCAL变量:类型[,变量:类型]Sum地址Count地址Ary地址(bp)IPCS(
bp+2)(bp+4)(bp+6)(bp+8)(bp+a)原始bp(
bp-2)(
bp-4)局部变量246.2子程序的嵌套一个子程序可以作为调用程序去调用另一个子程序,这种情况称为子程序的嵌套嵌套的层次不限,其层次称为嵌套的深度注意堆栈的使用,避免发生因堆栈使用中的问题而造成子程序无法正确返回。也要防止堆栈的上溢和下溢递归子程序:如果一个子程序调用的是子程序的本身就是递归子程序25例5:计算N!=N*(N-1)*(N-2)*……*1--------递归子程序DatasegmentNumdb3Resultdw?DataendsStacksegmentparastack‘stack’ db100dup(?)StackendsCodesegment assumecs:code,ds:data,ss:stackMainprocfarBegin:pushdsxorax,axpushaxmovax,datamovds,ax26movah,0moval,num
callfactormovresult,ax
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 16949采购合同范例
- 企业课程采购合同范例
- 中医内科师承合同范例
- 净水设备批发采购合同范例
- lng采购合同范例
- 他人住宅租赁合同范例
- 兄弟合伙建厂合同范例
- 出售金属挂画合同范例
- 公园收购树苗合同范例
- 共同经营餐厅合同范例
- 检验员培训资料-
- 房屋市政工程施工现场安全风险分级管控与防范措施清单
- 第三方工程评估体系检查表
- 唐僧团队之如何打造团队
- 毕业设计外文文献-Spring Boot
- 六年级下册《生命.生态.安全》全册教案(表格式)
- DB32/T 4444-2023 单位消防安全管理规范-高清版
- 《让孩子成才的秘密》寂静法师
- 水下作业工程监理实施细则(工程通用版范本)
- 小学科学教育探究一研讨教学法
- GB 14930.1-2022食品安全国家标准洗涤剂
评论
0/150
提交评论