當(dāng)前位置:首頁(yè) > 技術(shù)學(xué)院 > 技術(shù)前線
[導(dǎo)讀]匯編——子程序調(diào)用參數(shù)傳遞的三種方式(示例程序:三個(gè)數(shù)累加求和)

一、子程序定義

子程序名 PROC NEAR|FAR


RET

子程序名 ENDP

子程序名相當(dāng)于標(biāo)號(hào),表示本過(guò)程的符號(hào)地址。過(guò)程有NEAR和FAR兩種類(lèi)型,F(xiàn)AR型的過(guò)程可供段間調(diào)用,NEAR型過(guò)程僅供段內(nèi)調(diào)用。

在一個(gè)過(guò)程中,至少要有一條返回指令RET,它可以書(shū)寫(xiě)在過(guò)程中的任何位置,但是過(guò)程執(zhí)行的的最后一條指令一定是RET。

二、子程序調(diào)用指令

格式:CALL [NEAR PTR] 子程序名

CALL指令的兩個(gè)作用,1.將斷點(diǎn)地址(CALL指令的下一條指令地址)壓棧保存,2.轉(zhuǎn)去子程序執(zhí)行。

[NEAR PTR]可以省略。

三、返回指令

格式:RET [N]

指令作用:實(shí)現(xiàn)子程序執(zhí)行完后返回主程序的指令。從堆棧棧頂彈出一個(gè)字?jǐn)?shù)據(jù)(段內(nèi)調(diào)用)送入IP作為返回地址。N是立即數(shù),執(zhí)行完RET之后,再將SP增加N,也叫“平?!?。

四、子程序參數(shù)傳遞的三種方式:

程序示例:假設(shè):N1=1234H,N2=2345H,N3=3456H,計(jì)算并顯示這3個(gè)數(shù)的累加和,并用二進(jìn)制形式顯示結(jié)果

1.通過(guò)寄存器傳遞參數(shù):調(diào)用子程序前,調(diào)用程序把入口參數(shù)放在約定的寄存器中,子程序執(zhí)行時(shí),通過(guò)約定的寄存器取得入口參數(shù);返回時(shí),子程序把出口參數(shù)存放在約定的寄存器中,調(diào)用程序通過(guò)約定的寄存器中取得出口參數(shù)。

DATA SEGMENT

NUM DW 1234H

DW 2345H

DW 3456H

DATA ENDS

STACKS SEGMENT STACK

DB 100 DUP(?)

STACKS ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACKS

BEG: MOV AX,DATA

MOV DS,AX

MOV SI,OFFSET NUM

CALL COMPUTE

XYZ: CALL DISP

MOV AH,4CH

INT 21H

COMPUTE PROC

MOV BX,0

ADD BX,[SI+0]

ADD BX,[SI+2]

ADD BX,[SI+4]

RET

COMPUTE ENDP

DISP PROC

MOV CX,16

LAST: MOV DL,'0'

RCL BX,1

JNC NEXT

MOV DL,'1'

NEXT: MOV AH,2

INT 21H

LOOP LAST

RET

DISP ENDP

CODE ENDS

END BEG

本例程序中調(diào)用程序把2號(hào)功能入口參數(shù)放在DL寄存器中,顯示子程序在執(zhí)行時(shí)從DL中取得參數(shù)。

2.通過(guò)堆棧傳遞參數(shù):子程序調(diào)用前,調(diào)用程序把參數(shù)依次壓入堆棧,構(gòu)成一個(gè)堆棧參數(shù)表,當(dāng)子程序調(diào)用時(shí),子程序從堆棧中取出各參數(shù)。子程序返回時(shí),要使用 RET n 指令調(diào)整SP指針,其中n是堆棧參數(shù)表的大小,即使用完堆棧之后刪除堆棧參數(shù)表,使堆棧恢復(fù)到原始狀態(tài),也就是文章開(kāi)始提到的“平?!薄?

DATA SEGMENT

NUM DW 1234H

DW 2345H

DW 3456H

DATA ENDS

STACKS SEGMENT STACK 'STACK'

DB 100 DUP(?)

STACKS ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACKS

BEG: MOV AX,DATA

MOV DS,AX

MOV SI,OFFSET NUM

PUSH WORD PTR [SI+0]

PUSH WORD PTR [SI+2]

PUSH WORD PTR [SI+4]

CALL COMPUTE ;注意CALL指令隱含的堆棧操作

XYZ: CALL DISP

MOV AH,4CH

INT 21H

COMPUTE PROC

MOV BP,SP

MOV BX,0

ADD BX,[BP+2] ;棧底處在高地址段

ADD BX,[BP+4]

ADD BX,[BP+6]

RET 6

COMPUTE ENDP

DISP PROC

MOV CX,16

LAST: MOV DL,'0'

RCL BX,1

ADC DL,0

NEXT: MOV AH,2

INT 21H

LOOP LAST

RET

DISP ENDP

CODE ENDS

END BEG

3.通過(guò)變量傳遞參數(shù):如果子程序和調(diào)用程序都在同一個(gè)源文件中,則雙方可以直接訪問(wèn)模塊中的變量,從而實(shí)現(xiàn)參數(shù)傳遞。

STACKS SEGMENT STACK 'STACK’

DB 100 DUP(?)

STACKS ENDS

CODE SEGMENT

ASSUME CS:CODE,SS:STACKS

BEG: CALL COMPUTE

NUM DW 1234H

DW 2345H

DW 3456H

XYZ: CALL DISP

EXIT: MOV AH,4CH

INT 21H

COMPUTE PROC

MOV BP,SP

MOV SI,[BP+0] ; [BP+0]為斷點(diǎn)地址

MOV BX,0

ADD BX,CS:[SI+0]

ADD BX,CS:[SI+2]

ADD BX,CS:[SI+4]

POP AX ;彈出原來(lái)的斷點(diǎn)地址

MOV AX,OFFSET XYZ ;改變棧頂內(nèi)容,從而使返回地址改變

PUSH AX

RET ;返回?cái)帱c(diǎn)XYZ

COMPUTE ENDP

DISP PROC

MOV CX,16

LAST: MOV AL,'0'

RCL BX,1

ADC AL,0

NEXT: MOV AH,0EH ;BIOS功能調(diào)用顯示一個(gè)字符

INT 10H

LOOP LAST

RET

DISP ENDP

CODE ENDS

END BEG

這個(gè)例子沒(méi)有我們常見(jiàn)的數(shù)據(jù)段,二是把數(shù)據(jù)定義在了代碼段,子程序在執(zhí)行時(shí),需要用數(shù)據(jù)時(shí),訪問(wèn)存放數(shù)據(jù)的內(nèi)存單元,并且在子程序執(zhí)行要結(jié)束時(shí),改變?cè)瓉?lái)的斷點(diǎn)地址,跳過(guò)代碼段中的數(shù)據(jù)存儲(chǔ)區(qū),到下一片段的執(zhí)行代碼區(qū)。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