zl程序教程

您现在的位置是:首页 >  其它

当前栏目

二十、子程序设计(函数)

函数 程序设计 二十
2023-09-14 09:13:26 时间

1. 模块化程序设计

把具有一定功能的程序段封装成子程序,以供它人调用。

参数:告诉子程序将要处理哪些数值。
结果:子程序运算后的结果值。

;加法运算
assume cs:code,ds:data,ss:stack
data segment
data ends

stack segment
    dw 256 dup (0H)
stack ends

code segment
start:
    mov ax,stcak
    mov ss,ax
    mov sp,60H

    mov ax,10H
    mov bx,11H
    call s0

    mov ax,12H
    mov bx,31H
    call s0

    mov ax,bx
    mov ax,bx

;功能:计算两个数值相加后的结果
;参数:AX与BX寄存器中存放加数
;结果:cx寄存器用于存放结果
s0:
    mov cx,ax
    add cx,bx
    ret
 
    mov ax,4c00H
    int 21H
code ends
end start

 

2. 子程序数据传递

a 通过寄存器传递
b 通过内存传递
c 通过栈传递

;1111H + 2222H + 0333H + 0001H + 0002H
assume cs:code,ds:data,ss:stack
data segment
    dw 256 dup (0H)
data ends

stack segment
    dw 256 dup (0H)
stack ends

code segment
start:
    mov ax,stcak
    mov ss,ax
    mov sp,60H

    mov ax,data
    mov ds,ax

    mov bx,0000H
    mov word ptr ds:[bx+0000H],1111H
    mov word ptr ds:[bx+0002H],2222H
    mov word ptr ds:[bx+0004H],0333H
    mov word ptr ds:[bx+0006H],0001H
    mov wprd ptr ds:[bx+0008H],0002H

    call s0

    nop
    nop

;功能:计算5个连续数值的和
;参数:通过内存存储参数,起始地址值在bx寄存器中
;结果:cx寄存器是运算结果
s0:
    mov cx,ds:[bx+0000H]
    add cx,ds:[bx+0002H]
    add cx,ds:[bx+0004H]
    add cx,ds:[bx+0006H]
    add cx,ds:[bx+0008H]
    ret
     
    mov ax,4c00H
    int 21H
code ends
end start

 

3. 子程序安全调用

子程序的设计要以保持寄存器值的平衡,栈空间的平衡为原则。

函数执行前将参数使用的寄存器源数据保存push栈,函数结束后再pop栈恢复源寄存器数据。

assume cs:code,ds:data,ss:stack
data segment
    dw 256 dup (0H)
data ends

stack segment
    dw 256 dup (0H)
stack ends

code segment
start:
    mov ax,stcak
    mov ss,ax
    mov sp,60H

    mov ax,data
    mov ds,ax

    mov ax,0011H
    mov bx,0022H
    call s0

    nop
    nop

;甲编写代码
;xx,bx作为参数,cx作为返回值
s0:
    push ax
    push bx
    push dx

    mov cx,ax
    add cx,bx

    ;注意出栈顺序
    pop dx
    pop bx
    pop ax    

    ret
     
    mov ax,4c00H
    int 21H
code ends
end start