組合語言中引數呼叫問題

2021-06-27 23:50:26 字數 3035 閱讀 9041

在模組化程式設計的過程中,用子函式的方式是很常見的一種方式,組合語言中必然會存在這樣的方式

在模組化程式設計中必不可少的的當然是傳入的引數和返回的引數

在這裡先總結一下:

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嚴格按照程式設計師的要求去做,沒有多餘的額外操作。所以,在保留 程式執行效率高 的前提下,人們就開始著手研究一種能大大改善 程式可讀性的程式設計方法。為了改善機器指令的可讀性,選用了一些能反映機器指令功能的單...