下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第四順序結(jié)構(gòu)程序分支結(jié)構(gòu)程序循環(huán)結(jié)子程序設(shè)中斷程序2匯編語言編程一般編制一個匯編語言程序的步分析題意,確定算法。首先分析理解題意,找出合理的算法及的數(shù)據(jù)結(jié)構(gòu),這是決根據(jù)算法畫出程序流根據(jù)框圖編寫程上機調(diào)試程序3程序的基本易出現(xiàn)。用匯編語言編程,更要注意程序的結(jié)構(gòu)問題4順序結(jié)構(gòu)程序順序結(jié)構(gòu)程序5順序結(jié)構(gòu)程序設(shè)計題目:求兩個數(shù)的和,設(shè)兩個數(shù)分別存放在X和Y中,將X和Y相加后存入Z中。程序如下DATAXDBYDBZDWDATACODESTART:MOVAX,DATAMOVMOVAL,XMOVAH,0ADDAL,YADCAH,0MOVZ,AXINT21HCODEEND
;將其和送入Z6分支結(jié)構(gòu)程序主要內(nèi)容分支程序的結(jié)構(gòu)形標(biāo)無條件轉(zhuǎn)移指條件轉(zhuǎn)跳躍表程序舉7分支程序的結(jié)構(gòu)8標(biāo)(J)令(CL)。與變量類似,標(biāo)號有段(GMNTFT(DITNCE)段,時現(xiàn)移不需要修改代碼段寄存器C,僅僅需要修改NENER的轉(zhuǎn)移指令JM或CL,那么現(xiàn)轉(zhuǎn)就不僅是修,C該定義為。NAR-HORT標(biāo)號的屬性需要在定義標(biāo)號時9標(biāo)號的定義標(biāo)號的隱含說@:ADDAX,100標(biāo)號的定義用EQU偽指令定義標(biāo) EQUTHIS EQUTHISFAR 標(biāo)號的定義用LABEL偽指令定義標(biāo)號的第三種定義方法是使用LABEL偽指令顯式地定例如 LABELMOV LABELAND其中標(biāo)號為NE標(biāo)號,標(biāo)號5為LALQU一樣,既可以定義NAR標(biāo)號,也可以定義NEAR屬注意:使用EQU偽指令和LABEL偽指令所不同的是,前者在EQU與屬標(biāo)號的定義同一位置定程序中的同一位置定義兩個距離屬性不同的標(biāo)號,可以提高標(biāo)號的活性 LABELL7:XOR其中,標(biāo)號L6和標(biāo)號L7的段屬性和位移量屬性是一樣的L6為FAR,L7為NEAR其他段的JMP指令轉(zhuǎn)移到此處時,用JM指令的遠轉(zhuǎn)移操作數(shù)JM在EQU偽指令中用THIS操作符同樣可以給L7處定義另一標(biāo)號名稱,此標(biāo)距離屬性被指明為FAR,用以提高標(biāo)號的靈活性。上面的偽指令和指令 EQUTHISL7:XOR取標(biāo)號屬性操取標(biāo)號段屬性式:SEG標(biāo)號名功能:MOVAX,SEG ;將標(biāo)號L2所在段的基址送至取標(biāo)號位移屬格式:OFFSET功能:MOVBX,OFFSET ;將標(biāo)號L2相對于所在段段首的位移量送至取標(biāo)號類型格式:TYPE功能:返回的是標(biāo)號的屬性NEAR14FAR。無條件轉(zhuǎn)移X6CS器的內(nèi)容決定。CS器中存有當(dāng)代碼段的址,內(nèi)為C相結(jié)合(CS)+(I)。,執(zhí)的一指已器取放在CUIUC80X86有四組控制程序轉(zhuǎn)移的指令(1)無條件轉(zhuǎn)移指令(2)條件轉(zhuǎn)移指令(3)循環(huán)控制指 (4)中斷指無條件轉(zhuǎn)移格式:JMP目標(biāo)操作數(shù)其中目標(biāo)操作數(shù)可以是標(biāo)號,可以是寄存器,可以是內(nèi)存操作數(shù)當(dāng)目標(biāo)操作數(shù)為標(biāo)號時,轉(zhuǎn)移到標(biāo)號所在位置執(zhí)行當(dāng)目標(biāo)操作數(shù)為16位通用寄存器時,則用該通用寄存器內(nèi)容修改不變,實現(xiàn)段內(nèi)轉(zhuǎn)移CJMPHORTJMP的多種轉(zhuǎn)移方式段內(nèi)直接短轉(zhuǎn)段內(nèi)直接近轉(zhuǎn)移或隱含的段內(nèi)短段間直接轉(zhuǎn)寄存器段內(nèi)間接器段內(nèi)間接轉(zhuǎn)器段間間接(1)段內(nèi)直接短格式:JMPSHORT標(biāo)號功能:-~JMHOTJMP的多種轉(zhuǎn)移方式段內(nèi)直接近轉(zhuǎn)移或隱含的段內(nèi)短格式:JMP標(biāo)號其中,標(biāo)號為NEAR屬功能:在標(biāo)號為NRJPJMPHOTJMJ將本轉(zhuǎn)移指令匯編為3字節(jié)的段間直接轉(zhuǎn)格式:JMP標(biāo)號其中,標(biāo)號為FAR屬功能:匯編程序根據(jù)遠標(biāo)號并且將標(biāo)號所在的段地址和位移分別送CS和IP以實現(xiàn)跨代碼段的轉(zhuǎn)JMP的多種轉(zhuǎn)移方式寄存器段內(nèi)間接轉(zhuǎn)格式:JMP16位通用寄存功能:CS不變,通用寄存器的內(nèi)容送IP,實現(xiàn)段內(nèi)轉(zhuǎn)移一個通用寄存器(16位),它的內(nèi)容是JMP的轉(zhuǎn)移目標(biāo)在當(dāng)前CS尋址的段的位移量JMPSI
;把控制轉(zhuǎn)向;把控制轉(zhuǎn)向;把控制轉(zhuǎn)向JMP的多種轉(zhuǎn)移方式器段內(nèi)間接轉(zhuǎn)格式:JMP器字變功能:CS不變,器字變量內(nèi)容送IP,實現(xiàn)段內(nèi)轉(zhuǎn)移 DWDWDW…MOVJMPNEAR_LABEL_ARRAY[DI];轉(zhuǎn)移到L1…MOVJMPNEAR_LABEL_ARRAY[DI];轉(zhuǎn)移到L3JMP的多種轉(zhuǎn)移方式器段間間接轉(zhuǎn)格式:JMP功能:字變量的內(nèi)容中的字分別修改CS和IP,實現(xiàn)段間轉(zhuǎn)移JMPJMPDWORDPTR[BX][SI]JMPALPHA[BP][DI]指一般通過器實現(xiàn)用令所的雙字指針的第一個字取代CS的內(nèi)容。用DWRDRJM條件條件轉(zhuǎn)移條件轉(zhuǎn)移的依條件轉(zhuǎn)移的三種判斷出比較CMP與測試指令算術(shù)運算、邏輯運算、移位指令與條件條件轉(zhuǎn)移指令-~之間?!癑umpIF…”若條件滿足則轉(zhuǎn)(CForAbove/NotBelownorEqual高于/不低于等于AboveorEqual/NotBelow于或等Below/NotAbovenorEqual低于/不高于、等于(CForBeloworEqual/NotAbove低于或等于/不高于Carry進位為1Equal/Zero等于((SFxorOF)orGreater/NotLessnorEqual大于/不小于,等于(SFxorGreaterorEqual/NotLess大于或等于/不小(SFxorLess/NotGreaternorEqual小于/不大于,等于條件轉(zhuǎn)移指令“JumpIF…”若條件滿足則轉(zhuǎn)((SFxorOF)orLessorEqual/NotGreater于或等NotCarry進位標(biāo)志為“0”NotEqual/NotZero不等于NotOverflow無溢出Overflow溢出NotParity/Parityodd非奇/奇Parity/ParityEven奇轉(zhuǎn)/偶NotSign符號標(biāo)志為零,即正數(shù)Sign符號位為1,即負數(shù)條件轉(zhuǎn)移的依據(jù)是標(biāo)志寄88條件轉(zhuǎn)移指令就是根據(jù)標(biāo)志寄存器的狀態(tài)進行判斷轉(zhuǎn)移序執(zhí)行的條件轉(zhuǎn)移的三種判斷出發(fā)點從用戶的角度出發(fā)80X86提供了以下3種判斷轉(zhuǎn)移的方 根據(jù)標(biāo)志寄存例如,JZ ;如果ZF=1轉(zhuǎn)移到L1執(zhí)行,否則順序執(zhí)行2按照無符號數(shù)進行判斷轉(zhuǎn)移。判斷兩個無符號數(shù),有高于Above)、等于E(Equal)、低于B(Below)之分,于是:
低于等于/不高等于/結(jié)果為不等于/結(jié)果不為條件轉(zhuǎn)移的三種判斷出發(fā)點)()、等于E(u)()
不等于/結(jié)果不為比較CMP與測試指令CMP格式:CMP目標(biāo)操作數(shù),源操作功能:模擬目標(biāo)減源的減法數(shù)TEST格式:TEST目標(biāo)操作數(shù),源操作功能:模擬目標(biāo)與源的與操作,并且影響標(biāo)志寄存器,而不改變目標(biāo)操作數(shù)注意使用CMP與SUB,TEST與AND能夠進行相同的判斷轉(zhuǎn)移,但CMPTEST均不改變被判斷的操作數(shù),而SUB與AND負數(shù)以補碼形式存做為無符號數(shù)進行的,因此-1高于3CMP與TEST指令1MOVAL,-MOVBL,3SUBAL,BLJLL1;-4送;由于-1小于3,即AL小于BL所以轉(zhuǎn)移到L1執(zhí)2MOVAL,-MOVCMP;AL不變,僅僅影響標(biāo)志JBE;由于-1作為無符號數(shù)是0FFH高于3,即AL于BL所以順序執(zhí)行,不轉(zhuǎn)3MOVMOVBL,41HANDBL,AL;0送JNZ;因為結(jié)果為0所以順序執(zhí)行,不轉(zhuǎn)4MOVMOVTEST;不改變BL,但模擬運算結(jié)果為0,置ZF為JNZ;因為結(jié)果為所以順序執(zhí)行,不轉(zhuǎn) 【例】已知AX中放有一個帶符號數(shù),編寫程序段,計算它的絕對值【分析】圖4.2是完成例4.6︰CMPJGE
;
AX<0 YAX←或等于跳轉(zhuǎn),轉(zhuǎn)到AX←MOV
MOVSUB
;AX←0-lab1:
圖4.2計算AX算術(shù)/邏輯運由于所有算術(shù)運算、邏輯運算、移位指令均影響標(biāo)志寄存器狀態(tài),因此所這些指令都可以與條例如MOVAL,-ADDAL,1結(jié)果為0,置ZF為JZ ;轉(zhuǎn)移到L1MOVMOVMULJS
;結(jié)果最為0,整;為正不轉(zhuǎn)MOVAL,80HSHLAL,1JNCL1
;80H左移1位進入進位位,CF置;進位位為0時轉(zhuǎn)移,這里為1不轉(zhuǎn)移,順跳躍在實現(xiàn)CASE結(jié)構(gòu)時,可以個程序分支去例如:根據(jù)AL寄存器中哪一位是1,把程序轉(zhuǎn)移到8個不同的程序分支去BRANCH_TALBLEDWDWROUTINE_2DWROUTINE_3DWROUTINE_4DWROUTINE_5DWROUTINE_6DWROUTINE_7DWBRANCH_ADDRESS上面定義了數(shù)據(jù)段,是一個地址變量表,8個變量分別指向8程序例4.2.1題目:編寫程序?qū)崿F(xiàn)三個數(shù)比較大小,從高到低輸出結(jié)設(shè)計思路:從鍵盤讀入3個字符分別到BH,BL,CL寄存器,然MOVAH,1INT21HMOVBH,ALMOVAH,1INT21HMOVBL,ALMOVAH,1INT21HMOVCL,AL
;讀入一個字CMPBH,MOVDL,CMPBH,MOVDL,JAEXCHGBH,BLCMPBH,CLINT21HMOVDL,CLINT21HJAEXCHGBH,CMPBL,JAEXCHGBL,MOVDL,INT;讀入一個字4.2.6程序例4.2.2題目:在附加段中,有一個按從小到大初始化low, mid(low+high)/
arrdw45,46,54,57… ax, <
ds es Highmid-AX,CX,DX,SI,CX,
CX, CX,
SI,
, SI,1 SI,DI AX,ES:[SI]
SI, AX, HIGH_IDX,:
LOW_IDX,1BX,ES:[DI]HIGH_IDX,BX,
LOW_IDX, 循環(huán)結(jié)構(gòu)程序主要內(nèi)容循環(huán)程序的結(jié)構(gòu)形循環(huán)控制指單重循多重循程序舉循環(huán)程序的結(jié)構(gòu)循環(huán)程序就是程序中某段指令循環(huán)程序可分為兩種結(jié)構(gòu)形DOWHIL形:,DO_UNTIL 循環(huán)程序的結(jié)構(gòu)循環(huán)程序一般由以下三部分組成 設(shè)置循環(huán)的初始狀態(tài)。初始化循環(huán)控制變量、循環(huán)體所用到變量循環(huán)體。作部分3 循環(huán)控制部分。循環(huán)控制循環(huán)指令一般使用CX它主要包括LOOP:每次使CX的值遞減,并且判斷CX為0時跳轉(zhuǎn)的循環(huán)指JCXZ:當(dāng)CX為0時跳轉(zhuǎn)的條件轉(zhuǎn)移指CX遞減,并且判斷CX與ZF標(biāo)志的組合是否滿足條件的雙重條件循環(huán)制指令-~循環(huán)控制LOOP(LoopUntilComplete)指格式 ;循環(huán)計數(shù)器LOOCXCXCX不為CX為O題目:編寫程序輸出26個大寫英文字符mov.modelmovcx,26movdl,'A'incdlloopl1movint循環(huán)控制LOOPE(LoopWhileEqual)/LOOPZ(LoopWhileZero) LOO與LOCX減1,然后判斷。若CX不為而且Z=OO/LOO例4.3.1題目:已知9個數(shù)字,找出第一個不能夠被3整除的數(shù),并且顯示在數(shù)列中的位設(shè)計思路:逐個判斷每一個數(shù)是否能被3整除,如果不能被3整除,輸出其在位置,結(jié)束;否則繼續(xù)判斷下一個本程序中當(dāng)一個數(shù)除以3余數(shù)不為0時ZF=0,遇LOOPZ指令跳出循循環(huán)控制指令(例DATAARRAYDB0,0,0,3,0,0,4,34,25,30COUNTEQU$-OFFSETARRAYDATAENDSCODEBEGIN:MOVAX,DATAMOVDS,MOVCX,MOVDI,NEXT:INCMOVMOVBH,3DIVBH
;-循環(huán)控制指令(例 MOVDL,JMPOKENTRY:MOVORDISPLAY:MOVINT21HINT21H END
;沒找;顯示輸出一個;顯示非零元素的下標(biāo)循環(huán)控制LOOPNE(LoopWhileNotEqual)/LOOPNZ(LoopWhile格式:LOOPNE/ ;循環(huán)計數(shù)器功能:LOON和LOONZX減CX不為而且ZF=例4.3.2題目:已知9個數(shù)字,找出第一個能夠被3整除的數(shù),并且顯示其數(shù)列中的位設(shè)計思路:逐個判斷每一個數(shù)是否能被3整除,如果能被3整除,輸出其所的位置,結(jié)束;否則程序說明:本程序中一個數(shù)除以3后,余數(shù)為0時置ZF=1,遇LOOPNE時出循循環(huán)控制JCXZ(JumpifCX/ECXisZero)格式 ;CX為0時程序轉(zhuǎn)功能:JCXZ指令在寄存器CX等于()將此指令安排在循環(huán)的開端,若CX的值為0就越過該循環(huán)(行“零遍”)將此指令安排在帶條例4.3.3題目:已知9個數(shù)字,找出所有不能夠被3整除的數(shù),并且顯示其數(shù)列中的位置設(shè)計思路:找到不能被3整除的數(shù)后循環(huán)控制指令(例DATAARRAYDB0,0,0,3,0,0,4,34,25,30COUNTEQU$-OFFSETARRAYDATAENDSCODEBEGIN:MOVAX,DATAMOVDS,MOVCX,MOVDI,NEXT:INCMOVMOVBH,3DIVBHJE
;-循環(huán)控制指令(例OKENTRY:MOVOR
;顯示非零元素的下標(biāo)DISPLAY:MOVINT21HMOVDL,''INT21HNOENTRY:DECJCXZEXITJMP MOVINT END 單重常見的循環(huán)設(shè)計方法C語言中的for循for(inti=0;i<…MOV INCLOOP…單重C語言中的whilewhile(i<…MOVL1:CMPINCaINCALJMPL1 單重C語言中的do}while(i<…MOV INCINCALJNEL1 單重例4.3.4程序計算S=1+2+3+4+…+100,并且以十進制形單重這就是一個簡單的循環(huán)程序,沒有變址的循環(huán)稱為簡單循環(huán)MOVAX,0MOVCX,100 3條指令是循環(huán)的初始化部分(包括送入循環(huán)初始值等)。下面L:ADDINC LOOP多重個循環(huán)程序。多重循環(huán)例4.3.5題目:輸入3~9之間的一個數(shù)n,輸出一個由*組成的* 多重循環(huán)實例(例4.3.5代碼.MODEL.STACKBEGIN:MOVINT21HCMPAL,33HJBBEGINCMPAL,39HJABEGINSUBAL,30HMOVCL,ALMOVCH,0MOVAH,2MOVDL,0DHINT21HMOVDL,0AHINT21H
;讀入一個字;非0~9重新輸;ASCII轉(zhuǎn)二進制;循環(huán)次數(shù)送;CH置;輸出回車、換多重循環(huán)實例(例4.3.5代碼
PUSHCX;外層循環(huán)次數(shù)壓棧保護,同時CX作為新的內(nèi)層循環(huán)次MOVDL,’*’;輸出n個INT21HLOOPL2MOVINT21HMOVDL,0AHINT21HPOPCXLOOPL1INT21HEND
;輸出回車、換;回復(fù)外層循環(huán)次;外層循環(huán)次數(shù)減1,不為0轉(zhuǎn);為0結(jié)多重循環(huán)例4.3.6題目:輸入3~9之間的一個數(shù)n,輸出一個由*組成的 設(shè)計思路:上邊框與下邊框均為一行輸出n個*。中間行為n-2行,每行均左邊一個*,中間n-2個空格,右邊一個*程序說明:上邊框與下邊框用單重循環(huán)實現(xiàn)。中間行n-2為行數(shù),每一行輸出一個*,又輸出n-2個空格,再輸出一個*,重循環(huán)實多重循環(huán)實例(例4.3.6代碼.MODEL.STACKBEGIN:MOVINT21HCMPAL,33HJBBEGINCMPAL,39HJABEGINSUBAL,30HMOVCL,ALMOVCH,0MOVBX,CXMOVAH,2MOVDL,0DHINT21HMOVDL,0AHINT21H
;讀入3~9數(shù)字符;非3~9重新輸;是3~9,n換成2進制;n送;0送CH,循環(huán)次數(shù)在;n送;輸出回車、換行,使輸多重循環(huán)實例(例4.3.6代碼MOV;輸出上邊框n個MOVINTLOOPMOV;輸出回車、換INTMOVINTMOV;取n到SUBPUSH;n-2送CX,作為中間n-2行的循環(huán)計;開始除第1行和最后一行外,中間n-2行循環(huán)計;因內(nèi)層循環(huán)也用CX計數(shù),故壓棧保護外層循環(huán)計MOVMOVINT
;輸出中間行最左邊的多重循環(huán)實例(例4.3.6代碼
MOVCX,BXSUBCX,2MOVDL,''MOVAH,2INT21HLOOPL2MOVDL,'*'MOVAH,2INT21HMOVDL,0DHINT21HMOVDL,0AHINT21HPOPCXLOOP
;中間行每行n-2個*的內(nèi)層循環(huán)計;內(nèi)層循環(huán)輸出n-2個;輸出中間行的回車、換;恢復(fù)中間行外層循環(huán)計;中間行不夠n-2轉(zhuǎn)L1輸出下一行,否則順序執(zhí)多重循環(huán)實例(例4.3.6代碼
MOVCX,BXMOVDL,'*'MOVAH,2INT21HLOOPL4MOVDL,0DHINT21HMOVDL,0AHINT21HINT21H
;開始輸出下邊框的n個*,方法同上邊;結(jié)END多重循環(huán)
15551555aa 例4.3.7題目:5階方陣轉(zhuǎn)置,編出將矩陣A轉(zhuǎn)置的程序,轉(zhuǎn)后仍放在原處,其中K、M、O、L為省略了的設(shè)計思路:j與j(j<)交換。具體a152,2,,23,與第二列的2a425對,與第三列的353與第四列的,,,4,不動。這樣,進行階矩陣轉(zhuǎn)置(若將NN-)就是外循環(huán)的循環(huán)三列需要交換的元素個數(shù)為1,而CXX寄存器的內(nèi)容。多重循環(huán)設(shè)計思路多重循環(huán)實例(例4.3.7代碼 ADW4050H,0003H,5678H,6400H,0009HDW0099H,0084H,9080H,4587H,0000HDW1045H,0000H,0001H,0008H,0007HDW1020H,4321H,5432H,6599H,1256HDW
STACKSEGMENTPARASTACKSTAPNDW20 EQU$-OFFSETSTAPNSTACKENDS多重循環(huán)實例(例4.3.7代碼 ASSUMEMOVMOVDS,AXMOVSS,AXMOVAX,TOPMOVSP,AXMOVCX,4MOV多重循環(huán)實例(例4.3.7代碼LOOP1:PUSHMOVMOVPUSHA[BX+SI]POPA[BX+SI]POPA[BX+DI]ADDSI,2ADDDI,0AHLOOPLOOP2ADDBX,0CHPOPCXLOOPLOOP1
INT21HEND程序例4.3.8編制程序把BX寄存器內(nèi)的二進制數(shù)十六進制的形式在屏幕上顯示出12344.3.5程序舉例(例4.3.8movch,rotate:movcl,rolbx,moval,andal,addal,cmpal,; addal,;printit:movdl,movah,intdec
4.3.5程序例4.3.9在ADDR單元中存放著數(shù)Y的地址,編制程序把Y中1個數(shù)存入COUNT單元中
DATAREA
………
ASSUMECS:PROGNAM,DS:DATAREA
AX, ,DS,初始化初始化NNYYCSHIFTEXIT:
CX,0 BX,ADDR AX,[BX] AX,0FFFFH AX,1 COUNT, 4.3.5程序例4.3.10在附加段中有一個首地址為LIST的排序的字?jǐn)?shù)組,的DI寄存器中。AX寄存器中存放著一個數(shù)。要求編程在數(shù)組找該數(shù),如果找到該數(shù)則把它從數(shù)組中……993 NY NY NNY
DI,
T
BX,ES:[DIES:[DI-2],DI,T:
WORD……例4.3.11編制程序?qū)⒄龜?shù)N插入一個已排序的字?jǐn)?shù)組的正確位置?!璂ATAREA
N
CS: AX, AX, DS (ARRAY_HEAD-2)-
AX, ARRAY_HEAD-2, , AX,ARRAY_END[SI] BX, NK
,
ARRAY_END[SI+2], 例4.3.12邏輯尺。設(shè)有數(shù)組X和Y,X中有X1,X2…,X10;Y中Y1,Y2…,Y10,編制程序計Z1=X1+Y1,Z2=X2+Y2,Z3=X3-Y3,Z4=X4-Y4,Z5=X5-Z6=X6+Y6,Z7=X7- Z8=X8-Y8,Z9=X9+Y9,結(jié)果存入Z數(shù)組中…XY…XYZ10X… … …Z………
, AX, ……77
AX,DS
,0,0,,,,1 AX, AX,BX,2Y ……AA
ASSUMECS:PROGNAM, AX, AX, DS (COUNT1)N- (COUNT1)N-DI,,0DI,,0,,N(COUNT2)(COUNT2)-YY N AX,A[BX+2] A[BX],AX(COUNT1)(COUNT1(COUNT1)(COUNT1)-
BX,2CX,
…8…8…T
例4在附加段中有一個字?jǐn)?shù)組,其首地址已存放在寄存器ASSUME例4在附加段中有一個字?jǐn)?shù)組,其首地址已存放在寄存器 AX, DS
YN 交換標(biāo)志 Y N START_ADDR,DI CX,ES:[DI]
DI,TT,,1T CX DI,START_ADDR DI, AX,ES:[DI ES:[DI+2],AX ES:[DI+2],AX ES:[DI],AX BX,BX BX,0子程序主要內(nèi)容過程的定義子程序的調(diào)用和返模塊間的調(diào)用和轉(zhuǎn)寄存器的保子程序的變量傳嵌套與遞歸子程程序舉子程序子程序又稱為過程,它相當(dāng)于高級語言中的過程過程的定義和將一特定的指令序列編成一個過程的方法,稱作“過程定義”。用對偽指令PROC/ENDP定義一個過程,其格式如下AMEPROC… ;其中
AMEMROCNDND前面的過程名一定要和ROC偽指令PROC和ENDP必須成對出現(xiàn),表示過程的開始和結(jié)束過程的定義和NENRRNR在一個過程中至少有一個RTRT主程序可以定義為過程也可以不定義為過程,若不定義為過程,應(yīng)以INT21H的4CH號功能結(jié)束過程的定義和編寫過程的重要一環(huán)戶仍能正確快速地使用過程的說明信息一般包括過程名稱、功能、出口參數(shù)、單元、所用存器、作者、編寫時間等內(nèi)功能描所用額 單
;可選項,最好采用寄存;可選項,可以減少為子
;可選項,盡量避免 參數(shù)外還有其它的要;可選項,為將來 提供信;可選項,用于確定程序是否是版子程序的調(diào)用和如果被調(diào)用子程序的屬性是近的,那么,CALL它把該指令之后地址的偏移量(用一個字來表示)壓棧,把被調(diào)用子程地址的偏移量送給指令指針寄存器IP即可實現(xiàn)執(zhí)行程序的轉(zhuǎn)寄存器CS的值壓進棧。在此之后,再把被調(diào)用子程序地址的偏移量和子程序的調(diào)用和子程序調(diào)用舉例;DISPLAY是子程序;BX的內(nèi)容是子程序的偏移;WORD1是內(nèi)存字變量,其值是子程序的偏移;DWORD1是雙字變量,其值是子程序偏移量和段wordptr;BX所指內(nèi)存字單元的值是子程序的偏移dwordptr;BX所指內(nèi)存雙字單元的值是子程序的偏移量和段子程序的調(diào)用和當(dāng)子程序執(zhí)行完時,需要返回到調(diào)用它的程序之中。為了實現(xiàn)此能,指令系統(tǒng)提供了一條的子程序返回指令。其格式如下RET/RETN/RETF近返回:RET指令將SP所指向的棧頂字(斷點的位移量)彈出送至指令指器IP中,并將SP加遠返回:RET指令先彈出棧頂之值送到IP中,再彈出棧頂之值送到CS并再將SP加子程序的調(diào)用和RET
;;;子程序返回后,(SP)←(SP模塊間的調(diào)用和OJJX文件。J成一個真正的執(zhí)行文件。模塊間的調(diào)用和轉(zhuǎn)移的程序結(jié)公用說明偽指令PUBLIC格式 符號說明:外部說明偽指令EXTRN格式:EXTRN名稱:類型說明:ULI塊給它的類型說明一致功能:EXTRN偽指令把某些符號的段和類型的屬性告訴匯編程序。這些號是本模塊所要使用須用PUBLIC偽指令來說明這些。寄存器的保護和寄存器與器一樣對于所有的程序都是公用的。當(dāng)調(diào)用者調(diào)用一個過程時,如果該TESTPUSHAXPUSHBXPUSHCXPOPCXPOPBXPOPAXTEST如果需要的話,使用PUSHF和POPF保護和恢復(fù)標(biāo)志寄存子程序的變量 寄存器傳遞由于CPU賦值后,在另一個程序中就能直接使用,所以,用寄存器來傳遞參數(shù)最簡便,也是最常用的參數(shù)傳遞方但是,CPU較少的參數(shù)信息例如子程序處理的數(shù)據(jù)被保存在寄存器AL中。假設(shè)有…AL,;子返回…AL,…;子返回時,AL的值不變,因為’2’不是字子程序的變量約定單元傳遞參限,不采寄器遞數(shù)方,要用定元若調(diào)用程序和子程序在同一模塊(源程序)中,子程序可以直接塊中的變?nèi)魠?shù)較多,可以通過地址表傳遞參數(shù)地址。此方式不是直接把參數(shù)給子程序,而是把它們的地址(一般是首地址)告訴子程序子程序的變量堆棧傳遞參要特別仔細。主程序把參數(shù)或參數(shù)地址壓入堆棧,子程序使用堆棧中的參數(shù)或通過棧中的參數(shù)地址取到通過堆棧傳送參數(shù)或參數(shù)地址:必須注意,子程序結(jié)束時的RET指令使用帶常數(shù)的返回指令,以便返回主程序后,堆?;謴?fù)原始狀態(tài)不變嵌套與遞歸子子程序的嵌L和RT堆棧上溢:如堆棧已滿,但還想再存入信息,這種情況稱為堆棧上溢堆棧下溢:如堆棧已遞歸子程子程序自己調(diào)用自己的情況稱為遞歸調(diào)用,這程序稱為遞歸子程序程序:和過中要求過程累加數(shù)組中的所有元,并把和(不考溢送到指定的 元去。例4.4.1過程PROADD直接 例4.4.2通過地址表傳送變量的方法傳遞參數(shù)。中斷程序主要內(nèi)中斷及中斷相關(guān)軟件DOS中斷服BIOS中斷中斷處理程序的編中斷處理中斷及中斷相關(guān)斷就使理暫時掛當(dāng)前正進的工作序,原有工作的整個過中請
前程序斷程
程中斷程
中斷返中斷的中斷源:在中斷過程中,引常見的中斷源大致分為CPU外部產(chǎn)生的中斷和CPU內(nèi)部產(chǎn)生的中斷外部中斷源包括通過NMI引腳傳遞的非中斷和通過In8259A可編程中斷控制器傳遞的外部中斷等。CPU通過8259來管理外部中斷。外部設(shè)備的中斷通過8259A的INTR引腳給CPU傳送中斷信號,8259A還可以使CPU內(nèi)部中斷則包括除法出錯中斷、單步中斷、INTO指令產(chǎn)生的溢出中和程序中安排的INTn中斷指令產(chǎn)生的中斷等中斷的中斷的分類:外部不可中斷不可中斷是用來處理一些緊急情況,如電源故障、內(nèi)存或I/O總線的奇偶錯誤可中斷可中斷通常來自外部設(shè)備,可以通過指令設(shè)置中斷控制器的參數(shù)來某中斷的分類:外部中斷的分類:外部例如,假設(shè)只允許系統(tǒng)定時器中斷,系統(tǒng)定時器的中斷請求對應(yīng)8259AIRQ0,于是可如下設(shè)置中斷寄存器 CPU0,CPU應(yīng)任外設(shè)求的斷為CPU響外的F
;開中斷;關(guān)中斷CFLGFIRTFLGFT。中斷的分類:內(nèi)部內(nèi)部中斷主要包括內(nèi)部硬件中斷和軟件中內(nèi)部硬件中斷是指由某些特殊指令觸發(fā)的中軟件中斷則是指由指令I(lǐng)NTn引起的非 中斷的分類:內(nèi)部硬件除法出錯中斷,中斷類型號為MOVMOVBX,1 XXXH中斷的分類:內(nèi)部溢出中斷,中斷類型號為OF置當(dāng)執(zhí)行溢出中斷指令TH類中斷,若OF標(biāo)志為TO單步中斷和斷點中在使用DEBUG調(diào)試程序時,會經(jīng)常使用到T命令和P命令,而這兩個命令軟件中CPU在執(zhí)行完一條INTn指令后,就會立即產(chǎn)生n類軟件中斷,調(diào)用系統(tǒng)中應(yīng)的中斷處理程序完成中斷的功能。其中INTn指令的n為中斷類型號中斷向在中斷發(fā)生后,中斷處理程序需要對因觸發(fā)的相應(yīng)中斷進行處理80X86中斷系統(tǒng)能處理256種類型的中斷,同時給每種中斷安排了一個中類型號,即0H~0FFH號中斷,每種類型的中斷都有相應(yīng)的中斷處理程如何有效地管理和保利用中斷向量表在8X8微機系統(tǒng)中,該表保存的61于器中地址00H3FFH。中斷向中斷向中斷向各個中斷處理程序 地址在中斷向量表中是按中斷類型號順序存放的因此將中斷類型號乘以4例如,溢出中斷的中斷類型號為HH1H40H1H1H和1H和C,CU以DOS中斷INT20H為例,說明CPU處理各類中斷的過程,該過程主要包以下5個步取中斷的中斷類型計算中斷向量地轉(zhuǎn)向相應(yīng)的中斷處理程中斷返回到原中斷指中斷向中斷指令 下一條指令 AX,
……
內(nèi)存單 … 存放于內(nèi)存單元的中斷處理程中斷處理中斷系統(tǒng)要合理地管理眾多中斷源,就需要具備以下十分完善的“中斷處機制當(dāng)中斷源向CU發(fā)中斷請時,CPU,返回斷點處繼續(xù)執(zhí)行。U續(xù)不斷的,即中斷處理
軟件件中斷。當(dāng)用戶想要編制和使用自己的中斷服務(wù)程序時,先應(yīng)該確定中斷類型;根據(jù)中斷類型確定該中斷在中斷向量表中的位置;然后將自己編制的中在程序中遇到INT20H時,該指令產(chǎn)生中斷類型號為20H的中斷,該中斷在D0000:0080L4,就會得到如下結(jié)果:0000:00807210A7 結(jié)果中的“7210A700”就代表以0000: 開始的字節(jié)內(nèi)存單元的進制軟件中斷的處理根據(jù)顯示的結(jié)果看出INT20H所對應(yīng)的中斷服務(wù)程序 地址00A7:1072在接收INT20H指令后,CPU將自動進行如下的操 將標(biāo)志寄存器(FLAGS)壓入堆 將當(dāng)前代碼段寄存器(CS)的內(nèi)容壓4將當(dāng)前指令指針(IP)壓棧,步驟(3)、(4)的目的是確保中斷處理完畢后能夠正確地返回中斷調(diào) 轉(zhuǎn)向內(nèi)存地址00A7:1072處進入中斷服務(wù)軟件中斷的處理在中斷服務(wù)程序執(zhí)行完后,即CPU接收到IRET指令從堆棧中將保存的原指令指針I(yè)P的內(nèi)出到IP中從堆棧中將保存的原段寄存器CS的內(nèi)出到CS中FLG志寄存器狀態(tài)。由中斷處理過程可以看出,軟件中斷指令非常類似于子程序調(diào)用的CALL指,即:暫停當(dāng)前程序CPU都自動恢復(fù)原程序的執(zhí)軟件中斷的處理但兩者之間還是有明顯區(qū)別的。它們的主要差異有以下幾點子程序調(diào)用是程序員在編寫源程序先安排好的,而中斷是由中源根據(jù)自身的需要產(chǎn)生的,是不可預(yù)見的(用指令I(lǐng)NT引起的中斷除外)2子程序調(diào)用是用CLL斷請求的事件(INT)。3子程序的返回指令是RT束時的返回指令是IRTIRTIRT和標(biāo)志的功能。DOS中斷由軟盤或硬盤提:輸入/輸出設(shè)備處理程序。它提供了DOS到ROMBIOS低級接口:一個文件管理程序和一些處理程序。它又高了一級。關(guān)系圖如DOS中斷中斷類型中斷向量地功程序終DOS系統(tǒng)功能調(diào)程序終止DOS返回地Ctrl_C中斷向嚴(yán)重錯誤中斷類型中斷向量地功程序終DOS系統(tǒng)功能調(diào)程序終止DOS返回地Ctrl_C中斷向嚴(yán)重錯誤向絕對磁盤絕對磁盤結(jié)束并駐留內(nèi)鍵盤忙循快速寫字網(wǎng)絡(luò)接基本S程序裝多路轉(zhuǎn)接接保留給BIOS中斷BIOS即BasicInput/OutputSystem,是指基本輸入/輸出系統(tǒng)同時,BIOS形成了程序與硬件之間的緩沖,從而保證了用戶軟件在種程度上的兼容性BIOS駐留在系統(tǒng)板的只讀器ROM中,計算機加電后,可以隨時調(diào)在器系統(tǒng)中,從地址FE000H到FFFFFH的8KBROM中裝有BIOSBIOS中斷中斷類型中斷向量地功顯示器取設(shè)備信取內(nèi)存容磁盤RS-232串行口磁帶鍵盤引導(dǎo)裝入程時鍵盤終止地址定時顯示器參軟盤參數(shù)中斷類型中斷向量地功顯示器取設(shè)備信取內(nèi)存容磁盤RS-232串行口磁帶鍵盤引導(dǎo)裝入程時鍵盤終止地址定時顯示器參軟盤參數(shù)圖形字符擴展DOS、BIOS中斷BIOS和DOS功能調(diào)用的不同BIOS能處理幾乎所有的I/O(只有 DOS能處理大多數(shù)I/O。它是通過調(diào)用BIOS來同端口打交道使用方便,程序移植性好。但處理的數(shù)量少于BIOSDOS功能和BIOS功能都通過軟件中斷調(diào)用。調(diào)用DOS或BIOS功能時以下幾個基本步驟將調(diào)用參數(shù)裝入指定的寄如需功能號,把它裝入如需子功能號,把它裝入按中斷號調(diào)用DOS或BIOS中斷檢查返回參數(shù)是否正中斷的選擇若用戶程序通過調(diào)用DO由于BIOS介于DOS和具體硬件之間,所以,調(diào)用BIOS的功能是一個的折中方案。用戶可在以下3種情況下考慮使用BIOS的功BIOS提供的功能,而DOS沒有提供該功能不能利用DOS功能調(diào)用的情況(可能因為某些具體應(yīng)用的限制)基于處理速度的考慮,需要繞過DOS層的情況中斷處理程序的編程原在編寫中斷處理程序時要時刻遵守以下的原則1由于中斷是異步發(fā)生的,當(dāng)它進入時并不考慮系統(tǒng)當(dāng)前運行的狀態(tài),所中斷處理程序必須具有自我保護的能力,并能到所有當(dāng)前段基和堆棧指針,否則一斷成的不預(yù)測在初始完畢再開中。3當(dāng)CPU響應(yīng)一個中斷時(包括硬件中斷和軟件中斷),中斷處理程序受控制的系統(tǒng)狀態(tài)是相同的,即狀態(tài)標(biāo)志字、CS和IP進棧保存并關(guān)4開發(fā)用以替換系統(tǒng)內(nèi)中斷處理程序或系統(tǒng)異常的中斷處理程序時,必須守系統(tǒng)的有關(guān)約定,以免破壞系統(tǒng)向量或使DOS處于不穩(wěn)定狀5現(xiàn)在所使用的DOS版本是不支持重入的,所以在DOS下運行一個外部件中斷處理程序時,程序中絕對不允許使用INT21H和設(shè)置中斷中斷向量是系統(tǒng)用來存放中斷服務(wù)程序或系統(tǒng)參數(shù)的地址在通常情況下,程序員不需要對中斷向量表作任何操作,但在開發(fā)程序時若要為某種特殊需要而提供新的中斷處理程序時,就必須操作中斷向量中斷向DOS功能調(diào)用的方DOS提供了用功能調(diào)用的方法來中斷向量的功能,中斷21H的功出口參數(shù):ES:BX=中斷處理程序的地直接單元的法由前面的知識可知中斷向量表是在內(nèi)存的第0若中斷號為n,那么,其地址在表內(nèi)的偏移量為設(shè)置中斷設(shè)置中斷向DOS功能調(diào)用的方中斷21H的功能25H可為指定的中斷號設(shè)置新的地址其使用方法如下參數(shù):AH=中斷號,DS:DX=中斷處理程序的地出口參數(shù):直接單元的方CLMO,該址不向處個位果序能信時會生類后面的指令STI是開中斷指令,它允許CPU響應(yīng)其后的中斷修改中斷在編程的實際過程中,若要修改某個具體的中斷處理程序時的操作過程來完成 指定中斷的中斷處理程序的地址,并把它保存在單元內(nèi)把用戶編寫的程序段設(shè)置為指定中斷的新處理程序3在用戶程序結(jié)束之前(或不需要新的處理程序時),把步驟(1)保存的址恢復(fù)成處理該中斷的地址程序員按以上修改中斷INTNOEQUOLDADDRDD…
;NEWPROGPROC;NEWPROG;步驟1,獲取并保存原地MOVAL,INTNOMOVAH,35HINT21HMOVwordptrOLDADDR,BXMOVwordptrOLDADDR+2,ESMOVAX,SEGMOVDS,MOVDX,OFFSETNEWPROGMOVAL,INTNOMOVAH,25HINT21H
MOVDX,wordptrOLDADDRMOVDS,wordptrOLDADDR+2MOVAL,INTNOINT中斷處理實例-硬件4.5.6中斷處理實例-鍵盤BIOS鍵盤中INTBIOS中斷類型16H提供了基本的鍵盤操作,包括3個不同的功能,分別據(jù)AH寄存器的內(nèi)容來選中斷處理實例-鍵盤BIOS鍵盤INTAH=0:從鍵盤讀一字符。此時一直要等到鍵盤緩沖區(qū)有輸入才返回。返時AL=字符碼,AH=AH=1:讀鍵盤緩沖區(qū)的字符。如ZF=1則鍵盤緩沖區(qū)空;ZF=0則AL=字符碼AH=掃描AH=2:取鍵盤狀態(tài)字節(jié)。AL=鍵盤狀態(tài)字節(jié)(KB_FLAG:0040:0017H單元)中斷處理實例-鍵盤DOS鍵盤中INT中斷處理實例-鍵盤單字符輸入的字符在ALAH=1:從鍵盤輸入一個字符并回顯在屏幕上,并檢驗是否按下了Ctrl_Break鍵,如按注意:若要求程序能接收功能鍵及具有鍵擴展碼的組合鍵必須進行兩次DOS功能調(diào)用中斷處理實例-鍵盤字符串H=0:(DS:DX址)。緩沖區(qū)的第一字節(jié):給出能輸入的最大字緩沖區(qū)的第二字節(jié):調(diào)用后實際輸入的字符數(shù)。由功能0AH調(diào)用填入,不含回符緩沖區(qū)的第三字節(jié)往后:為調(diào)用后實際輸入的字符串。由功能0AH填入DOS調(diào)用后,保持DS:DX=緩沖區(qū)首地址不變用戶開辟的緩沖區(qū)的字節(jié)空間應(yīng)為最大字符數(shù)(包括回車)加中斷處理實例-鍵盤字符串輸例如:在數(shù)據(jù)區(qū)定義字符緩沖區(qū)MAXLENDB
DBDB32輸入字符串指令如下 DX,MOVINT鍵入字符串:Bybrookstoobroadfor 4.5.6中斷處理(1)BIOS顯示中INT中斷處理BIOS顯示中INT中斷處理實例-顯示BIOS顯示中INT控制光標(biāo):光標(biāo)不是ASCII字符,它由硬件產(chǎn)生和控制)(和關(guān)閉(CH4=1)AH=2:設(shè)置光標(biāo)位置。DH=行號,DL=列號,BH=頁號。對單顯BH=0讀光標(biāo)位置:AH=3,讀光標(biāo)位置。BH=頁號。出口信息為DH=行號,DL=列號;CHCL中的低4位為光標(biāo)大小清屏和卷AH=6:使屏幕內(nèi)容或窗口內(nèi)容上卷指定的行。該功能需設(shè)置7個參數(shù),AL=0時清AH=7:使屏幕內(nèi)容或窗口內(nèi)容下卷指定的行。該功能需設(shè)置7個參數(shù),AL=0時清字符顯AH=9:在光標(biāo)位置顯示字符及屬性。BH=頁,AL=字符,BL=屬性,CX=字符重復(fù)次數(shù)AH=0AH:在光標(biāo)位置只顯示字符。BH=頁,AL=字符,CX=字符重復(fù)次數(shù)。光標(biāo)回到中斷處理實例-顯示DOS顯示中INT中斷處理實例-顯示(2)DOS顯示中斷INTAH=2:顯示一個字符并檢驗Ctrl_Break。DL=(顯示)字符,光標(biāo)跟隨字符移動AH=6:直接控制臺 DL=0FFH:為輸入字符,AL=輸入字符AH=9:顯示字符串。DS:DX=字符串的首地址,字符串必須以“$”為結(jié)束符,光舉例MESSAGEDB‘Thesortoperationisfinished輸出該字符串的指令為:
AH,DX,SEGDS,DX,OFFSETMESS
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年張家港市第一人民醫(yī)院自主招聘編外合同制衛(wèi)技人員備考題庫及一套參考答案詳解
- 2025年西南財經(jīng)大學(xué)天府學(xué)院秋季學(xué)期教師招聘107備考題庫含答案詳解
- 2025年科創(chuàng)中心及所屬企業(yè)面向社會公開招聘工作人員5人備考題庫及一套完整答案詳解
- 2025年蘇州市吳江區(qū)教育系統(tǒng)公開招聘事業(yè)編制教師36人備考題庫及參考答案詳解一套
- 2025年寧麓置地(寧波)有限公司招聘13人備考題庫及答案詳解一套
- 2025年重慶市人民醫(yī)院(重慶大學(xué)附屬人民醫(yī)院)公開招聘學(xué)科帶頭人備考題庫及參考答案詳解
- 2025年北京航空航天大學(xué)電子備考題庫工程學(xué)院聘用編科研助理F崗招聘備考題庫完整參考答案詳解
- 四川港榮數(shù)字科技有限公司2025年第一批項目制員工公開招聘的備考題庫及一套答案詳解
- 2025年南京市金陵匯文學(xué)校(初中部)公開招聘在編教師8人備考題庫含答案詳解
- 2025年廣州市花都區(qū)新雅街嘉行學(xué)校臨聘教師招聘備考題庫含答案詳解
- 2025年廣東省第一次普通高中學(xué)業(yè)水平合格性考試(春季高考)英語試題(含答案詳解)
- 特殊兒童溝通技巧培訓(xùn)
- 中國馬克思主義與當(dāng)代2024版教材課后思考題答案
- 2026年日歷表(每月一頁、可編輯、可備注)
- 國家開放大學(xué)一網(wǎng)一平臺電大《建筑測量》實驗報告1-5題庫
- 品質(zhì)異常通知單
- 鼎捷T100-V1.0-總賬管理用戶手冊-簡體
- GB 31644-2018食品安全國家標(biāo)準(zhǔn)復(fù)合調(diào)味料
- 援疆工作調(diào)研報告
- 機車-受電弓碳滑板磨耗檢測
- 數(shù)學(xué)建模電子教材
評論
0/150
提交評論