资源预览内容
第1页 / 共25页
第2页 / 共25页
第3页 / 共25页
第4页 / 共25页
第5页 / 共25页
第6页 / 共25页
第7页 / 共25页
第8页 / 共25页
第9页 / 共25页
第10页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1,第六章 子程序结构, 过程定义伪操作 子程序的调用与返回 保存与恢复寄存器 子程序的参数传送 子程序的嵌套与递归,2,1. 过程定义伪操作,3,4,子程序调用:隐含使用堆栈保存返回地址 call near ptr subp (1) 保存返回地址 (2) 转子程序 call far ptr subp (1) 保存返回地址 (2) 转子程序 子程序返回:ret,2. 子程序的调用与返回,5,3. 保存与恢复寄存器,subt proc far push ax push bx push cx push dx pop dx pop cx pop bx pop ax ret subt endp,6,(1) 通过寄存器传送参数 (2) 通过存储器传送参数 (3) 通过地址表传送参数地址 (4) 通过堆栈传送参数或参数地址 (5) 多个模块之间的参数传送,4. 子程序的参数传送,7,例:十六进制到十进制的转换(通过寄存器传送参数) hexidec segment ; 1610 assume cs: hexidec main proc far start: push ds sub ax, ax push ax repeat: call hexibin ; 162 call crlf call binidec ; 210 call crlf jmp repeat ret main endp hexidec ends end start,8,1 a b 5 31 61 62 35,9,例:累加数组中的元素(通过存储器传送参数) data segment ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ? data ends code segment main proc far assume cs:code,ds:data mov ax, data mov ds, ax call proadd mov ax,4c00h int 21h main endp code ends end main,proadd proc near 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 ret proadd endp,10,如果数据段定义如下: data segment ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ? ary1 dw 10,20,30,40,50,60,70,80,90,100 count1 dw 10 sum1 dw ? data ends,如果直接访问内存变量,那么累加数组ary 和数组ary1中的元素不能用同一个子程序 proadd。,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 ends code segment main proc far assume cs:code, ds:data push ds sub ax, ax push 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 ret main endp,12,proadd 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, 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 main,550d,13,例:累加数组中的元素(通过堆栈传送参数地址) data segment ary dw 10,20,30,40,50,60,70,80,90,100 count dw 10 sum dw ? data ends stack segment dw 100 dup (?) tos label word stack ends,14,code1 segment main proc far assume cs:code1, ds:data, ss:stack start: 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 21h main endp code1 ends,15,(ip) (cs) sum count array,(bp)+0ah,16,多个模块之间的参数传送: 局部符号:在本模块中定义,在本模块中引用的符号 外部符号:在某一模块中定义,在另一模块中引用的符号 PUBLIC 符号 EXTRN 符号:类型,17,例:,; proadd1.asm extrn proadd : far data segment common ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ? data ends code1 segment main proc far assume cs:code1, ds:data start: mov ax, data mov ds, ax call far ptr proadd mov ah, 4ch int 21h main endp code1 ends end start,18,; proadd2.asm public proadd data segment common ary dw 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 ret proadd endp code2 ends end,19,子程序的嵌套: 主程序 子程序A 子程序B,递归子程序:n! n ( n - 1 ) ( n - 2 ) 1 3! 3 21= 6,5. 子程序的嵌套与递归调用,20,例:计算 n! frame struc save_bp dw ? save_cs_ip dw 2 dup(?) n dw ? result_addr dw ? frame ends ;- data segment n_v dw 3 result dw ? data ends ;- stack segment dw 128 dup (?) tos label word stack ends,0!=1 n!=n(n-1)!,21,code segment main proc far assume cs:code, ds:data, ss:stack start: mov ax, stack ;用户堆栈地址 mov ss, ax mov sp, offset tos push ds ;保存返回DOS地址 sub ax, ax push ax mov ax, data ;数据段地址 mov ds, ax mov bx, offset result ; 结构数据入栈 push bx mov bx, n_v push bx call far ptr fact ret main endp code ends,22,code1 segment assume cs:code1 fact proc far push bp mov bp, sp push bx push ax mov bx, bp.result_addr mov ax, bp.n cmp ax, 0 je done push bx dec ax push ax call far ptr fact mov bx, bp.result_addr mov ax, bx mul bp.n jmp short return done: mov ax,1 return: mov bx, ax pop ax pop bx pop bp ret 4 fact endp code1 ends,23,fact proc near push ax push bp mov bp, sp mov ax, bp+6 cmp ax, 0 jne fact1 inc ax jmp exit fact1: dec ax push ax call fact pop ax mul word ptrbp+6 exit: mov bp+6, ax pop bp pop ax ret fact endp,例:计算n!,主程序:,24,例:将字符串反序输出,revers proc near push ax push bx push dx push bp mov bp,sp mov bx,bp+10 mov al,bx cmp al,$ jne re_call jmp return re_call: inc bx push bx call revers pop bx mov dl,bx mov ah,2 int 21h return: pop bp pop dx pop bx pop ax ret revers endp,mov bx, offset str push bx call revers pop bx mov dl, bx mov ah, 2 int 21h,主程序:,str db happy!,$,25,第六章作业,Page 240 6.3 6.4 6.7
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号