參數(shù)與結(jié)果傳遞
計(jì)算data段中第一組數(shù)據(jù)的3次方 結(jié)果保存在后面一組dword單元中.png
cube: mov ax,bx
mul bx
mul bx
ret
- 完成源碼 : 計(jì)算data段中第一組數(shù)據(jù)的3次方 結(jié)果保存在后面一組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
-
調(diào)用者將參數(shù)送入參數(shù)寄存器,從結(jié)果寄存器中取到返回值
-
子程序從參數(shù)寄存器中讀到參數(shù),將返回值送入結(jié)果寄存器
批量數(shù)據(jù)的傳遞
- 將批量數(shù)據(jù)放到內(nèi)存,將所在內(nèi)存空間的首地址放到寄存器
將一個全是字母的字符串轉(zhuǎn)化為大寫.png
- 子程序:將 ds:si 所指單元中的字母轉(zhuǎn)化為大寫
capital: and byte ptr [si],11011111B
inc si
loop capital
ret
- 完整源碼:將一個全是字母的字符串轉(zhuǎn)化為大寫
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
編寫子程序的標(biāo)準(zhǔn)框架
用棧來保存寄存器中的內(nèi)容
- 在子程序的開始將子程序中所有用到的寄存器入棧
- 在子程序返回前再恢復(fù)
子程序開始: 子程序使用的寄存器入棧
子程序內(nèi)容
子程序中使用的寄存器出棧
返回(ret附鸽、retf)
子程序
- 說明:將一個全是字母,以0結(jié)尾的字符串,轉(zhuǎn)化為大寫
- 參數(shù):ds:si 指向的字符串的首地址
- 結(jié)果:沒有返回值
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結(jié)尾的字符串,轉(zhuǎn)化為大寫
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