参数与结果传递
- 子程序:计算N的3次方
cube: mov ax,bx
mul bx
mul bx
ret
- 完成源码 : 计算data段中第一组数据的3次方 结果保存在后面一组dword单元中
assume cs:code
data segment
dw 1,2,3,4,5,6,7,8
dd 0,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
mov ax,4c00H
int 21H
cube: mov ax,bx
mul bx
mul bx
ret
code ends
end start
- 调用者将参数送入参数寄存器,从结果寄存器中取到返回值
- 子程序从参数寄存器中读到参数,将返回值送入结果寄存器
批量数据的传递
- 将批量数据放到内存,将所在内存空间的首地址放到寄存器
- 子程序:将 ds:si 所指单元中的字母转化为大写
capital: and byte ptr [si],11011111B
inc si
loop capital
ret
- 完整源码:将一个全是字母的字符串转化为大写
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
- 循环次数就是字符串长度
编写子程序的标准框架
用栈来保存寄存器中的内容
- 在子程序的开始将子程序中所有用到的寄存器入栈
- 在子程序返回前再恢复
子程序开始: 子程序使用的寄存器入栈
子程序内容
子程序中使用的寄存器出栈
返回(ret、retf)
子程序
- 说明:将一个全是字母,以0结尾的字符串,转化为大写
- 参数:ds:si 指向的字符串的首地址
- 结果:没有返回值
capital: push cx
push si
change: mov cl,[si]
mov ch,0
jcxz ok
and byte ptr [si],11011111B
inc si
jmp short change
ok: pop si
pop cx
ret
完整源码
assume cs:code
data segment
db 'word',0
db 'unix',0
db 'wind',0
db 'good',0
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov cx,4
s: mov si,bx
call capital
add bx,5
loop s
mov ax,4c00h
int 21H
capital: push cx
push si
change: mov cl,[si]
mov ch,0
jcxz ok
and byte ptr [si],11011111B
inc si
jmp short change
ok: pop si
pop cx
ret
code ends
end start