版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第四章匯編語言程序設(shè)計
順序程序設(shè)計分支程序設(shè)計循環(huán)程序設(shè)計子程序軟中斷和BIOS調(diào)用1.設(shè)計步驟:根據(jù)實際問題抽象出數(shù)學(xué)模型確定算法畫程序流程圖分配內(nèi)存工作單元和寄存器程序編碼調(diào)試2.繪制程序流程圖(1)用方框表示工作框(2)用菱形框表示判斷框
NY?(4)各框之間用直線連起來表示程序走向。(3)用
框表示調(diào)用子程序或過程。3.源程序的基本結(jié)構(gòu):順序、分支、循環(huán)、子程序程序流程圖符號起始:功能:判斷:子過程:順序程序設(shè)計,又叫直接程序設(shè)計。它是相對于分支程序和循環(huán)程序設(shè)計而言的。因此,可以說順序程序是既不包含分支,又不包含循環(huán)的程序,順序程序是從第一條指令開始,按其自然順序,一條指令一條指令地執(zhí)行,在運行期間,CPU既不跳過某些指令,也不重復(fù)執(zhí)行某些指令,一直執(zhí)行到最后一條指令為止。4.1順序結(jié)構(gòu)程序例:將某段中的字符串“Hello!”傳送到另一段中(內(nèi)存數(shù)據(jù)塊的傳送)。開始建立傳送方向DS:SI←
源串首地址
ES:DI
←目的串首地址CX
←
串長度串傳送返回DOS4.1順序結(jié)構(gòu)程序(順序執(zhí)行,無轉(zhuǎn)移、無循環(huán))aa SEGMENT;數(shù)據(jù)段1xx DB'Hello!’;定義源串a(chǎn)a ENDSbb SEGMENT;數(shù)據(jù)段2yy DB6dup(?);定義目的串bb ENDScc SEGMENT;代碼段 ASSUMECS:cc,DS:aa,ES:bb;分配段寄存器start
: CLD;設(shè)置傳送方向 MOVAX,aa;DS:SI←源串首地址 MOVDS,AX
LEASI,xx
MOVAX,yy;ES:DI←目的串首地址 MOVES,AX MOVDI,OFFSETyy
MOVCX,6;CX←串的長度 REPMOVSB;串傳送
MOVAH,4CH;調(diào)用4CH系統(tǒng)功能,返回DOS INT21Hcc ENDS
ENDstart
;程序結(jié)束
4.1順序程序設(shè)計
例4.1.1把在字節(jié)存儲單元AA和BB中的兩個壓縮BCD數(shù)相加,結(jié)果存到字節(jié)單元CC中。分析:實現(xiàn)BCD碼相加,要通過二進制數(shù)加法指令實現(xiàn)。然后再用十進制調(diào)整指令進行調(diào)整,以獲得正確的BCD結(jié)果。因為是單字節(jié)相加,只用一條二進制加法指令即可。如果考慮相加結(jié)果有進位,則可以將表示進位的CF標(biāo)志位存入單元CC+1中。為此,在存儲單元CC處留有兩個字節(jié),用來存放相加的結(jié)果。程序:DATASEGMENTAADB23H;被加數(shù)BBDB18H;加數(shù)CCDB2DUP(?);結(jié)果單元DATAENDSBCDADDSEGMENTASSUMECS:BCDADD,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,AA;取被加數(shù)ADDAL,BB;二數(shù)相加DAA;調(diào)整為十進制結(jié)果MOVCC,ALLAHF;取標(biāo)志位ANDAH,01;取CF位MOVCC+1,AH;存進位到C+1單元MOVAH,4CHINT21HBCDADDENDSENDSTART
例4.1.4在內(nèi)存地址SQREA起有0~15的平方數(shù)表。在ABB單元任給---個小于等于15的整數(shù),求其平方值。分析:因為平方表已順序排放在內(nèi)存中。又已知首地址為SQREA,只要把給定單元的內(nèi)容作位移量與表首址相加,就指向了表中要求值的地址,取其內(nèi)容即為該數(shù)的平方值。源程序:DATA SEGMENTSQREADB0,1,4,9,16,25,36,49,64,81DB100,121,144,169,196,225ABBDB8DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTARTPROC FARPUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVBL,ABB;取給定單元中數(shù)MOVBH,0MOVSI,OFFSETSQREA;平方表首地址指針MOVAL,[SI+BX];取給定數(shù)的平方值MOVABB,AL;存回原單元RETFSTARTENDPCODEENDSENDSTART條件滿足?處理P1處理P2標(biāo)號1:標(biāo)號2:NY1.簡單分支結(jié)構(gòu)4.2分支程序分支結(jié)構(gòu)程序設(shè)計的關(guān)鍵在于準(zhǔn)確地知道操作結(jié)果影響的標(biāo)志位狀態(tài)和正確地使用條件轉(zhuǎn)移指令。根據(jù)對條件的判斷而選擇不同的處理方法是人的基本智能體現(xiàn)。2.多種分支結(jié)構(gòu)標(biāo)號1:條件1成立?P1NY條件2成立?條件n成立?…Pn+1標(biāo)號2:標(biāo)號n:標(biāo)號n+1:P2PnNNYY
①用比較指令CMPDEST,SRCJEEQUL……EQUL:②用測試指令TESTDEST,SRCJNZNEXT……NEXT:③用邏輯指令
SHRDEST,CLJCNEXT……NEXT:例:編程實現(xiàn)下列函數(shù)的功能,其中X、Y為無符號字節(jié)數(shù)。(AL)=X(BL)=Y開始(AL)=(BL)?Z=0YZ=1Y(AL)>(BL)?NZ=-1N結(jié)束程序;--數(shù)據(jù)段定義----------------------------------
DAT
SEGMENT X DB 242 Y DB 67 Z DB ?
DAT
ENDS;--代碼段定義----------------------------------
COD SEGMENT ASSUMEDS:DAT,CS:COD START:MOVAX,DAT
MOVDS,AX
;初始化DS
MOVAL,X MOVBL,Y;-------------------------------------------------------------------------------- CMP AL,BL
JE
C1
;(AL)=(BL)則跳轉(zhuǎn)至C1
JA
C2
;(AL)>(BL)則跳轉(zhuǎn)至C2 MOV AL,-1
JMPEXT
C1: MOV AL,0
JMP EXTC2: MOV AL,1EXT:MOVZ,ALMOV AH,4CH INT21H ;返回DOS;------------------------------------------------------------------------------------ COD ENDS
END START
4.2
分支程序設(shè)計例4.2.1設(shè)在A、B兩個存貯單元各有一個無符號數(shù),比較兩個無符號數(shù)的大小,并根據(jù)判斷結(jié)果,在屏幕顯示A>B或B>A或A=B。分析:兩個無符號數(shù)比較大小,使用比較指令CMP,產(chǎn)生標(biāo)志位,然后根據(jù)標(biāo)志位,使用無符號條件轉(zhuǎn)移指令實現(xiàn)轉(zhuǎn)移。源程序:DATASEGMENTADB3BHBDB8EHASTRDB‘A>B$’BSTRDB‘B>A$’CSTRDB‘A=B$’DATAENDS
CODESEGMENTASSUMECS:CODE,DS:DATAMOVAX,DATAMOVDS,AXMOVAL,A;取A中數(shù)CMPB,AL;A與B比較JAEBGA;B≥A,轉(zhuǎn)BGAMOVDX,OFFSETASTR;顯示A>BMOVAH,9INT21HJMPCOMBGA:JZAEBMOVDX,OFFSETBSTR;顯示B>AMOVAH,9INT21HJMPCOMAEB:MOVDX,OFFSETCSTR;顯示A=BMOVAH,9INT21HCOM:MOVAH,4CHINT21HCODEENDS
例4.2.2在一個字符串中,找出其ASCII碼值最大的字符,并顯示在屏幕上。分析:可以把每個字符的ASCII碼,看做是一個無符號數(shù)。這樣,就轉(zhuǎn)化為在一組數(shù)中查找一個最大數(shù)的操作。通常使用逐個比較法,即把第一個數(shù)作比較標(biāo)準(zhǔn),與其后的數(shù)比較。如標(biāo)準(zhǔn)數(shù)大,則再與下一個數(shù)比較。如標(biāo)準(zhǔn)數(shù)小,則將大數(shù)做為新的標(biāo)準(zhǔn)數(shù),再與下一個數(shù)比較。依此類推,逐個比較,直到最后一個標(biāo)準(zhǔn)的數(shù),就是要找的最大數(shù),即值為最大的字符。源程序:DATASEGMENTBLOKDB‘Searchacharactertohave';字符串DB‘thelargestvalue$'COUNTEQU$-BLOK;串長DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETBLOKMOVCX,COUNT-1MOVAL,[SI];取一個字符,INCSI;調(diào)整指針COMP:CMPAL,[SI];字符比較JANEXT;若AL值大,轉(zhuǎn)NEXT
MOVAL,[SI];否則,取大值到ALNEXT:INCSI;調(diào)整指針LOOPCOMP;循環(huán)查找MOVDL,AL;顯示所找到的最大字符MOVAH,2INT21HMOVAH,4CHINT21HCODEENDSENDSTART循環(huán)程序的組成:循環(huán)程序是在滿足某些條件時對一段程序的重復(fù)執(zhí)行,一般由四部分組成。
4.3循環(huán)程序(1)循環(huán)初值部分:這是為了保證循環(huán)程序能正常進行循環(huán)操作而必須做的準(zhǔn)備工作。循環(huán)初值分兩類:一類是循環(huán)工作部分的初值,別一類是控制循環(huán)結(jié)束條件的初值。(2)工作部分:即需要重復(fù)執(zhí)行的程序段。這是循環(huán)的中心,稱之為循環(huán)體。(3)修改部分:按一定規(guī)律修改操作數(shù)地址及控制變量,以便每次執(zhí)行循環(huán)體時得到新的數(shù)據(jù)。(4)控制部分:用來保證循環(huán)程序按規(guī)定的次數(shù)或特寫條件正常循環(huán)。循環(huán)體循環(huán)控制繼續(xù)循環(huán)?初始化YN(2)先判斷后執(zhí)行循環(huán)體可能一次都不執(zhí)行初始化循環(huán)體循環(huán)控制繼續(xù)循環(huán)?YN2.基本結(jié)構(gòu)形式(1)先執(zhí)行后判斷(do—while)至少執(zhí)行一次循環(huán)體
①MOVCX,COUNTAGAIN:……LOOPAGAIN②MOVCX,COUNTAGAIN:……DECCXJNZAGAIN③MOVCX,COUNTAGAIN:JCXZNEXT……DECCXJMPAGAINNEXT:2、循環(huán)程序設(shè)計(1)循環(huán)的控制方法下面介紹最常見的兩種控制方法:計數(shù)控制和條件控制。①計數(shù)控制當(dāng)循環(huán)次數(shù)已知時,通常使用計數(shù)控制法。假設(shè)循環(huán)次數(shù)為n,常常用以下三種方法實現(xiàn)計數(shù)控制和條件控制先將循環(huán)次數(shù)n送入循環(huán)體計數(shù)器中,然后,每循環(huán)一次,計數(shù)器減1,直至循環(huán)計數(shù)器中的內(nèi)容為0時結(jié)束循環(huán)。如:MOVCX,n…;循環(huán)初值部分LOOPA:…;工作部分…;修改部分DECCX;控制部分JNZLOOPA:其中工作部分、修改部分被重復(fù)執(zhí)行n次,即當(dāng)(CX)=n,n-1,…,1時,重復(fù)執(zhí)行循環(huán)體,當(dāng)(CX)=0時,結(jié)束循環(huán)。先將循環(huán)次數(shù)的負(fù)值送入循環(huán)計數(shù)器中,然后每循環(huán)一次,計數(shù)器加1,直至計數(shù)器中的內(nèi)容為零時結(jié)束循環(huán)。例如:MOVCX,-n…;循環(huán)初值部分LOOPA:…;工作部分…;修改部分INCCX;控制部分JNZLOOPA其中工作部分、修改部分被重復(fù)執(zhí)行n次,即當(dāng)(CX)=-n,-(n-1),…,-1時重復(fù)執(zhí)行,當(dāng)(CX)=0時結(jié)束循環(huán)。先將0送入循環(huán)計數(shù)器中,然后每循環(huán)一次,計數(shù)器加1,直到循環(huán)計數(shù)器的內(nèi)容與循環(huán)次數(shù)n相等時退出循環(huán)。例如:MOVCX,0…;循環(huán)初值部分LOOPA:…;工作部分…;修改部分INCCX;修改部分CMPCX,nJNELOOPA其中工作部分、修改部分重復(fù)執(zhí)行n次,即當(dāng)(CX)=0,1,…,n-1時重復(fù)執(zhí)行,當(dāng)(CX)=n時結(jié)束循環(huán)。②條件控制有些情況下,循環(huán)次數(shù)事先無法確定,但它與問題的某些條件有關(guān)。這些條件可以通過指令來測試。若測試比較的結(jié)果表明滿足循環(huán)條件,則繼續(xù)循環(huán),否則結(jié)束循環(huán)。
[例]:統(tǒng)計AX寄存器中1的個數(shù),并將結(jié)果存放在CL寄存器中?!璏OVCL,0L:ANDAX,AXJZEXITSALAX,1;將AX中的最高位移入CF中JNCL;如果CF=0,轉(zhuǎn)LINCCL;如果CF=1,則(CL)+1→CLJMPL;轉(zhuǎn)L處繼續(xù)循環(huán)EXIT:…2、單重循環(huán)程序設(shè)計所謂單重循環(huán)指循環(huán)體內(nèi)不再包含循環(huán)結(jié)構(gòu)。下面分循環(huán)次數(shù)已知和未知兩種情況討論其程序設(shè)計方法。(1)循環(huán)次數(shù)已知的循環(huán)程序設(shè)計對于循環(huán)次數(shù)已知的情況,通常采用計數(shù)控制方法來實現(xiàn)循環(huán)。(2)最大循環(huán)次數(shù)未知的循程序設(shè)計對于循環(huán)次數(shù)未知的情況,常用條件來控制循環(huán)。3、多重循環(huán)程序設(shè)計多重循環(huán)即循環(huán)體內(nèi)套有循環(huán)。設(shè)計多重循環(huán)程序時,可以從外層循環(huán)到內(nèi)層循環(huán)一層一層地進行。
4.3循環(huán)程序設(shè)計例4.3.1在BUFFER開始的地址處,有一組有符號數(shù)。要求統(tǒng)計其中負(fù)數(shù)的個數(shù)。程序:DATASEGMENTBUFFERDB2,-3,18,-24,87,-98NEQU$-BUFFERRESLTDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTARTPROC FARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVBX,OFFSETBUFFERMOVCX,NMOVDL,0LOP:MOVAL,[BX]ANDAL,ALJNSNEXTINCDLNEXT:INCBXLOOPLOPMOVRESLT,DLADDDL,30HMOVAH,2INT21HRETSTARTENDPCODEENDSENDSTART例4.3.2 在地址ADDR開始處,存放有100個無序的無符號數(shù)。要求按降序排列(大數(shù)在前、小數(shù)在后),結(jié)果仍存放到原地址區(qū)。分析:在前面的例子中,已討論過求最大值的問題,現(xiàn)在要求是在找到最大值后再找次大數(shù),且置于最大數(shù)后,以此類推,直到將所有的數(shù)都按降序排列完為止。所以,這是一個重復(fù)尋找最大數(shù)問題。每找一個最大數(shù),要逐個與數(shù)列比較,將其作為內(nèi)循環(huán)處理。當(dāng)找到一個最大數(shù)后,還要在數(shù)列中找下一個次大的數(shù),要重復(fù)使用循環(huán)程序,用控制重復(fù)執(zhí)行內(nèi)循環(huán)的程序部分作為外循環(huán)程序,這是一個二重循環(huán)程序。
源程序:DATASEGMENTADDRDB4AH,63H,27H,48H,22H,39H,…DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVCX,100-1;置計數(shù)器初值MOVSI,OFFSETADDR;取數(shù)據(jù)序列首指針LP1:MOVDX,CX;置內(nèi)循環(huán)計數(shù)器MOVDI,SI;置內(nèi)循環(huán)地址指針MOVAL,[DI];取數(shù)
LP2:INCDI;指向下一個數(shù)地址CMPAL,[DI];判大小JAENEXT;AL大,轉(zhuǎn)NEXTMOVBL,AL;否則,交換數(shù)據(jù)MOVAL,[DI]MOV[DI],BLNEXT:DECDX;本遍比較完?JNZLP2;未完,轉(zhuǎn)LP2MOV[SI],AL;完,存最大數(shù)INCSI;調(diào)整外循環(huán)地址指針LOOPLP1;未排完隊列,轉(zhuǎn)LP1RET;排完,返回CODEENDSENDSTART子程序:重復(fù)使用的程序段或具有通用性便于共享的程序段1.調(diào)用子程序用CALL指令,返回調(diào)用程序用RET指令2.現(xiàn)場的保護和恢復(fù)現(xiàn)場:指轉(zhuǎn)向子程序執(zhí)行時主程序的狀態(tài),包括當(dāng)時標(biāo)志寄存器、段寄存器、通用寄存器的內(nèi)容主程序和子程序的設(shè)計是分開進行的,為保證主、子程序所使用的寄存器不會發(fā)生沖突,進入子程序時要保護主程序的運行狀態(tài)和使用的寄存器內(nèi)容(保護現(xiàn)場),退出子程序前要恢復(fù)現(xiàn)場。現(xiàn)場的保護和恢復(fù)分別用PUSH和POP指令實現(xiàn)4.4子程序設(shè)計
調(diào)用前要預(yù)先確定子程序中要使用哪些寄存器,并定義入口參數(shù)和出口參數(shù)。參數(shù)傳遞的方法:(1)使用約定的寄存器傳遞(2)使用約定的存儲單元傳遞(3)使用堆棧傳遞(要用BP尋址)4.4子程序例4.4.2對存于ADD1地址起的20個非壓縮的十進制數(shù),要求用十進制數(shù)轉(zhuǎn)ASCII碼的子程序完成代碼轉(zhuǎn)換,并存于ADD2地址起的單元中,轉(zhuǎn)換后的字符在屏幕上進行顯示。十進制數(shù)轉(zhuǎn)ASCII碼子程序使用段間調(diào)用。源程序:NAMESUBPROGEXTRNADD1:BYTECODE2SEGMENTPARAPUBLIC‘CODE’SPRGPROCFARASSUMECS:CODE2PUBLICSPRGSTT:MOVAL,ADD1[SI]ADDAL,30HRETSPRGENDPCODE2ENDSENDNAMEEXDATASEGMENTADD1DB04H,05H,06H,02H,07H,05H,02H,03H,05H,08HDB08H,07H,09H,04H,09H,08H,05H,06H,07H,06HADD2DB20DUP(?)ADD3EQU20DATAENDSSTACKSEGMENTPARASTACK‘STACK’DW100DUP(?)STACKENDSPUBLICADD1EXTRNSPRG:FARCODE1SEGMENTPARAPUBLIC‘CODE’ASSUMECS:CODE1,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVDI,0MOVSI,0MOVCX,ADD3LP:CALLSPRG;段間調(diào)用MOVADD2[DI],ALINCDIINCSI
MOVDL,ALMOVAH,02INT21HMOVDL,‘’INT21HLOOPLPMOVAH,4CHINT21HCODE1ENDSENDSTART4.4.4調(diào)用程序和子程序間的參數(shù)傳遞一、子程序說明文件子程序說明文件主要信息:(1)子程序的名稱及其功能;(2)子程序的入口參數(shù)說明;(3)子程序的出口參數(shù)說明;(4)子程序所使用的寄存器及存儲區(qū);(5)子程序調(diào)用其它子程序的方式及名稱。二、主程序和子程序之間的參數(shù)傳遞方式1.利用寄存器傳遞參數(shù)2.利用存儲器傳遞參數(shù)
3.利用堆棧傳遞參數(shù)
利用存儲器傳遞參數(shù)舉例例4.4.4在ABCD地址起有N位帶符號十進制數(shù),其首字符表示為符號(用全0、全1碼分別表示正和負(fù))。數(shù)的高位在低地址,低位在高地址,將其轉(zhuǎn)為對應(yīng)的二進制數(shù)(負(fù)數(shù)用補碼表示),并存于ABIN起的地址單元中,限定十進制數(shù)在士65535范圍之中。
分析:為實現(xiàn)N位帶符號的十進制數(shù)轉(zhuǎn)換為二進制數(shù),將十進制數(shù)表示為下式:d0、d1、d2、d3、d4、…d(n-1),其中d0為符號位??紤]相鄰位數(shù)權(quán)值相差10倍,則該十進制數(shù)的二進制數(shù)值可用下式表示:(…((d1*1O+d2)*1O+d3)*10+…)*10+d(n-1)若符號位為正,則該值即為二進制正數(shù)值。若符號位為負(fù),則應(yīng)將該數(shù)轉(zhuǎn)為負(fù)數(shù)的補碼。為了實現(xiàn)存儲器參數(shù)傳遞,由SI作十進制數(shù)地址指針,DI作二進制數(shù)地址指針,CX指示十進制數(shù)位長。子程序返回參數(shù)由AX提供,AX=0,表示十進制數(shù)有錯或結(jié)果溢出。AX≠0,表示其內(nèi)容為正確的二進制數(shù)結(jié)果。
源程序:STACKSEGMENTPARASTACK‘STACK’DB200DUP(?)STACKENDSDATASEGMENTABCDDB0,0,0,3,4,5ABINDB3DUP(O)NEQU6DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAASSUMESS:STACKSTART:MOVAX,DATAMOVDS,AXLEASI,ABCD;置數(shù)據(jù)地址指針(含符號位)LEADI,ABIN;置結(jié)果數(shù)據(jù)地址指針(含符號位)MOVCX,N-1;置計數(shù)器初值CALLDTOB;調(diào)用DTOB子程序CMPAX,O;返回碼表錯?JNEFIN;無錯,轉(zhuǎn)FINMOVDL,‘0’;顯示‘0’,表示結(jié)果有錯。MOVAH,02HINT21HFIN:MOVAH,4CHINT21HCODEENDS
;子程序名:DTOB;功能:把由SI指出的存儲單元中的有符號十進制數(shù)轉(zhuǎn)換為二進制數(shù),結(jié)果存于AX寄存器中。;入口參數(shù):SI指向十進制數(shù)(非壓縮BCD數(shù))首址;DI指向二進制數(shù)存儲區(qū)首址;CX=十進制數(shù)位長(含符號位);出口參數(shù):AX=返回碼,AX=0,十進制數(shù)有錯或結(jié)果溢出;AX≠0,AX中為轉(zhuǎn)換后的二進制數(shù)。;使用寄存器:BX為存放各十進制數(shù)位運算值,DX存放乘積運算的高位值。DTOBPROCPUSHDX;保護寄存器PUSHBXMOVBL,[SI];取符號CMPBL,0JZPLUS;為正,轉(zhuǎn)PLUSCMPBL,OFFH;為負(fù)嗎?JNZEROR;非負(fù)非正轉(zhuǎn)EROR處PLUS:MOV[DI],BL;存結(jié)果的符號DECCXINCSIMOVAL,[SI];取十進制數(shù)高位存AX中MOVAH,0MOVDX,10NEXT:PUSHDXMULDX;AX*10→AXPOPDXINCSIMOVBL,[SI];取低位十進制數(shù)MOVBH,0ADDAX,BX;AX加上低位數(shù)JCEROR;進位,轉(zhuǎn)ERORLOOPNEXT;未處理完循環(huán)CMPBYTEPTR[DI],OFFH;判結(jié)果符號JNZDONE;非負(fù)數(shù),結(jié)束NEGAX;負(fù)數(shù),取補MOVWORDPTR[DI],AX;補碼送回JMPDONEEROR:MOVAX,0;置錯誤返回碼DONE:POPBXPOPDXRETDTOBENDPCODEENDSENDSTART利用堆棧傳遞參數(shù)舉例例4.4.5NUMB開始的地址處,有5個壓縮型BCD碼,將它們相加,其和在屏幕上顯示。源程序:STACKSEGMENTPARASTACK'STACK'DW50DUP(?)TOPLABELWORDSTACKENDSDATASEGMENTNUMBDB25H,36H,78H,49H,07HNOUTDB5DUP(?)NEQU5DATAENDS
EXTRNADDS:FARDISMACROXMOVDL,XORDL,30HMOVAH,02INT21HENDMMCODESEGMENTPARAPUBLIC'CODE'ASSUMECS:MCODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,OFFSETTOPMOVAX,OFFSETNUMBPUSHAXMOVAX,NPUSHAXCALLADDSCALLDISPMOVAH,4CHINT21HDISPPROCMOVBX,AX;存累加和MOVCL,4SHRAH,CL;右移叫工DISAH;顯示高位值MOVAH,BHANDAH,OFH;取低位數(shù)DISAH;顯示低位數(shù)SHRAL,CLDISALMOVAL,BLANDAL,0FHDISALRETDISPENDPMCODEENDSENDSTARTNAMEADDSRSCODESEGMENTPARAPUBLIC‘CODE’ASSUMECS:SCODEADDSPROCFARPUBLICADDSPUSHBPMOVBP,SPPUSHCXPUSHBXMOVCX,[BP+6];取數(shù)據(jù)項數(shù)NMOVBX,[BP+8];取數(shù)據(jù)首地址MOVAX,0ADER:ADDAL,[BX]DAAADCAH,0INCBXLOOPADERPOPBXPOPCXPOPBPRET4;退回到本例使用前的棧頂ADDSENDPSCODEENDSEND
4.5軟中斷和BIOS調(diào)用
4.5.18088/8086的中斷系統(tǒng)一、8088/8086的中斷源
軟中斷
軟中斷指令格式:INTn
n為中斷類型號,n=0~256。0~7中斷類型號做為內(nèi)部中斷不可屏蔽中斷的類型號。8~0FH做為外部硬中斷。內(nèi)部中斷(1)除法溢出中斷(2)溢出中斷(3)單步中斷二、中斷矢量表
1.中斷矢量表結(jié)構(gòu)與功能中斷矢量表存256個中斷處理程序入口地址的表,共占用1024個字節(jié),位于物理(0段)地址OOO0OH-003FFH。每個入口地址占四個字節(jié),高兩個字節(jié)存放中斷處理程序的段地址,低兩個字節(jié)存放中斷處理程序的段內(nèi)偏移量。4.5.2軟中斷程序設(shè)計及執(zhí)行過程
一、用戶軟中斷設(shè)置的內(nèi)容1.確定一個允許用戶使用的中斷類型號n。2.編寫軟中斷的處理程序,明確其入口參數(shù)及出口參數(shù)的規(guī)定。3.將中斷處理程序入口地址寫入中斷矢量表。二、中斷處理程序的結(jié)構(gòu)
1.保護現(xiàn)場2.中斷處理程序的主要內(nèi)容3.恢復(fù)現(xiàn)場4.中斷返回
中斷處理程序的一般結(jié)構(gòu):INTPRGPROC[FAR/NEAR]STI;開中斷,適合嵌套方式PUSHDS;保護現(xiàn)場PUSHDXPUSHAXPUSHBXPUSHDI┇┇;中斷處理指令序列(略)POPDI;恢復(fù)現(xiàn)場POPBXPOPAXPOPDXPOPDSIRET;中斷返回INTPRGENDP
三、填寫中斷矢量表中斷處理程序的入口地址,存放在中斷矢量表中的4n地址處。DOS系統(tǒng)25H調(diào)用填寫中斷矢量表的方法:(1)AH=25H,AL=中斷類型號n;(2)DS:DX=中斷處理程序的入口地址(段地址:段內(nèi)偏移量);(3)執(zhí)行INT21H指令,即可將中斷處理程序的入口地址寫入中斷矢量表。例:將中斷處理程序的入口地址寫入中斷矢量表CODESEGMENTASSUMECS:CODEST:┇MOVAX,SEGINTP;取中斷處理子程序段地址MOVDS,AXMOVAX,OFFSETINTP;取中斷處理子程序偏移量MOVDX,AXMOVAL,n;置中斷類型號MOVAH,25H;置DOS調(diào)用功能號INT21H┇INTPPROC;中斷處理程序┇IRETINTPENDPCODEENDSENDST四、軟中斷執(zhí)行過程CPU在執(zhí)行完指令I(lǐng)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 散客旅游合同范本在線查看
- 企業(yè)車輛交易協(xié)議書模板
- 2024體育賽事場地租賃合同
- 2024版土石方運輸合同
- 農(nóng)村個人購房合同范例
- 合伙協(xié)議書范例
- 如何簽訂借款合同避免風(fēng)險
- 個人汽車買賣合同樣本模板
- 2023年高考地理專題復(fù)習(xí)新題典題精練-洋流(原卷版)
- 致大海選擇性必修中冊 第四單元課件
- 服務(wù)質(zhì)量、保證措施
- (必練)廣東省軍隊文職(經(jīng)濟學(xué))近年考試真題試題庫(含答案)
- 含羞草天氣課件
- 2024年安全生產(chǎn)知識競賽考試題庫及答案(共五套)
- 22《鳥的天堂》課件
- 農(nóng)業(yè)灌溉裝置市場環(huán)境與對策分析
- 新疆烏魯木齊市第十一中學(xué)2024-2025學(xué)年八年級上學(xué)期期中道德與法治試卷
- 2024年江西省高考地理真題(原卷版)
- 部編版小學(xué)五年級上冊道法課程綱要(知識清單)
- 經(jīng)濟法學(xué)-計分作業(yè)一(第1-4章權(quán)重25%)-國開-參考資料
- 山東省臨沂市(2024年-2025年小學(xué)四年級語文)人教版期中考試(上學(xué)期)試卷及答案
評論
0/150
提交評論