在模組化程式設計的過程中,用子函式的方式是很常見的一種方式,組合語言中必然會存在這樣的方式
在模組化程式設計中必不可少的的當然是傳入的引數和返回的引數
在這裡先總結一下:
1、是單引數的傳遞和但引數的返回
這種傳遞方式的基本原則就是用暫存器來傳遞引數,基本格式:主函式將引數送入引數暫存器,子函式從引數暫存器中讀取資料;子函式將得到的結果送入結果暫存器中,主函式將結果暫存器中的資料取出來使用
下面舉個例子,計算2^3:
assume cs:code
code segment
start: mov si, 2 ;si作為引數暫存器
call math ;呼叫子函式math
mov ax, 4c00h
int 21h
math: mov ax, si
mov bx, si
mul bx
mul bx ;mul計算完之後,這裡進行的是16位乘法,所以得到的結果高位存放在dx暫存器中,低位存放在ax中,所以這裡的ax和dx都是結果暫存器
ret ;回到主函式中去
code ends
end start
這裡的si就是引數暫存器,dx和ax都是結果暫存器
2、多引數的傳遞
用暫存器的方法傳遞資料肯定是不靠譜的,畢竟暫存器的數量很少,所以在多引數的傳遞時,要用別的辦法去代替
原則:先在記憶體中開闢兩個空間,乙個用來存放需要傳遞的引數,另乙個用來存放子函式計算得到的結果
下面舉乙個例子,例子的內容是:用子函式計算2和3的平方,然後在主函式中可以呼叫計算結果放入ax和dx中,要求ax得到的是2^2=4,dx得到的是3^2=9
assume cs:code, ds:data_in, es:data_out
data_in segment ;作為輸入引數開闢的空間
db 2, 3
data_in ends
data_out segment ;作為輸出結果開闢的空間
dw 8 dup(0)
data_out ends
code segment
start: mov ax, data_in
mov ds, ax
mov ax, data_out
mov es, ax
mov cx, 2
mov si, 0
mov di, 0
call math ;呼叫子函式
mov ax, es:[0] ;將子函式得到的結果按照要求放在暫存器ax和dx中
mov dx, es:[2]
mov ax, 4c00h
int 21h
math: mov al, ds:[si]
mov bl, ds:[si]
mul bl ;做8位的乘法運算
mov es:[di], ax ;將結果放在輸出結果的記憶體空間中
inc si
add di, 2
loop math ;因為有兩個引數做乙個迴圈
ret ;返回到主函式中去
3、用棧的方式傳遞資料
基本原理:主函式將需要傳遞給子函式的引數壓入棧中,子函式從棧中取得引數
下面用乙個例子說明,例子要求用子程式的棧引數呼叫的方法計算2^3
assume cs:code
code segment
start: mov ax, 2
push ax ;先將2入棧
call math ;呼叫子函式
mov ax, 4c00h
int 21h
math: push bp ;將子函式用到的暫存器入棧
mov bp, sp ;在沒有指明段名時,bp預設在ss段,操作的是棧
mov ax, [bp + 4] ;將棧指標指向存放2的地方
mov bp, ax ;將2給bp(給bp是因為在子程式的開始將bp入棧了,避免與主函式的暫存器衝突),為了做3次運算準備
mul bp
mul bp ;進行3次運算
pop bp ;在子函式結束前,將放入棧中的暫存器釋放出來
ret 4 ;回到主函式,這裡的4是指將sp+4,就是將棧指標指向初始位置,因為1和3占用了4個位元組的棧空間
因為進行的16位乘法運算,所以結果的低位在ax中,高位放在dx中
組合語言中的常數
1,數值常數 二進位制數 10110100b 八進位制數146q,5430 十進位制數146d,543 十六進製制數 1a2fh,0ff00h 實數12.48e 2,1a3c0000r 彙編時,則有匯程式設計序將所有的數值常數都轉換成二進位制標示的目標 凡是以字母a f開頭的十六進製制數,唏噓在前面...
組合語言中ASSUME簡介
size large url 組合語言中的assume偽指令 directive assume偽指令通知匯程式設計序為 段 資料段 附加段以及堆疊段選擇什麼名字。沒有assume偽指令時,匯程式設計序假設不分段,並自動把段超越字首用於所有定址儲存器資料的偽指令。assume語句只能用於完整的段定義。...
組合語言中xor指令 計算機組合語言
組合語言 雖然用機器語言編寫程式有很高的要求和許多不便,但編寫出來的程式執 行效率高,cpu嚴格按照程式設計師的要求去做,沒有多餘的額外操作。所以,在保留 程式執行效率高 的前提下,人們就開始著手研究一種能大大改善 程式可讀性的程式設計方法。為了改善機器指令的可讀性,選用了一些能反映機器指令功能的單...