资源预览内容
第1页 / 共44页
第2页 / 共44页
第3页 / 共44页
第4页 / 共44页
第5页 / 共44页
第6页 / 共44页
第7页 / 共44页
第8页 / 共44页
第9页 / 共44页
第10页 / 共44页
第11页 / 共44页
第12页 / 共44页
第13页 / 共44页
第14页 / 共44页
第15页 / 共44页
第16页 / 共44页
第17页 / 共44页
第18页 / 共44页
第19页 / 共44页
第20页 / 共44页
亲,该文档总共44页,到这儿已超出免费预览范围,如果喜欢就下载吧!
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,ch6,*,安徽理工大学,计算机科学与技术系,李敬兆,汇编语言,第6章,在程序设计中,可以发现一些,多次无规律重复的程序段或语句序列,。解决此类问题一个行之有效的方法就是将它们设计成,可供反复调用的独立的子程序结构,,以便在需要时调用。在汇编语言中,子程序又称过程,。,调用子程序的程序称为主调程序或主程序,。,第,6,章 子程序结构,11/15/2024,1,ch6,子程序的基本结构包括以下几个部分:,(,1,)子程序定义,(,2,)保护现场和恢复现场,(,3,)子程序体,(,4,)子程序返回,子程序的结构,11/15/2024,2,ch6,子程序的定义是由过程定义伪指令,PROC,和,ENDP,来完成的。其格式如下:,过程名,PROC NEAR/FAR,过程名,ENDP,其中,PROC,表示过程定义开始,,,ENDP,表示过程定义结束。,过程名是过程入口地址的符号表示,。,一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性(,NEAR,和,FAR),。,6.1.1,子程序的定义,6.1,子程序的设计方法,11/15/2024,3,ch6,1.,如果调用程序和过程在,同一代码段,中,则使用,NEAR,属,性,;,MAIN PROC FAR,CALL SUBR1,RET,MAIN ENDP,;,SUBR1 PROC,NEAR,RET,SUBR1 ENDP,MAIN PROC FAR,CALL SUBR1,RET,SUBR1 PROC,NEAR,RET,SUBR1 ENDP,MAIN ENDP,例,6.1,过程嵌套定义,11/15/2024,4,ch6,2.,如果,调用程序和过程不在同一代码段中,,则使用,FAR,属性;,SEGX SEGMENT,SUBT PROC,FAR,RET,SUBT ENDP,CALL SUBT,SEGX ENDS,;,SEGY SEGMENT,CALL SUBT,SEGY ENDS,例,6.2,11/15/2024,5,ch6,6.1.2,子程序的调用和返回,调用,:CALL far/near,ptr,过程名,返回,:RET n,11/15/2024,6,ch6,6.1.3,保护现场和恢复现场,例如:若子程序,PROG,中改变了寄存器,AX,,,BX,,,CX,,,DX,的值,则,可采用如下方法保护和恢复现场。,PROGPROC,PUSHAX,PUSH BX,PUSHCX,;,保护现场,PUSHDX,POPDX,POPCX,POPBX,;,恢复现场,POPAX,RET,;,返回断点处,PROCENDP,11/15/2024,7,ch6,6.1.4,主程序与子程序参数传递方式,1,通过寄存器传送参数,这是最常用的一种方式,使用方便,但参数很多时不能使用这种方法。,例,6.3,十进制到十六进制转换的程序。程序要求从键盘取得一个十进制数,然后把该数以十六进制的形式在屏幕上显示出来。,开始,调用,DECIBIN,调用,CRLF,调用,BINIHEX,调用,CRLF,结束,从键盘取得十进制,数,保存到,BX,中,显示回车和换行,用十六进制形式,显示,BX,中的数,11/15/2024,8,ch6,Decihex,segment,assume,cs:Decihex,Repeat:,call,decibin,call,crlf,call,binihex,call,crlf,MOV AH,4CH,INT 21H,Decibin,proc near,mov,bx,0,Newchar,:,mov,ah,1,int,21h,sub al,30h,jl,exit,cmp,al,9,jg,exit,cbw,xchg,ax,bx,mov,cx,10,mul,cx,xchg,ax,bx,;,每次乘的,add,bx,ax,;,结果在,BX,中,jmp,newchar,Exit:ret,Decibin,endp,11/15/2024,9,ch6,Binihex,proc near,mov,ch,4,Rotate:,mov,cl,4,rol,bx,cl,mov,dl,bl,and dl,0fh,add dl,30h,cmp,dl,3ah,jl,print,add dl,7h,Print:,mov,ah,2,int,21h,dec,ch,jnz,rotate,ret,Binihex,endp,Crlf,proc near,mov,ah,2,mov,dl,odh,int,21h,mov,dl,oah,int,21h,ret,Crlf,endp,Decihex,ends,end repeat,11/15/2024,10,ch6,如果过程和调用过程在同一源文件(同一模块)中,则过程可直接访问模块中的变量。,例,6.4_1,主程序,MAIN,和过程,PROADD,在同一源文件中,要求用过程,PROADD,累加数组的所有元素,并把和(不考虑溢出的可能性)送到指定的存储单元中去,11/15/2024,11,ch6,DATA SEGMENT,ARY,DW 100 DUP(?),COUNT,DW 100,SUM,DW?,DATA ENDS,CODE SEGMENT,MAIN PROC FAR,ASSUME CS:CODE,DS:DATA,START:PUSH DS,SUB AX,AX,PUSH AX,MOV AX,DATA,CALL NEAR PTR PROADD,RET,MAIN ENDP,PROADD PROC NEAR,PUSH AX,PUSH CX,PUSH SI,PUSH DI,LEA SI,ARY,MOV CX,COUNT,XOR AX,AX,NEXT:ADD AX,SI,ADD SI,2,LOOP NEXT,MOV,SUM,AX,POP DI,POP SI,POP CX,POP AX,RET,PROADD ENDP,CODE ENDS,END START,11/15/2024,12,ch6,CODE SEGMENT,ARY DW 100 DUP(?),COUNT DW 100,SUM DW?,NUM DW 100 DUP(?),N DW 100,TOTAL DW?,TABLE DW?,DW?,DW?,MOV TABLE,OFFSET ARY,MOV TABLE+2,OFFSET COUNT,MOV TABLE+4,OFFSET SUN,MOV BX,OFFSET TABLE,CALL PROADD,;,计算,SUM,PROADD PROC NEAR,PUSH AX,PUSH CX,PUSH SI,PUSH DI,PUSH SI,MOV SI,BX,MOV DI,BX+2,MOV CX,DI,MOV DI,BX+4,XOR AX,AX,NEXT:ADD AX,SI,ADD SI,2,LOOP NEXT,MOV,【DI,AX,POP DI,POP SI,POP CX,POP AX,RET,PROADD ENDP,CODE ENDS,END START,3,通过地址表传递参数,例,6.4_2,11/15/2024,13,ch6,4,通过堆栈传递地址或参数,Data segment,Ary,dw,100 dup(?),Count db 100,Sum,dw,?,Data ends,Stack segmen,t,para,stack stack,dw,100 dup(?),tos,label word,Stack ends,Code1 segment,assume cs:code1,ds:data,ss;stack,Main proc far,Start:push,ds,xor,ax,ax,push ax,mov,ax,data,mov,ds,ax,mov,ax,stack,mov,ss,ax,mov,sp,offset,tos,Mov,bx,offset,ary,Push,bx,Mov,bx,offset count,Push,bx,Mov,bx,offset sum,Push,bx,Call far,ptr,proadd,mov,al,sum,mov,dl,al,mov,ah,2,int,21h,ret,Main,endp,Code1 ends,例,6.4_3,11/15/2024,14,ch6,Sum,地址,Count,地址,Ary,地址,sp,di,si,cx,ax,bp,(,Sp),bp,IP,CS,Code2 segment,assume cs:code2,Proadd,proc far,push,bp,mov,bp,sp,push ax,push,cx,push,si,push,di,mov,si,bp+0ah,mov,di,bp+08h,mov,cl,di,mov,di,bp+06h,xor,al,al,Again:add al,si,inc,si,dec,cl,jnz,again,mov,di,al,pop,di,pop,si,pop,cx,pop ax,pop,bp,ret 6,Proadd,endp,Code2 ends,end start,bp+0ah,bp+08h,bp+06h,Sp,Sp,Sp,Sp,Sp,11/15/2024,15,ch6,(1)PUBLIC,伪指令,格式:,PUBLIC,符号,,符号,功能:说明其后的符号是全局符号。全局符号能被其他模块引用。,(,局部符号),(2)EXTRN,伪指令,格式:,EXTRN,符号:类型,,符号:类型,功能:说明在本模块中需要引用的、由其他模块定义的符号,即外部符号,。,5,多个模块之间的参数传送问题,11/15/2024,16,ch6,;source module 1,extrn,var2:word,lab2:far,public var1,lab1,Data1 segment,var1 db?,var3,dw,?,var4,dw,?,Data1 ends,code1 segment,assume cs:code1,ds:data1,Main proc far,start:,mov,ax,data1,mov,ds,ax,lab1,:,mov,ah,4ch,int,21h,Main,endp,Code1 ends,End start,;,source module 2,extern var1:byte,var4:word,public var2,Data2 segment,var2,dw,?,var3,dw,?,Data2 ends,code2 segment,assume cs:code2,ds:data2,Main proc far,start:,mov,ax,data2,mov,ds,ax,mov,ah,4ch,int,21h,Main,endp,Code2 ends,End start,注意:,应先有,public,定义,然后才有,extrn,说明,;,source module 3,extern lab2:far,public lab2,lab3,Data2 segment,var2,dw,?,var3,dw,?,Data2 ends,code3 segment,assume cs:code3,Lab2:,.,Lab3:,.,Code3 ends,End,例,6.5,多个模块间的参数共享,11/15/2024,17,ch6,;,Source model 1,EXTERN,proadd,:far,DATA SEGMENT,common,ARY,DW 100 DUP(?),COUNT,DW 100,SUM,DW?,DATA ENDS,CODE1 SEGMENT,MAIN PROC FAR,ASSUME CS:CODE1,DS:DATA,START:,PUSH DS,SUB AX,AX,PUSH AX,MOV AX,DATA,CALL far,ptr
点击显示更多内容>>

最新DOC

最新PPT

最新RAR

收藏 下载该资源
网站客服QQ:3392350380
装配图网版权所有
苏ICP备12009002号-6