把具有一定功能的程式段封裝成子程式,以供它人呼叫。
引數:告訴子程式將要處理哪些數值。
結果:子程式運算後的結果值。
;加法運算
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
retmov ax,4c00h
int 21h
code ends
end start
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
nopnop
;功能:計算5個連續數值的和
;結果: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]
retmov ax,4c00h
int 21h
code ends
end start
子程式的設計要以保持暫存器值的平衡,棧空間的平衡為原則。
函式執行前將引數使用的暫存器源資料儲存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
nopnop
;甲編寫**
;xx,bx作為引數,cx作為返回值
s0: push ax
push bx
push dx
mov cx,ax
add cx,bx
;注意出棧順序
pop dx
pop bx
pop ax
retmov ax,4c00h
int 21h
code ends
end start
子程式設計
知識提要 掌握子程式的定義語句 過程名 proc near far 過程體ret 過程名 endp 其中過程名的命名方法與變數名相同,同一源程式中不能有相同的過程名.proc為過程定義開始的偽指令,endp為過程定義結束偽指令,且proc endp必須配對使用。配對的proc endp前面的過程名應...
子程式設計
子程式設計時 push bp mov bp,sp sub sp,2 再push其他需要儲存的暫存器,這樣可以不受儲存要暫存器個數的影響,用 bp 4 定位到第乙個引數 且釋放區域性變數空間時使用 mov sp,bp 即可。巨集呼叫中的引數如果有小於 符號,需要轉義,寫為 定式 if while do...
函式式程式設計(四) 函式組合 函子
純函式和柯里化很容易寫出洋蔥 h g f x 就是乙個函式鑲嵌另乙個函式,多重組合,最終實現我們想要的功能,就像下面這個洋蔥一樣 函式組合,就是利用多個函式,把細粒度的函式重新組合生成乙個新的函式,從而實現我們想要的邏輯。比如 獲取陣列的最後乙個元素再轉換成大寫字母,toupper first re...