參數與結果傳遞
計算data段中第一組數據的3次方 結果保存在后面一組dword單元中.png
- 子程序:計算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
- 調用者將參數送入參數寄存器,從結果寄存器中取到返回值
- 子程序從參數寄存器中讀到參數,將返回值送入結果寄存器
批量數據的傳遞
- 將批量數據放到內存,將所在內存空間的首地址放到寄存器
將一個全是字母的字符串轉化為大寫.png
- 子程序:將 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
完整源碼
將一個全是字母,以0結尾的字符串,轉化為大寫
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