汇编语言程序设计第6章子程序结构_第1页
汇编语言程序设计第6章子程序结构_第2页
汇编语言程序设计第6章子程序结构_第3页
汇编语言程序设计第6章子程序结构_第4页
汇编语言程序设计第6章子程序结构_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第六章第六章 子程序结构子程序结构 过程定义伪操作过程定义伪操作 子程序的调用与返回子程序的调用与返回 保存与恢复寄存器保存与恢复寄存器 子程序的参数传送子程序的参数传送 子程序的嵌套与递归子程序的嵌套与递归21. 过程定义伪操作过程定义伪操作 过程名过程名 PROC PROC NEARNEAR ( ( FARFAR ) ) 过程名过程名 ENDPENDP(1 1)NEARNEAR属性:调用程序和子程序在同一代码段中属性:调用程序和子程序在同一代码段中 (段内调用)(段内调用)(2 2)FARFAR属性:调用程序和子程序不在同一代码段中属性:调用程序和子程序不在同一代码段中 (段间调用)(段

2、间调用).3code segmentcode segment main proc farmain proc far call call subr1subr1 ret retmain endpmain endpsubr1subr1 proc proc nearnear retretsubr1subr1 endp endpcode endscode endssegx segmentsegx segmentsubtsubt proc proc farfar retretsubtsubt endp endp callcall subtsubt segx endssegx endssegy segmen

3、tsegy segment callcall far ptr far ptr subtsubt segy endssegy ends4子程序调用:子程序调用:隐含使用堆栈保存返回地址隐含使用堆栈保存返回地址 callcall nearnear ptr subp ptr subp (1) 保存返回地址保存返回地址 (2) 转子程序转子程序 callcall farfar ptr subp ptr subp (1) 保存返回地址保存返回地址 (2) 转子程序转子程序子程序返回:子程序返回:retret2. 子程序的调用与返回子程序的调用与返回 (SP) (IP)(IP)(CS)(SP) 53. 保

4、存与恢复寄存器保存与恢复寄存器subtsubt proc far proc far push ax push ax push bx push bx push cx push cx push dx push dx pop dx pop dx pop cx pop cx pop bx pop bx pop ax pop ax ret retsubtsubt endp endp6(1) 通过寄存器传送参数通过寄存器传送参数(2) 通过存储器传送参数通过存储器传送参数(3) 通过地址表传送参数地址通过地址表传送参数地址(4) 通过堆栈传送参数或参数地址通过堆栈传送参数或参数地址(5) 多个模块之间的参

