模块化程序设计
assume cs:code
code segment
main:
...
call sub1 ;调用子程序sub1
mov ax,4c00h
int 21h
sub1:
... ;子程序sub1开始
call sub2 ;调用子程序sub1
ret ;子程序返回
sub2:
... ;子程序sub2开始
ret ;子程序返回
code ends
end main
- 调用子程序:call
- 指令返回:ret指令
- 子程序:根据提供的参数处理一定的事务,处理后,将结果(返回值)提供给调用者。
参数和结果传递的问题
- 问题:根据提供的N,计算N的3次方。
- 考虑
- 我们将参数N存储在什么地方?
- 计算得到的数值,存储在什么地方?
- 方案
- 用寄存器传递参数
- 用内存单元进行参数传递
- 用栈传递参数
#include <stdio.h>
int cube(int x);
int main(){
printf("%d\n",cube(2));
return 0;
}
int cube(int x){
int f;
f=x*x;
f=f*x;
return f;
}
用寄存器来存储参数和结果是最常使用的方法
-
问题:根据提供的N,计算N的3次方。
-
考虑
- 我们将参数N存储在什么地方?
- 计算得到的数值,存储在什么地方?
-
用寄存器传递参数
- 参数放至dx中,即(bx)=N
- 子程序中用多个mul指令计算N^3
- 将结果放到dx和ax中:(dx:ax)=N^3
assume cs:code
data segment
dw 1,2,3,4,5,6,7,8
dd o,0,0,0,0,0,0,0
data ends
code segment
start:mov ax,data
mov ds,ax
mov si,0
mov di,16
;循环处理
mov cx,8
s:mov bx,[si]
call cube
mov [di],ax
mov [di].2,dx
add si,2
add di ,4
loop s
;汇编子程序
cube:mov ax,bx
mul bx
mul bx
ret
mov ax,4c00h
int 21h
code ends
end start
用内存单元批量传递数据
-
方案
- 将批量数据放到内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序。
- 对于具有批量数据的返回结果,也可用同样的方法。
-
编程:将data段中的字符串转化为大写
assume cs:code
data segment
db 'conversation'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov cx,12
call capital
mov ax,4c00h
int 21h
capital:
and byte ptr [si],11011111b
inc si
loop capital
ret
code ends
end start
用栈传递参数
-
原理:由调用者将需要传递给子程序的参数压入栈中,子程序从栈中取得参数
-
任务∶计算( a-b )^3 ,a、b为word 型数据。
- 进入子程序前,参数a、b入栈
- 调用子程序,将使栈顶存放IP
- 结果:(dx : ax)= ( a-b )^3
-
例∶设a=3b-1,计算:(a-b)^3
mov ax ,1
push ax
mov ax,3
push ax
call difcube
difcube : push bp
mov bp,sp
mov ax,[bp+4];将栈中a的值送入ax中
sub ax,[bp +6];减栈中b的值
mov bp,ax
mul bp
mul bp
pop bp
ret 4
;指令ret n的含义
;pop ip
;add sp,n