組合語言 子程式呼叫

2021-10-06 12:25:48 字數 2250 閱讀 5244

不是很常用的

子程式返回指令

說明:根據段內和段間、有無引數,具體分成4種情況

(1) ret ;無引數返回

(2) ret n ;有引數返回 n引數的作用

需要彈出call指令壓入堆疊的返回位址

(3)段內返回——偏移位址ip出棧

ip←ss:[sp], sp←sp+2

(4)段間返回——偏移位址ip和段位址cs出棧

ip←ss:[sp], sp←sp+2

cs←ss:[sp], sp←sp+2

使用過程定義語句:

過程名 proc

…過程名 endp

主程式和子程式直接採用同乙個變數名共享同乙個變數,實現引數的傳遞.不同模組間共享時,需要宣告

data segment

count equ 5

array db 12h,25h,0f0h,0a3h,03

result db ?

data ends

code segment

assume cs:code, ds: data

start:mov ax,data

mov ds,ax

call check

code ends

end start

check proc

…… lea bx,array

……check endp

主程式將子程式的入口引數壓入堆疊,子程式從堆疊中取出引數

子程式將出口引數壓入堆疊,主程式彈出堆疊取得它們

多用於陣列操作

bcd2bin proc far

push cx

mov ch,al

and ch,0fh

mov cl,4

shr al,cl

mov cl,10

mul cl

add al,ch

pop cx

retbcd2bin endp

資料段定義兩個字型陣列,程式設計序實現陣列分別求和(不計溢位),要求用子程式實現求和。

解:

data segment

ary1 dw 100 dup(?) ; 定義陣列1

sum1 dw ?;和

ary2 dw 100 dup(?) ;定義陣列2

sum2 dw ?;和

data ends

code segment

assume cs:code,ds:data

start: mov ax, data

mov ds, ax

lea si, ary1 ;陣列1首位址,入口引數

mov cx, (sum1-ary1)/2 ;陣列1加操作次數,入口引數(陣列1的長度即length ary1。/2因為dw)

call sub_sum ;呼叫求和子程式

mov sum1,ax ;陣列1之和送sum1

lea si, ary2 ;陣列2首位址,入口引數

mov cx, (sum2-ary2)/2 ;陣列2加操作次數,入口引數

call sub_sum ;呼叫求和子程式

mov sum2,ax ;陣列2之和送sum2

mov ah, 4ch

int 21h

;子程式名 sub_sum

;功能:完成乙個陣列中元素的相加

;出口引數:相加結果存在ax中

;占用暫存器:ax

sub_sum proc near ;子程式

xor ax, ax ;ax清0

l1: add ax, word ptr[si] ;加陣列元素

inc si

inc si ;以字為位址,si要加2

loop l1 ;cx-1

ret ;子程式返回

sub_sum endp

code ends

end start

組合語言 子程式

舉例 子程式呼叫指令call 格式為 call 子程式名 call相當於jmp 子程式名 相當於 標號 子程式執行完返回到call下一句的語句執行 在子程式中用ret 返回 子程式名proc屬性 far,near 子程式名 endp 如果主程式是被執行的第乙個程式,屬性應為far 主程式 let0 ...

組合語言showStr測試子程式

2017.4.23 name showstr fuction 在指定的位置,用指定的顏色,顯示乙個用0結束的字串 test code 在螢幕的8行3列,用綠色顯示data段中的字串 eg init mov dh,8 8行 mov dl,3 3列 mov cl,2 字元屬性 2 黑底綠色無高亮無閃爍 ...

組合語言 遞迴子程式實現階乘

最近在弄一門課程 組合語言 的複習,覺得這個部分的內容,對於回過頭來理解以往學習的高階語言還是很有幫助的。例題 階乘函式,對於任乙個大於等於0的正整數n,其函式值定義為 fact n 1 當n 0時 fact n n fact n 1 當n 0時 其演算法為 1 測試n 0嗎?是,則令fact n ...