5、数传送多个模块之间的参数传送4. 子程序的参数传送子程序的参数传送7例:十六进制到十进制的转换(例:十六进制到十进制的转换(通过寄存器传送参数通过寄存器传送参数)hexidec segment ; 1610 assume cs: hexidec main proc farstart: push ds sub ax, ax push axrepeat: call hexibin ; 162 call crlf call binidec ; 210 call crlf jmp repeat retmain endphexidec ends end start8hexibin proc nearhe

6、xibin proc near mov bx, 0mov bx, 0newchar: mov ah, 1 int 21h sub al, 30h jl exit cmp al, 10 jl add_to sub al, 27h cmp al, 0ah jl exit cmp al, 10h jge exitadd_to: mov cl, 4 shl bx, cl mov ah, 0 add bxbx, ax jmp newchar exit: rethexibin endphexibin endpbinidec proc nearbinidec proc near mov cx, 10000d

7、 call dec_divcall dec_div mov cx, 1000d call dec_divcall dec_div mov cx, 100d call dec_divcall dec_div mov cx, 10d call dec_divcall dec_div mov cx, 1d call dec_divcall dec_div retbinidec endpbinidec endpdec_div proc neardec_div proc near mov ax, mov ax, bxbx mov dx, 0 mov dx, 0 div cx div cx mov mov

8、 bxbx, dx, dx mov dl, al mov dl, al add dl, 30h add dl, 30h mov ah, 2 mov ah, 2 int 21h int 21h ret retdec_div endpdec_div endp 1 a b 5 31 61 62 359例:累加数组中的元素(例:累加数组中的元素(通过存储器传送参数通过存储器传送参数)data segment ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ?data endscode segmentmain proc far assume cs:code,

9、ds:data mov ax, data mov ds, ax call proaddcall proadd mov ax,4c00h int 21hmain endpcode ends end mainproadd proc nearproadd proc near push ax push cx push si lea si, aryary mov cx, countcount xor ax, axnext: add ax, si add si, 2 loop next mov sumsum,ax pop si pop cx pop ax retproadd endpproadd endp

10、10如果数据段定义如下:如果数据段定义如下:data segmentdata segment ary dwary dw 1,2,3,4,5,6,7,8,9,10 1,2,3,4,5,6,7,8,9,10 count dwcount dw 10 10 sum dwsum dw ? ? ary1 dwary1 dw 10,20,30,40,50,60,70,80,90,100 10,20,30,40,50,60,70,80,90,100 count1 dwcount1 dw 10 10 sum1 dwsum1 dw ? ?data endsdata ends 如果直接访问内存变量,那么累加如果直接

11、访问内存变量,那么累加数组数组aryary和和数组数组ary1ary1中的元素不能用同一个子程序中的元素不能用同一个子程序 proaddproadd。11例:累加数组中的元素(例:累加数组中的元素(通过地址表传送参数地址通过地址表传送参数地址)data segment ary dw 10,20,30,40,50,60,70,80,90,100 count dw 10 sum dw ? table dw 3 dup (?) ; 地址表data endscode segmentmain proc far assume cs:code, ds:data push ds sub ax, ax push

12、 ax mov ax, data mov ds, ax mov table, offset ary mov table+2, offset count mov table+4, offset sum mov bx, offset table call proadd retmain endp 12proadd proc nearproadd proc near push ax push cx push si push di mov si, bx mov di, bx+2 mov cx, di mov di, bx+4 xor ax, axnext: add ax, si add si, 2 lo

13、op next mov di,ax pop di pop si pop cx pop ax retproadd endpproadd endpcode ends end main 30d 40d 50d 60d 70d 80d 90d100d 10d ary 20d 10dcountsumtable00000000001400140016001600180018000000000014001400160016(bx)(bx)(si)(si)(di)(di)550d550d13例:累加数组中的元素(例:累加数组中的元素(通过堆栈传送参数地址通过堆栈传送参数地址)data segmentdata

14、segment ary dw 10,20,30,40,50,60,70,80,90,100 ary dw 10,20,30,40,50,60,70,80,90,100 count dw 10 count dw 10 sum dw ? sum dw ?data endsdata endsstack segment stack segment dw 100 dup (?) dw 100 dup (?) tos label word tos label wordstack endsstack ends14code1 segmentmain proc far assume cs:code1, ds:d

15、ata, ss:stackstart: mov ax, stack mov ss, ax mov sp, offset tos mov ax, data mov ds, ax mov bx, offset ary push bx mov bx, offset count push bx mov bx, offset sum push bx call far ptr proadd mov ax, 4c00h int 21hmain endpcode1 ends15code2 segment assume cs:code2proadd proc farproadd proc far push bp

16、push bp mov mov bpbp, sp, sp push ax push cx push si push di mov si,bpbp+0ah mov di,bpbp+8 mov cx,di mov di,bpbp+6code2 ends end start xor ax, axnext: add ax, si add si, 2 loop next mov di,ax pop di pop si pop cx pop ax pop bp ret 6ret 6proadd endpproadd endp(ip)(cs)sumsumcountcountarrayarray (di) (

17、si) (cx) (ax)(sp)(bpbp)(bp) (bpbp)+0ah (bpbp)+8 (bpbp)+6tos16多个模块之间的参数传送:多个模块之间的参数传送:局部符号:局部符号:在本模块中定义,在本模块中引用的符号在本模块中定义,在本模块中引用的符号外部符号:外部符号:在某一模块中定义,在另一模块中引用的符号在某一模块中定义,在另一模块中引用的符号 PUBLIC PUBLIC 符号符号 EXTRN EXTRN 符号符号: :类型类型 extrn proadd : farextrn proadd : far code1 segmentcode1 segmentstart:start:

18、 call far ptr proadd call far ptr proadd code1 endscode1 ends end start end start; proadd1.asmpublic proaddpublic proadd code2 segmentcode2 segmentproadd proc farproadd proc far ret retproadd endpproadd endpcode2 endscode2 ends end end ; proadd2.asm17例:例:; proadd1.asmextrn proadd : farextrn proadd :

19、 fardata segment common ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ?data endscode1 segment main proc far assume cs:code1, ds:datastart: mov ax, data mov ds, ax call far ptr proadd mov ah, 4ch int 21hmain endpcode1 ends end start18; proadd2.asmpublic proaddpublic proadddata segment common ary dw

20、1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ?data ends code2 segment proadd proc far assume cs:code2,ds:data mov ax, data mov ds, ax push ax push cx push si lea si, ary mov cx, count xor ax, ax next: add ax, si add si, 2 loop next mov sum,ax pop si pop cx pop ax retproadd endpcode2 ends end19子程序的嵌套:子程序的

21、嵌套: 主程序主程序 子程序子程序A A 子程序子程序B B递归子程序:递归子程序:n! n ( n - 1 ) ( n - 2 ) 1 3! 3 21= 65. 子程序的嵌套与递归调用子程序的嵌套与递归调用 call call proc_Aproc_Aproc_Aproc_A call call proc_Bproc_BCall Call proc_Aproc_Aretretproc_Bproc_B retret20例:计算例:计算 n!frame strucframe struc save_bp dw ? save_bp dw ? save_cs_ip dw 2 dup(?) save_c

22、s_ip dw 2 dup(?) n dw ? n dw ? result_addr dw ? result_addr dw ?frame endsframe ends;-data segmentdata segment n_v dw 3 n_v dw 3 result dw ? result dw ?data endsdata ends;-stack segmentstack segment dw 128 dup (?) dw 128 dup (?) tos label word tos label wordstack endsstack endsmov ax, bp . nmov bx,

23、bp .result_addr 0!=1 n!=n(n-1)!21code segmentcode segmentmain proc farmain proc far assume cs:code, ds:data, ss:stack assume cs:code, ds:data, ss:stackstart:start: mov ax, stack mov ax, stack ;用户堆栈地址;用户堆栈地址 mov ss, axmov ss, ax mov sp, offset tos mov sp, offset tos push ds push ds ;保存返回;保存返回DOSDOS地址

24、地址 sub ax, axsub ax, ax push ax push ax mov ax, data mov ax, data ;数据段地址;数据段地址 mov ds, axmov ds, ax mov bx, offset result mov bx, offset result ; ; 结构数据入栈结构数据入栈 push bxpush bx mov bx, n_v mov bx, n_v push bx push bx call far ptr factcall far ptr fact ret retmain endpmain endpcode endscode ends22code

25、1 segment assume cs:code1fact proc farfact proc far push bp mov bp, sp push bx push ax mov bx, bp.result_addr mov ax, bp.nmov ax, bp.n cmp ax, 0cmp ax, 0 je done je done push bx dec ax push ax call far ptr factcall far ptr fact mov bx, bp.result_addrmov bx, bp.result_addr mov ax, bx mov ax, bx mul b

26、p.n mul bp.n jmp short returndone: mov ax,1done: mov ax,1return: mov bx, axmov bx, ax pop ax pop bx pop bp ret 4fact endpfact endpcode1 ends (AX) (BX) (BP)CODE中的(IP)CODE中的(CS) 3 3RESULT的地址第第1 1帧帧 (AX) (BX) (BP)CODE1中的(IP)CODE1中的(CS) 2 2RESULT的地址第第2 2帧帧 (AX) (BX) (BP)CODE1中的(IP)CODE1中的(CS) 1 1RESULT的地址第第3 3帧帧 (AX) (BX) (BP)CODE1中的(IP)CODE1中的(CS) 0 0RESULT的地址第第4 4帧帧00FA00FA00F200F200E400E400D600D600C800C8000000F200E400D623fact proc nearfact proc near push ax push ax push bp push

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论