版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2023/2/51/41第7章匯編語(yǔ)言程序設(shè)計(jì)7.1程序設(shè)計(jì)步驟7.2簡(jiǎn)單程序7.3分支程序7.4循環(huán)程序7.5子程序習(xí)題7.1程序設(shè)計(jì)步驟2023/2/52/41匯編語(yǔ)言程序設(shè)計(jì)步驟:
(1)分析問(wèn)題:已知條件、要解決的問(wèn)題、功能/性能要求等。
(2)建立數(shù)學(xué)模型:把問(wèn)題數(shù)學(xué)化、公式化,便于計(jì)算機(jī)處理。
(3)確定算法:簡(jiǎn)單、速度快、精度高、代碼量小、編程容易。
(4)繪制程序流程圖:用箭頭、框圖、菱形圖等表示程序結(jié)構(gòu)。
(5)內(nèi)存空間分配:為程序或數(shù)據(jù)分配內(nèi)存空間。
(6)編制程序與靜態(tài)檢查:程序結(jié)構(gòu)層次簡(jiǎn)單、清楚、易懂。
(7)程序調(diào)試:利用調(diào)試軟件DEBUG進(jìn)行調(diào)試。2023/2/53/41匯編語(yǔ)言程序設(shè)計(jì)的特點(diǎn):
(1)算法要分解至指令級(jí);高級(jí)語(yǔ)言為語(yǔ)句級(jí)。
(2)要詳細(xì)考慮內(nèi)存空間分配問(wèn)題:
任何一個(gè)變量、一條指令都要明確其存儲(chǔ)位置7.2簡(jiǎn)單程序
這種程序的形式最簡(jiǎn)單,計(jì)算機(jī)執(zhí)行程序的方式是“從頭到尾”,逐條執(zhí)行指令語(yǔ)句,直到程序結(jié)束。這類簡(jiǎn)單程序不用按上述7個(gè)步驟,可直接對(duì)給出的題目寫出助記符程序清單?!纠?.1】用數(shù)據(jù)運(yùn)算指令,對(duì)兩個(gè)16位數(shù)做加法運(yùn)算。這兩個(gè)數(shù)從地址10050H開(kāi)始連續(xù)存放,低位在小地址一端,結(jié)果放在這兩個(gè)數(shù)之后。(1)分析題目:它是一個(gè)16位數(shù)相加的問(wèn)題。在用加法指令時(shí),必須要考慮低8位和低8位相加后產(chǎn)生的進(jìn)位問(wèn)題。2023/2/54/412023/2/55/41(2)根據(jù)86系列指令系統(tǒng),可以直接對(duì)累加器AX做字操作,但在低位相加后,會(huì)影響標(biāo)志寄存器的進(jìn)位CF,所以,要用帶進(jìn)位的加法指令。(3)繪制程序流程圖,如右圖所示。簡(jiǎn)單程序框圖(雙字節(jié)相加)2023/2/56/41(4)內(nèi)存空間分配:被加數(shù)、加數(shù)及和在內(nèi)存的空間分配見(jiàn)下表內(nèi)存地址內(nèi)容10050H被加數(shù)低8位10051H被加數(shù)高8位10052H加數(shù)低8位10053H加數(shù)高8位10054H和的低8位10055H和的高8位雙字節(jié)相加時(shí)的內(nèi)存分配2023/2/57/4150H51H52H53H54H55H12H34HA1HBDHAX00H10H50H51H52H53H54H55HAX12H34HAXB3HF1HDIA1HBDH+=內(nèi)存地址存儲(chǔ)內(nèi)容MOVAX,1000HMOVDS,AXMOVSI,50HMOVDI,52HMOVBX,54HSIDIBX50H51H52H53H54H55H12H34HA1HBDHB3HF1HBXB3HF1H低位在前,高位在后CLCXORAX,AXMOVAX,[SI]ADCAX,[DI]MOV[BX],AXHLT設(shè)SI=3412HDI=BDA1H內(nèi)存分配示意程序詳細(xì)注釋見(jiàn)下頁(yè)
2023/2/58/41(5)編制的程序如下:MOV
AX,1000H
MOV
DS,AX;DS=1000H
MOV
SI,50H;被加數(shù)指針SI=50H
MOV
DI,52H;加數(shù)指針DI=52H
MOV
BX,54H;和的指針BX=54H
CLC;
清CF
XOR
AX,AX;清AX異或
MOV
AX,[SI];取一個(gè)字到AX
ADC
AX,[DI];AX←AX+[DI]+CF
MOV[BX],AX;存一個(gè)字到[BX]HLT;暫停查看程序問(wèn)題:該程序能否簡(jiǎn)化?如何簡(jiǎn)化?2023/2/59/41簡(jiǎn)化的程序:MOV
AX,1000H
MOV
DS,AX;DS=1000H
MOV
AX,[50H];取被加數(shù)到AXADC
AX,[52H];AX←被加數(shù)+加數(shù)MOV[54H],AX;存和數(shù)到[54H]HLT;暫停2023/2/510/41
【例7.2】將內(nèi)存(10050)單元的內(nèi)容(7AH)拆成兩段,每段4位,并將它們分別存入內(nèi)存(10051)和(10052)單元。即(10050)單元中的低4位放入(10051)的低4位,(10050)單元中的高4位放入(10052)的低4位,而(10051)和(10052)的高4位均為零。(1)分析題目:這個(gè)題目提出的任務(wù)在十六進(jìn)制顯示及二、十進(jìn)制計(jì)算中常遇到的.現(xiàn)在假設(shè)內(nèi)存(10050)中放著7AH,則題目要求就是把7AH拆成07H和0AH兩部分,并把0AH放在(10051)單元,07H放在(10052)單元。2023/2/511/41
在拆字時(shí),想取得一個(gè)數(shù)的前4位和后4位可以用移位指令的方法,也可以用邏輯“與”一個(gè)0F0H(二進(jìn)制為11110000)和邏輯“與”一個(gè)0FH(二進(jìn)制為00001111)的辦法。(2)根據(jù)指令系統(tǒng)中含有的指令,先取出該數(shù)用邏輯指令與上一個(gè)0FH,得到低4位,存入內(nèi)存。再取出該數(shù)用移位指令邏輯右移SHR4次,取得高4位,存入內(nèi)存即可。2023/2/512/41(3)繪制程序流程圖,如圖所示。(4)內(nèi)存空間分配:把7AH拆成07H和0AH兩部分,它們?cè)趦?nèi)存空間的分配情況見(jiàn)下頁(yè)表。拆字程序框圖2023/2/513/41內(nèi)存分配示意圖10050H7AH7HAH0H10051H0H10052H拆開(kāi)AH7AHAH7AHAH7AHAH7H內(nèi)存地址內(nèi)容10050H7AH10051H0AH10052H07H拆字程序的內(nèi)存分配2023/2/514/41(5)編制的程序如下:MOVAX,1000HMOVDS,AX;DS=1000HMOVSI,50H;需拆字節(jié)的指針SI=50HMOVAL,[SI];取一個(gè)字節(jié)到AL中ANDAL,0FH;把AL的前4位清0MOV[SI+1],AL;把得到的后4位放到(10051)單元MOVAL,[SI];再取出需拆字節(jié)放到AL中MOVCL,4SHRAL,CL;邏輯右移四次,前4位補(bǔ)0MOV[SI+2],AL;放入(10052)單元查看程序2023/2/515/41[例3]編程計(jì)算1+2+3+4。MOVAX,0ADDAX
,1ADDAX
,2ADDAX
,3ADDAX
,4初始化:AX0開(kāi)始
AXAX+1
AXAX+2結(jié)束
AXAX+3
AXAX+4分析:需要有一個(gè)暫存空間存放累加和,初值設(shè)置為0,之后依次累加。2023/2/516/41練習(xí):
將數(shù)據(jù)1A2BH,1200H,339AH,1200H分別存入相鄰的內(nèi)存單元中,然后將前三個(gè)數(shù)相加并減去第四個(gè)數(shù),最后將結(jié)果傳遞到相近的內(nèi)存單元中。7.3分支程序2023/2/517/41分支程序是利用條件轉(zhuǎn)移指令實(shí)現(xiàn)程序執(zhí)行次序改變的一種程序結(jié)構(gòu)形式,即當(dāng)程序執(zhí)行到某一指令后,根據(jù)某個(gè)條件是否滿足,分別執(zhí)行不同的指令序列。一般來(lái)說(shuō),分支程序經(jīng)常是先用比較指令或數(shù)據(jù)操作及位檢測(cè)指令等來(lái)改變標(biāo)志寄存器各個(gè)標(biāo)志位。然后用條件轉(zhuǎn)移指令進(jìn)行分支。分支程序執(zhí)行完后可以立即結(jié)束,也可以轉(zhuǎn)到公共點(diǎn)結(jié)束。分支程序可以再分支。程序框圖:在繪制程序流程圖時(shí),需用菱形判斷框,表示判定條件。在繪制好流程圖編寫助記符程序時(shí),建議先按上下流程線寫,寫完上下流程線上的各框環(huán)節(jié)后,再寫分支部分里的框框。2023/2/518/41
【例7.3】求AX累加器和BX寄存器中兩個(gè)無(wú)符號(hào)數(shù)之差的絕對(duì)值,結(jié)果放在內(nèi)存(2800)單元中。(1)分析題目:此題目中,AX累加器和BX寄存器中的數(shù)是不知道的。對(duì)兩個(gè)不知大小的數(shù)相減并求絕對(duì)值,顯然應(yīng)該先解決哪一個(gè)值稍大些,然后再用大數(shù)減小數(shù)的方法,才可求得絕對(duì)值。2023/2/519/41(2)根據(jù)指令系統(tǒng)中的比較指令,編出判斷大小的環(huán)節(jié),即可解決問(wèn)題,下圖即為該例題的程序流程圖。求絕對(duì)值程序流程圖JC=JumpifCarry當(dāng)運(yùn)算產(chǎn)生進(jìn)位標(biāo)志時(shí),即CF=1時(shí),跳轉(zhuǎn)到目標(biāo)程序處。(3)根據(jù)流程圖編制程序如下:
CLC;清除CF
SUB
AX,BX
JC
AA;CF=1轉(zhuǎn)AA去執(zhí)行(即AX<BX時(shí)轉(zhuǎn)移
MOV
DI,2800H;結(jié)果指針DI=2800H
MOV[DI],AX;結(jié)果送到2800H和2801H單元
HLT;暫停AA:
SUB
BX,AX;BX←BX-AX
MOV
DI,2800H
MOV[DI],BX
HLTSUBBX,AX2023/2/520/41
問(wèn)題:這段程序有無(wú)錯(cuò)誤?如果有錯(cuò),如何改正?CMP
AX,BXSUB
AX,BX2023/2/521/41【例7.4】編一個(gè)程序,從外設(shè)71H號(hào)中取一個(gè)數(shù)M,判斷其值是否在10和20之間,即10≤M<20。如果M≥20H,則送0FFH給外設(shè)73H;如果M<10,則送00H給外設(shè)73H;如果10≤M<20,則送88H給外設(shè)73H。(1)分析題目:根據(jù)題意,這是一個(gè)需要兩次判斷M大小的問(wèn)題。先判M是否大于10,再判M是否大于20。2023/2/522/41(2)根據(jù)解決問(wèn)題的思路,先畫出程序流程圖,如圖。
從圖的程序流程圖看,兩個(gè)分支都要“回歸”原程序。判斷M的兩分支流程圖2023/2/523/41
(3)編制的程序如下:START:IN
AL,71H;將71H端口的字節(jié)讀入AL
CLC;清除CF
CMP
AL,10;將AL的內(nèi)容和10相比較
JC
LP1;小于10轉(zhuǎn)LP1
CMP
AL,20;將AL的內(nèi)容和20相比較
JC
LP2;10≤AL<20轉(zhuǎn)LP2
MOV
BL,0FFH;將0FFH送入BL寄存器LP3:OUT
73H,BL;將0FFH輸出到73H端口
HLT;暫停LP1:MOV
BL,00
JMP
LP3LP2:MOV
BL,88H
JMP
LP3問(wèn)題:這段程序有無(wú)錯(cuò)誤?如果有錯(cuò),如何改正?MOVBL,ALBLBLALALALAL;無(wú)條件轉(zhuǎn)移START:IN
AL,71H;將71H端口的字節(jié)讀入ALMOVBL,AL
CLC;清除CF
CMP
BL,10;將BL的內(nèi)容和10相比較
JC
LP1;小于10轉(zhuǎn)LP1
CMP
BL,20;將BL的內(nèi)容和20相比較
JC
LP2;10≤BL<20轉(zhuǎn)LP2
MOV
AL,0FFH;將0FFH送入AL寄存器LP3:OUT
73H,AL;將0FFH輸出到73H端口
HLT;暫停LP1:MOV
AL,00
JMP
LP3LP2:MOV
AL,88H
JMP
LP32023/2/524/412023/2/525/41編一程序段,完成符號(hào)函數(shù):
1 X>0(-128≤X≤127)Y= 0 X=0 -1 X<0
假設(shè)X的值存放在DATA1中,
Y的值存放在DATA2中。練習(xí)2023/2/526/41練習(xí)題程序如下:START:MOVAL,DATA1 ANDAL,AL JGEBIGR MOVAL,0FFH MOVDATA2,AL;X<0,-1送DATA2 HLTBIGR:JEEQUL MOVAL,1 MOVDATA2,AL;X>0,+1送DATA2 HLTEQUL:MOVDATA2,AL;X=0,0送DATA2 HLT2023/2/527/41讀程序,問(wèn):本段程序的執(zhí)行結(jié)果是什么?
BEGIN:IN
AL,5FH
TEST
AL,80H
JZ
BRCH1
MOV
AH,0
JMP
STOPBRCH1:MOV
AH,0FFH
STOP:HLT;將5FH端口的字節(jié)讀入AL;如果AL的最高位為1,則ZF=0,否則ZF=1;當(dāng)結(jié)果為零(即ZF=1)時(shí),跳轉(zhuǎn)至BRCH1;將立即數(shù)零送AH;無(wú)條件轉(zhuǎn)移至STOP;將0FFH送AH
;暫停當(dāng)AL的最高位為1時(shí),AH=0;當(dāng)AL的最高位為0時(shí),AH=0FFH。2023/2/528/41
雙分支程序設(shè)計(jì)
實(shí)現(xiàn)雙分支程序設(shè)計(jì)要完成以下幾項(xiàng)工作:
1.產(chǎn)生條件:主要用“比較”、“測(cè)試”等指令產(chǎn)生條件;
2.測(cè)試條件、定向轉(zhuǎn)移:用條件轉(zhuǎn)移指令完成;
3.設(shè)置執(zhí)行標(biāo)志(標(biāo)號(hào)):給執(zhí)行程序段定義地址標(biāo)號(hào)。7.4循環(huán)程序2023/2/529/41循環(huán)程序是強(qiáng)制CPU重復(fù)執(zhí)行某一指令序列(程序段)的一種程序結(jié)構(gòu)形式。循環(huán)結(jié)構(gòu)程序縮短了程序的長(zhǎng)度、減少了占用的內(nèi)存空間。循環(huán)程序并不簡(jiǎn)化程序執(zhí)行過(guò)程,相反,由于增加了一些循環(huán)控制等環(huán)節(jié),總的程序執(zhí)行語(yǔ)句和時(shí)間會(huì)有所增加。循環(huán)程序一般由4部分組成:初始化、循環(huán)體、循環(huán)控制和循環(huán)結(jié)束處理。循環(huán)程序分為單循環(huán)和多重循環(huán),兩重以上循環(huán)稱為多重循環(huán)。內(nèi)外循環(huán)不能交叉。2023/2/530/417.4循環(huán)程序循環(huán)程序各部分的內(nèi)容(1)初始化
建立循環(huán)次數(shù)計(jì)數(shù)器,設(shè)定變量和存放數(shù)據(jù)的內(nèi)存地址指針(常用間址方式)的初值等。(2)循環(huán)體
實(shí)現(xiàn)程序功能的、被重復(fù)執(zhí)行的指令序列。(3)循環(huán)控制
修改變量和地址指針,為下一次循環(huán)做準(zhǔn)備;修改循環(huán)計(jì)數(shù)器或者判斷循環(huán)條件是否滿足,滿足則繼續(xù)循環(huán),否則結(jié)束循環(huán)。(4)結(jié)束處理
它主要用來(lái)分析和存放程序的結(jié)果。2023/2/531/41循環(huán)控制方式有多種,如計(jì)數(shù)控制、條件控制等。計(jì)數(shù)控制事先已知循環(huán)次數(shù),每次循環(huán)加或減計(jì)數(shù),通過(guò)對(duì)循環(huán)次數(shù)的判定來(lái)達(dá)到控制循環(huán)的目的;條件控制事先不知循環(huán)次數(shù),通過(guò)判定某種條件的真假來(lái)達(dá)到控制循環(huán)的目的。不管哪一種控制循環(huán)方式,最終都是要達(dá)到控制循環(huán)的目的。若考慮不周,會(huì)造成死循環(huán),對(duì)這一點(diǎn)要注意。循環(huán)可以用跳轉(zhuǎn)語(yǔ)句實(shí)現(xiàn),如JMP,JZ等;也可以用專用循環(huán)控制語(yǔ)句實(shí)現(xiàn),如LOOP、LOOPE/LOOPZ、LOOPNE/LOOPNZ。【例7.5】求兩個(gè)多字節(jié)數(shù)之和。這兩個(gè)數(shù)在10050H地址開(kāi)始的內(nèi)存單元中,連續(xù)存放,低位在小地址一端,結(jié)果放在這兩個(gè)數(shù)之后。設(shè)這兩個(gè)多字節(jié)數(shù)均為8個(gè)字節(jié)長(zhǎng)。
程序流程圖如右圖所示。2023/2/532/41(1)分析題目:這是一個(gè)重復(fù)累加內(nèi)存單元中數(shù)的問(wèn)題,因此可以用循環(huán)程序形式解決。因?yàn)?6系列指令系統(tǒng)可以16位處理,所以,循環(huán)次數(shù)是4次。2023/2/533/4112…57434…1存儲(chǔ)器SI10050DI10058++++BX100605598…單擊2023/2/534/41(3)編制的程序如下:START:MOV
AX,1000H
MOV
DS,AX;DS=1000H
MOV
SI,50H;第一個(gè)數(shù)指針SI=50H
MOV
DI,58H;第二個(gè)數(shù)指針DI=58H
MOV
BX,60H;結(jié)果指針BX=60H
MOV
CX,4;循環(huán)次數(shù)CX=4
CLC;清進(jìn)位CF=0AA:MOV
AX,[SI];取一個(gè)字到AX
下頁(yè)續(xù)2023/2/535/41
ADC
AX,[DI];AX←AX+[DI]+CF
MOV[BX],AX;存一個(gè)字到[BX]
PUSHF;保護(hù)進(jìn)位CF
ADD
SI,2;修改第一個(gè)數(shù)的地址指針SI←SI+2
ADD
DI,2;修改第二個(gè)數(shù)的地址指針DI←DI+2
ADD
BX,2;修改結(jié)果指針BX←BX+2
POPF;恢復(fù)標(biāo)志寄存器
LOOP
AA;CX←CX-1,若CX≠0轉(zhuǎn)AA
HLT;CX=0,暫停結(jié)束2023/2/536/41
【例7.6】要求設(shè)計(jì)一個(gè)軟件延時(shí)程序,延時(shí)時(shí)間約1ms左右。(1)分析題目:此題是想讓計(jì)算機(jī)做一些無(wú)用的操作,來(lái)拖延時(shí)間。從指令手冊(cè)中查得各條指令所需的時(shí)間節(jié)拍,但一般一條指令執(zhí)行時(shí)間只有幾個(gè)時(shí)鐘周期,亦即只有幾個(gè)微秒,為了能用較少的指令來(lái)編較長(zhǎng)時(shí)間的延時(shí),采用循環(huán)程序結(jié)構(gòu).2023/2/537/41(2)程序流程圖如圖所示。延時(shí)的時(shí)間主要取決于循環(huán)體及循環(huán)次數(shù)。PUSHF和POPF指令分別為10和8個(gè)時(shí)鐘節(jié)拍,LOOPBX指令為3.4個(gè)時(shí)鐘節(jié)拍,即此循環(huán)體需要用10+8+3.4=21.4拍,而每個(gè)時(shí)鐘節(jié)拍是根據(jù)此系統(tǒng)的晶振頻率而定的。假設(shè)此系統(tǒng)用的是8MHz的晶振,則每個(gè)時(shí)鐘節(jié)拍需要0.125μs,因此可以根據(jù)下列公式算出循環(huán)次數(shù):
X=延時(shí)時(shí)間/一次循環(huán)時(shí)間=1ms/21.4×0.125μs≈374次換算成十六進(jìn)制數(shù)為176H。2023/2/538/41延時(shí)1ms的程序流程圖延時(shí)1ms的程序流程圖2023/2/539/41(3)編制的程序如下:START:MOV
CX,176H;初始化,設(shè)定循環(huán)次數(shù)CX=374LP1:PUSHF;循環(huán)體
POPF
LOOP
LP1;CX←CX-1,若CX≠0轉(zhuǎn)
HLT;暫停對(duì)于上例,如果想再延長(zhǎng)1000倍時(shí)間(即延時(shí)1s),可以采用雙循環(huán)的方法,如圖所示的程序流程圖。對(duì)應(yīng)的程序如下:2023/2/540/41
MOV
BX,3E8H;BX←1000LP2:MOVCX,176HLP1:PUSHF
POPF延時(shí)1ms程序段
LOOPLP1
DEC
BX;BX←BX-1
JNZ
LP2;ZF=0時(shí),轉(zhuǎn)至LP2,即BX≠0時(shí)轉(zhuǎn)
HLT;暫停此程序中內(nèi)循環(huán)是1ms時(shí)間,而在外循環(huán)中的兩條控制指令DEC和JNZ所對(duì)應(yīng)的時(shí)鐘節(jié)拍分別為2個(gè)和4個(gè),一共只需0.75μs,與1ms比較極短,所以在外循環(huán)里忽略不計(jì)了,外循環(huán)的循環(huán)初值仍設(shè)為1000次,對(duì)應(yīng)的十六進(jìn)制為3E8H。例設(shè)AX寄存器中有一個(gè)16位二進(jìn)制數(shù),編一程序,統(tǒng)計(jì)AX中‘1’的個(gè)數(shù),統(tǒng)計(jì)結(jié)果送CX中。該程序可用固定次數(shù)循環(huán)和條件判斷兩種方法實(shí)現(xiàn)。條件判斷法編制程序如下:START:MOVCX,0LOOP:SUB AX,0 JZ STP SAL AX,1 JNC NOD INC CXNOD:JMP LOOPSTP: HLT2023/2/541/41固定次數(shù)循環(huán)法,循環(huán)次數(shù)為16次,程序如下:其中:CX中存放循環(huán)次數(shù),BX中存放“1”的個(gè)數(shù).
MOVCX,16MOVBX,0AA:SHLAX,1JCYYJMPPPYY:INCBXPP:LOOPAAHLT例:計(jì)算S=1+2+3+……+100的和值并將其存入數(shù)據(jù)段[2000H]單元.2023/2/542/41程序如下:
MOVCX,0064H
MOVAL,0MOVBL,1AA:ADDAL,BLINCBLLOOPAAMOV[2000H],ALHLT例:讀程序,(1)本程序?qū)崿F(xiàn)什么功能?(2)結(jié)果在哪里?2023/2/543/41START:IN
AL,20H
MOV
BL,AL
IN
AL,30H
MOV
CL,AL
MOV
AX,0ADLOP:ADD
AL,BL
ADC
AH,0
DEC
CL
JNZ
ADLOP
HLT
;將20H端口的字節(jié)讀入AL;AL中的8位字節(jié)送BL;將30H端口的字節(jié)讀入AL;AL中的8位字節(jié)送CL;立即數(shù)0送AX;AL與BL的內(nèi)容相加,結(jié)果放AL;AH的內(nèi)容與立即數(shù)0以及CF相加;CL內(nèi)容減1,結(jié)果放CL;當(dāng)結(jié)果不為零時(shí),執(zhí)行ADLOP;暫停20H與30H端口的內(nèi)容相乘,結(jié)果放在AX中447.5子程序和庫(kù)為了程序共享或模塊化設(shè)計(jì)的需要,可以把一段公共語(yǔ)句序列設(shè)計(jì)成子程序或宏指令的形式。45
當(dāng)把一段可共享的語(yǔ)句序列組織成子程序后,一旦需要實(shí)現(xiàn)該功能,就由調(diào)用程序調(diào)用之,當(dāng)子程序執(zhí)行結(jié)束后再返回到主程序繼續(xù)執(zhí)行。7.5.1子程序的定義
主程序子程序
主子程序關(guān)系示意圖①②③④46定義子程序的一般格式在匯編語(yǔ)言中用過(guò)程定義偽指令定義子程序。 過(guò)程名 PROC【類型】 …
過(guò)程名 ENDP477.5.1子程序的定義“子程序名”必須是一個(gè)合法的標(biāo)識(shí)符,并前后二者要一致;PROC和ENDP必須是成對(duì)出現(xiàn)的關(guān)鍵字,表示子程序定義開(kāi)始和結(jié)束;子程序的類型有近(NEAR)、遠(yuǎn)(FAR)之分,其缺省的類型是近類型;NEAR類型的子程序只能被與其同段的程序所調(diào)用,F(xiàn)AR類型的子程序可被不同段的程序所調(diào)用;子程序至少要有一條返回指令。返回指令是子程序的出口語(yǔ)句,但它不一定是子程序的最后一條語(yǔ)句;子程序名有三個(gè)屬性:段值、偏移量和類型。其段值和偏移量對(duì)應(yīng)于子程序的入口地址,其類型就是該子程序的類型。48
調(diào)用子程序指令格式如下:
CALL子程序名/Reg/Mem子程序的調(diào)用指令分為近(near)調(diào)用和遠(yuǎn)(far)調(diào)用。如果被調(diào)用子程序的屬性是近的,那么,CALL指令將產(chǎn)生一個(gè)近調(diào)用,它把該指令之后地址的偏移量(用一個(gè)字來(lái)表示的)壓棧,把被調(diào)用子程序入口地址的偏移量送給指令指針寄存器IP即可實(shí)現(xiàn)執(zhí)行程序的轉(zhuǎn)移。7.2子程序的調(diào)用和返回指令49如果被調(diào)用子程序的屬性是遠(yuǎn)的,那么,CALL指令將產(chǎn)生一個(gè)遠(yuǎn)調(diào)用。這時(shí),調(diào)用指令不僅要把該指令之后地址的偏移量壓進(jìn)棧,而且也要把段寄存器CS的值壓進(jìn)棧。在此之后,再把被調(diào)用子程序入口地址的偏移量和段值分別送給IP和CS,這樣完成了子程序的遠(yuǎn)調(diào)用操作。例如:
CALLDISPLAY ;DISPLAY是子程序名
CALLBX ;BX的內(nèi)容是子程序的偏移量
CALLWORD1 ;WORD1是內(nèi)存字變量,其值是子程序的偏移量501.子程序調(diào)用指令
CALL
格式:CALLDST
功能:調(diào)用子程序。執(zhí)行時(shí)先把返回地址壓入堆棧,再形成子程序入口地址,最后把控制權(quán)交給子程序。 說(shuō)明:其中DST為子程序名或子程序入口地址,其目標(biāo)地址的形成與JMP指令類似,可以有段內(nèi)直接/間接調(diào)用、段間直接/間接調(diào)用之分,只是不能使用段內(nèi)直接尋址方式的SHORT格式。51⑴段內(nèi)調(diào)用這類調(diào)用指令實(shí)現(xiàn)同一段內(nèi)的子程序調(diào)用,它只改變IP值,不改變CS值。執(zhí)行操作:把返回地址(CALL之后的那條指令地址的偏移量部分(當(dāng)前IP值))壓入堆棧。根據(jù)與轉(zhuǎn)移地址有關(guān)的尋址方式形成子程序入口地址的IP值。把控制無(wú)條件轉(zhuǎn)向子程序,即執(zhí)行CS:IP處的指令。52①段內(nèi)直接調(diào)用:格式:CALLPROCEDURE或:CALLNEARPTRPROCEDURE功能:調(diào)用PROCEDURE子程序。執(zhí)行時(shí)先把返回地址壓入堆棧,再使IP=(IP)+disp16,最后把控制權(quán)交給子程序。說(shuō)明:這種指令使用與轉(zhuǎn)移地址有關(guān)的尋址方式中的段內(nèi)直接尋址方式。例1.
設(shè)子程序A與CALL指令在同一段內(nèi),則調(diào)用A子程序的指令是:
CALLA或:CALLNEARPTRA53②段內(nèi)間接調(diào)用: 格式:CALLREG/M
功能:調(diào)用子程序。執(zhí)行時(shí)先把返回地址壓入堆棧,再把指令指定的16位通用寄存器或內(nèi)存單元的內(nèi)容送給IP,最后把控制權(quán)交給子程序。說(shuō)明:這種指令使用與轉(zhuǎn)移地址有關(guān)的尋址方式中的段內(nèi)間接尋址方式,指令指定的通用寄存器或內(nèi)存單元中存放段內(nèi)偏移量。54⑵段間調(diào)用
這類調(diào)用指令可以實(shí)現(xiàn)段間調(diào)用(FAR型調(diào)用),執(zhí)行時(shí)即要改變IP值,也要改變CS值。55①段間直接調(diào)用:
格式:CALLFARPTRPROCEDURE
功能:調(diào)用PROCEDURE子程序。執(zhí)行時(shí)先把返回地址(當(dāng)前IP值和當(dāng)前CS值)壓入堆棧,再把指令中的偏移量部分送給IP,段基址部分送給CS,最后把控制權(quán)交給子程序。
說(shuō)明:這種指令使用與轉(zhuǎn)移地址有關(guān)的尋址方式中的段間直接尋址方式。
例3.
設(shè)子程序B與CALL指令不在同一段內(nèi),則段間直接調(diào)用B子程序的指令是:
CALLFARPTRB56②段間間接調(diào)用: 格式:CALLM
功能:調(diào)用子程序。執(zhí)行時(shí)先把返回地址(當(dāng)前IP值和當(dāng)前CS值)壓入堆棧,再把M的低字送給IP,高字送給CS,最后把控制權(quán)交給子程序。 說(shuō)明:這種指令使用與轉(zhuǎn)移地址有關(guān)的尋址方式中的段間間接尋址方式,其中M為內(nèi)存的雙字長(zhǎng)地址指針,低字部分為16位的偏移量,高字部分為段基址。57
例4.
對(duì)于例3,若子程序B的入口地址(偏移量和段基址)放在變量VAR中,即可通過(guò)VAR實(shí)現(xiàn)段間間接調(diào)用。如下所示:
CALLDWORDPTRVAR ;從VAR變量中得到子程序B的入口地址實(shí)現(xiàn)調(diào)用 變量VAR的地址也可以通過(guò)寄存器間接尋址方式、基址變址尋址方式等存儲(chǔ)器操作數(shù)尋址方式得到。
例.CALLDWORDPTR8[BX][DI] 58
當(dāng)子程序執(zhí)行完時(shí),需要返回到調(diào)用它的程序之中。為了實(shí)現(xiàn)此功能,指令系統(tǒng)提供了一條專用的子程序返
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子設(shè)備選購(gòu)合同
- 服務(wù)合同感言
- 鋼琴教師合同范本
- 房屋交易合同的履行期限
- 蔬菜供應(yīng)銷售協(xié)議
- 房屋買賣合同的撤銷與變更
- 標(biāo)準(zhǔn)房屋買賣合同翻譯
- 牧業(yè)承包合同問(wèn)答詳解
- 無(wú)抵押擔(dān)保合同協(xié)議范例
- 消防安全評(píng)估與設(shè)備更新合同
- 護(hù)理疑難病例討論肺心病
- 耳硬化癥護(hù)理查房
- 浙江省義烏市六校聯(lián)考2024屆八年級(jí)物理第二學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)試題含解析
- 北京市昌平區(qū)2023-2024學(xué)年七年級(jí)上學(xué)期期末生物試卷
- 消防員心理培訓(xùn)課件
- 【一例小兒支氣管肺炎的臨床護(hù)理個(gè)案分析2200字】
- 項(xiàng)目管理機(jī)構(gòu)及服務(wù)方案
- 蔬菜水果供貨服務(wù)方案
- 2023年高級(jí)電氣工程師年終總結(jié)及年后展望
- “源網(wǎng)荷儲(chǔ)”一體化項(xiàng)目(儲(chǔ)能+光伏+風(fēng)電)規(guī)劃報(bào)告
- 數(shù)據(jù)保密協(xié)議書
評(píng)論
0/150
提交評(píng)論