微機原理與接口技術(shù)第6章2-課件_第1頁
微機原理與接口技術(shù)第6章2-課件_第2頁
微機原理與接口技術(shù)第6章2-課件_第3頁
微機原理與接口技術(shù)第6章2-課件_第4頁
微機原理與接口技術(shù)第6章2-課件_第5頁
已閱讀5頁,還剩87頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第6章匯編語言程序設(shè)計

用匯編語言編程屬結(jié)構(gòu)化程序設(shè)計。需按照結(jié)構(gòu)化的思想來進行匯編程序的設(shè)計第6章匯編語言程序設(shè)計用匯編語言編程屬結(jié)構(gòu)化程1分析題意,確定算法根據(jù)算法畫出程序框圖根據(jù)框圖編寫程序上機調(diào)試程序執(zhí)行程序按照自上而下的設(shè)計方法,設(shè)計一個匯編程序的步驟:分析題意,確定算法按照自上而下的設(shè)計方法,設(shè)計一個匯編程序的2順序程序分支程序循環(huán)程序從結(jié)構(gòu)上來講,一般的匯編程序可分為:順序程序從結(jié)構(gòu)上來講,一般的匯編程序可分為:3Eg:從鍵盤輸入一個字符并存儲到字節(jié)變量BUF單元中.分析:用DOS功能調(diào)用完成鍵入,輸入的字符保存在AL寄存器中將AL中的內(nèi)容存到定義在數(shù)據(jù)段的變量BUF所指單元中

順序程序設(shè)計Eg:從鍵盤輸入一個字符并存儲到字節(jié)變量BUF單元中.分析:4 .486DATASEGMENTUSE16

BUF DB ?DATAENDS源程序清單:CODE SEGMENTUSE16 ASSUME CS:CODE,DS:DATABEG: MOV AX,DATA MOV DS,AX MOV AH,1 INT 21H;AL=鍵入字符的 MOV BUF,ALASIIC碼 MOV AH,4CH INT 21HCODE ENDS END BEG .486源程序清單:CODE SEGMENTUS5

分支程序設(shè)計

轉(zhuǎn)移指令可用來實現(xiàn)分支程序設(shè)計分支程序分三種:簡單分支

復(fù)合分支多分支分6

簡單分支即兩路分支,該分支程序結(jié)構(gòu)為:條件滿足否?程序段1程序段2YN簡單分支7

Eg:將BX寄存器的內(nèi)容以二進制數(shù)格式顯在屏幕上BX=1110010011100110B

簡單分支

RCL0SALROLCFCFCFEg:將BX寄存器的內(nèi)容以二進制數(shù)格式顯在屏幕上BX=18·486CODESEGMENTUSE16ASSUME

CS:CODEBEG:MOVBX,5678HMOVCX,16LAST:MOVAL,’0’ROLBX,1JNCNEXT

MOVAL,’1’NEXT:MOVAH,0EH

INT10HLOOPLASTMOVAH,4CHINT21H

CODEENDSENDBEGADCAL,0數(shù)→BX,16→CXC標=?‘1’→AL調(diào)BIOS.0EHCX-1→CXCX=0‘0’→ALBX左移一位10NY返DOS源程序清單:·486ADCAL,09復(fù)合分支判斷的條件是復(fù)合條件,稱復(fù)合判斷復(fù)合分支程序結(jié)構(gòu)為:條件1和條件2...滿足否?程序段1程序段2YN復(fù)合分支條件110Eg:某科室9人,統(tǒng)計月收入在800~900間的人數(shù),并用十進制數(shù)顯示

復(fù)合分支

分析:月收入是無符號數(shù),對一批數(shù)處理應(yīng)該用間址。數(shù)軸:··

N1(800)N2(900)

Eg:某科室9人,統(tǒng)計月收入在800~900間的人數(shù),并用十11多分支判斷條件后有多個出口,判斷一次只能選擇一個分支。多分支程序結(jié)構(gòu)為:1條件屬哪種情況?程序段1程序段n+m…...…...程序段nnn+m多分支1條件12例.多分支段內(nèi)轉(zhuǎn)移要求:鍵入0,轉(zhuǎn)P0程序段鍵入1,轉(zhuǎn)P1程序段……鍵入9,轉(zhuǎn)P9程序段思路:①用比較指令配合直接轉(zhuǎn)移指令實現(xiàn)CMP鍵入字符,‘0’JEP0CMP鍵入字符,‘1’JEP1……

②用轉(zhuǎn)移地址表配合間接轉(zhuǎn)移指令實現(xiàn)

多分支

例.多分支段內(nèi)轉(zhuǎn)移思路:①用比較指令配合直接轉(zhuǎn)移指令實現(xiàn)②用13·486DATASEGMENTUSE16TABDWP0,P1,…,P9;匯編后自動裝入相應(yīng)的偏移地址MESGDB0DH,0AH,’strike0~9:$’DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXAGA:MOVAH,9MOVDX,OFFSETMESGINT21HMOVAH,1INT21HCMPAL,’0’JCAGACMPAL,’9’JAAGASUBAL,30HMOVZXBX,ALADDBX,BX;2×BX→BXMOVSI,OFFSETTABJMP[BX+SI];DS:[BX+SI]→IPP0:…P1:………P9:…CODEENDSENDBEG或:MOVBX,[BX+SI]JMPBX;BX→IP源程序清單:·486CMPA14

循環(huán)程序設(shè)計循環(huán)程序的組成:循環(huán)準備

循環(huán)體循環(huán)控制循環(huán)程序設(shè)計循環(huán)程151.循環(huán)程序的結(jié)構(gòu)Y預(yù)置循環(huán)次數(shù)其他準備工作循環(huán)體循環(huán)減1計數(shù)退出循環(huán)結(jié)果為0?N(a)單循環(huán)結(jié)構(gòu)(b)雙循環(huán)結(jié)構(gòu)結(jié)果為0?循環(huán)體內(nèi)循環(huán)減1計數(shù)結(jié)果為0?外循環(huán)減1計數(shù)退出循環(huán)預(yù)置外循環(huán)次數(shù)其他準備工作預(yù)置內(nèi)循環(huán)次數(shù)其他準備工作NNYY1.循環(huán)程序的結(jié)構(gòu)Y預(yù)置循環(huán)次數(shù)循環(huán)體循環(huán)減1計數(shù)退出循環(huán)16Eg:假設(shè)從BUF單元開始為一個ASCII碼字符串,找出其中的最大數(shù)送屏幕顯示。循環(huán)程序設(shè)計思路:ASCⅡ碼數(shù)為無符號數(shù),無符號數(shù)的最小數(shù)為0YNN數(shù)據(jù)區(qū)首址→DS:BX無符號最小數(shù)→AL數(shù)據(jù)個數(shù)→CX[BX]→AL[BX]>=AL?BX+1→BXCX-1→CX顯示結(jié)果返回DOSCX=0?YEg:假設(shè)從BUF單元開始為一個ASCII碼字符串,找出17·486DATASEGMENTUSE16BUFDB'QWERTYUIOP123'

COUNTEQU$-BUF;統(tǒng)計串長度MAXDB'MAX=',?,0DH,0AH,'$'DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXMOVAL,0

;無符號最小數(shù)0→ALLEABX,BUF

;串首址偏移量→BX

MOVCX,COUNT

;串長度→CX

LAST:CMP[BX],AL;比較JCNEXTMOVAL,[BX];大數(shù)→ALNEXT:INCBXLOOPLAST;循環(huán)計數(shù)MOVMAX+4,AL;最大數(shù)→MAX+4單元MOVAH,9MOVDX,OFFSETMAXINT21H;顯示結(jié)果MOVAH,4CHINT21H;返回DOSCODEENDSENDBEG

源程序清單1:·486源程序清單18

·486DATASEGMENTUSE16BUFDB'QWERTYUIOP123'FLAGDB-1

;設(shè)置串結(jié)束標志MAXDB'MAX=',?,0DH,0AH,'$'DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXMOVAL,0

;無符號最小數(shù)0→ALLEABX,BUF

;串首址偏移量→BXLAST:CMPBYTEPTR[BX],-1

;[BX]=串結(jié)束標志?JEDISP;是,轉(zhuǎn)CMP[BX],ALJCNEXTMOVAL,[BX]

;大數(shù)→ALNEXT:INCBXJMPLASTDISP:MOVMAX+4,AL

;最大數(shù)→MAX+4單元MOVAH,9MOVDX,OFFSETMAXINT21H;顯示結(jié)果MOVAH,4CHINT21H;返回DOSCODEENDSENDBEG

源程序清單2:·486JE19匯編程序設(shè)計舉例

代碼轉(zhuǎn)換匯編程序設(shè)計舉例代碼轉(zhuǎn)換20代碼轉(zhuǎn)換代碼轉(zhuǎn)換21常見的代碼轉(zhuǎn)換有:二進制數(shù)→顯示二進制數(shù)→十進制數(shù)→顯示二進制數(shù)→十六進制數(shù)→顯示BCD碼數(shù)→二進制數(shù)微機原理與接口技術(shù)第6章2-課件22代碼轉(zhuǎn)換A二進制數(shù)顯示:例.把鍵盤輸入的一位數(shù)(0~9),轉(zhuǎn)換成等值二進數(shù)顯示顯示的格式要求如下:PleaseEnter:ERROR!PleaseEnter:9=00001001B代碼轉(zhuǎn)換A二進制數(shù)顯示:顯示的格式要求如下:PleaseE23代碼轉(zhuǎn)換思路:鍵盤緩沖區(qū)中是鍵入字符的ASCⅡ碼。0~9的ASCⅡ碼為30H~39H。二進制數(shù)每一位代碼的判斷:本程序采用兩種格式設(shè)計源程序:一種是EXE文件編程格式,另一種是COM文件編程格式。RCL0SALROLCFCFCF代碼轉(zhuǎn)換思路:本程序采用兩種格式設(shè)計源程序:RCL0SAL24程序框圖:AL-30H→BL‘=’→屏幕,8→CX‘0’→屏幕‘1’→屏幕CX-1→CX‘B’→屏幕,返回DOSNN給出操作提示鍵盤輸入→ALAL=‘0’~’9’?CF=?CX=0?BL左移一位Y顯示錯誤信息

Y01程序框圖:AL-30H→BL‘0’→屏幕‘1’→屏25.486DATASEGMENTUSE16MESG1DB'PleaseEnter!',0DH,0AH,'$'MESG2DB‘------Error!$'DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXMOVAH,9MOVDX,OFFSETMESG1INT21H;顯示操作提示MOVAH,1INT21H;等待鍵入CMPAL,3AHJNCERROR;>'9'轉(zhuǎn)CMPAL,30H[EXE格式程序清單]JC

ERROR;<'0'轉(zhuǎn)SUBAL,30HMOVBL,AL

;BL=0~9的二進制數(shù)MOVAH,2MOVDL,'='INT21HCALLDISPMOVAH,2MOVDL,'B'INT21HJMPEXITERROR:MOVAH,9MOVDX,OFFSETMESG2INT21H

;顯示錯誤信息EXIT:MOVAH,4CHINT21H.486[EXE格式26;---------------------------------DISPPROC;顯示BL中的二進制數(shù)MOVCX,8LAST:MOVDL,'0'RCLBL,1JNCNEXTMOVDL,'1'NEXT:MOVAH,2INT21HLOOPLASTRETDISPENDPCODEENDSENDBEG[EXE格式程序清單];-----------------------------27

.486CODESEGMENTUSE16ASSUMECS:CODEORG100HSTART:JMPBEGMESG1DB'PleaseEnter!',0DH,0AH,'$'MESG2DB'---Error!$'BEG:MOVAH,9MOVDX,OFFSETMESG1INT21H;顯示操作提示

MOVAH,1INT21H;等待鍵入CMPAL,3AHJNCERROR;>'9'轉(zhuǎn)CMPAL,30HJCERROR;<'0'轉(zhuǎn)SUBAL,30HMOVBL,AL

;BL=0~9的二進制數(shù)MOVAH,2MOVDL,'='INT21HCALLDISPMOVAH,2MOVDL,'B'INT21HJMPEXITMOVDX,OFFSETMESG2INT21H

;顯示錯誤信息INT21HERROR:MOVAH,9EXIT:MOVAH,4CH[COM格式程序清單]MOVBL,AL28;-------------------------------DISPPROC;顯示BL中的二進制數(shù)MOVCX,8LAST:MOVDL,'0‘RCLBL,1JNCNEXTMOVDL,'1'NEXT:MOVAH,2INT21HLOOPLASTRETDISPENDPCODEENDSENDSTART[COM格式程序清單];-----------------------------29問題:鍵入的是兩位十進制數(shù)時,如何將該十進制數(shù)的二進制數(shù)顯示在屏幕上?代碼轉(zhuǎn)換問題:鍵入的是兩位十進制數(shù)時,如何將該十進制數(shù)的二進制數(shù)顯示30二.二進制數(shù)→十六進制數(shù)顯示算法:四位二進制數(shù)等值的十六進制數(shù)十六進制數(shù)ASCⅡ碼算法0000~10011010~11110~9A~F30H~39H41H~46H四位二進制數(shù)+30H=等值的十六進制數(shù)ASCⅡ碼四位二進制數(shù)+37H=等值的十六進制數(shù)ASCⅡ碼代碼轉(zhuǎn)換二.二進制數(shù)→十六進制數(shù)顯示算法:四位二進制數(shù)等值的十六進31編程技巧:8位二進制數(shù)截取高4位顯示顯示截取低4位XXXXXXXXXXXX0000XXXX000016進制數(shù)ASCⅡ碼16進制數(shù)ASCⅡ碼代碼轉(zhuǎn)換編程技巧:8位二進制數(shù)截取高4位顯示顯示截取低4位XXXX32例.設(shè)從BNUM單元開始,有4個16位的二進制數(shù),要求把它們轉(zhuǎn)換成16進制數(shù),并送屏幕顯示。

[程序清單].486DATASEGMENTUSE16BNUMDW0001001000110100B;1234HDW0101011001111000B;5678HDW0001101000101011B;1A2BHDW0011110001001101B;3C4DHBUFDB4DUP(?),‘H$’;輸出緩沖區(qū)COUNTDB4DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATA例.設(shè)從BNUM單元開始,有4個16位的二進制數(shù),要求[程33BEG:MOVAX,DATAMOVDS,AXMOVCX,4MOVBX,OFFSETBNUMAGA:MOVDX,[BX]

SALEDX,16

CALLN2_16ASCMOVAH,9MOVDX,OFFSETBUFINT21H

;顯示一個16進數(shù)ADDBX,2;地址加2LOOPAGAMOVAH,4CHINT21H;二進數(shù)→十六進數(shù)ACSII碼N2_16ASCPROCMOVSI,OFFSETBUF

;輸出緩沖區(qū)地址→SIMOVCOUNT,4LAST:ROLEDX,4

ANDDL,0FHCMPDL,10JCNEXTADDDL,7NEXT:ADDDL,30HMOV[SI],DLINCSI;地址加1DECCOUNT;計數(shù)JNZLASTRETN2_16ASCENDPCODEENDSENDBEG[EXE格式程序清單];二進數(shù)→十六進數(shù)ACSII碼[EXE格式程序清單]34代碼轉(zhuǎn)換三.BCD碼→二進制數(shù)例.4位BCD碼數(shù)→二進制數(shù)顯示算法:設(shè)4位BCD碼數(shù)列為:N3N2N1N0,等值二進制數(shù)=N3×1000+N2×100+N1×10+N0=(((0×10+N3)×10+N2)×10+N1)×10+N0編程考慮:4位BCD碼最大為9999H,等值的二進制數(shù)最大為16位(超過8位),而且D15位肯定為0分離出BCD千位N3,百位N2,十位N1,個位N0設(shè)計一個AX×10+BX→AX的子程序供調(diào)用,首次調(diào)用時,令A(yù)X=0,BX=N3,共調(diào)用4次,則AX中即為等值的二進制數(shù)。代碼轉(zhuǎn)換三.BCD碼→二進制數(shù)算法:設(shè)4位BCD碼數(shù)列為:N35·486CODESEGMENTUSE16ASSUMECS:CODENUMDW4567H

;BCD碼表示BEG:MOVCX,4;4次調(diào)用

MOVAX,0AGA:ROLNUM,4MOVBX,NUMANDBX,000FH

IMULAX,10ADDAX,BXLOOPAGA顯示AX中的二進制數(shù)返回DOSCODEENDSENDBEG本例數(shù)據(jù)放在代碼段!本例:因為AX的D15=0,是正的有符號數(shù),所以可用IMUL指令A(yù)X×10+BX→AX[EXE格式程序清單]·486本例數(shù)據(jù)放在代碼段36代碼轉(zhuǎn)換三.二進制數(shù)→十進制數(shù)方法:比較法,恢復(fù)余數(shù)法,除法8位二進制數(shù)最大為11111111,等值的十進制數(shù)為255,

比較法的關(guān)鍵:判斷某二進制數(shù)(假設(shè)為BEN單元的內(nèi)容)包含幾個100,幾個10,幾個1

1.8位二進制數(shù)→十進制數(shù),比較法:DL+1→DL(BEN)-10→BEN(BEN)>=100?NY(BEN)>=10?NY0→DLDL+1→DL(BEN)-100→BENDL+30H→屏幕0→DLDL+30H→屏幕(BEN)+30H→屏幕返回DOS代碼轉(zhuǎn)換三.二進制數(shù)→十進制數(shù)方法:比較法,恢復(fù)余數(shù)法,除法37.486CMPDISPMACRONNLOCALLAST,NEXTMOVDL,0;DL清0LAST:CMPBEN,NN;比較JCNEXT;BEN<NN轉(zhuǎn)INCDL;DL加1SUBBEN,NNJMPLASTNEXT:ADDDL,30HMOVAH,2INT21H;顯示ENDM

CODESEGMENTUSE16ASSUMECS:CODEBENDB10101110B;=174BEG:CMPDISP100CMPDISP10CMPDISP1MOVAH,4CHINT21HCODEENDSENDBEG[EXE格式程序清單]CODESEGMENTUSE16[EXE格式程序清38代碼轉(zhuǎn)換2.8位二進制數(shù)→十進制數(shù),恢復(fù)余數(shù)法(請自學)3.8位二進制數(shù)→十進制數(shù),“除權(quán)值求商”的算法分析把11110101B→十進制數(shù)245算法:①依次用權(quán)值100,10,1去除上次的余數(shù),直到余數(shù)為0時停止。②每次除法所得的商數(shù)順序排列,即為十進制數(shù)。

111101011100100110010010110110……2權(quán)值(100)10101……51011010……余數(shù)為0時止1權(quán)值(1)100……4

10110110101011010權(quán)值(10)10代碼轉(zhuǎn)換2.8位二進制數(shù)→十進制數(shù),恢復(fù)余數(shù)法(請自學)把39例.

將NUM單元中的16位二進制數(shù),轉(zhuǎn)換成十進制數(shù)顯示。思路:16位二進制數(shù):最大為1……1,其等值的十進制數(shù)為65535,故應(yīng)判斷NUM單元的數(shù)包含幾個10000,幾個1000,幾個100,幾個10,幾個1設(shè)計一個XX÷YY并顯示商值的宏指令供調(diào)用,XX為32位,YY為16為二進制數(shù)。例.思路:40DX,AX為被除數(shù)·486DIVIDEMACROXX,YYMOVAX,XXMOVDX,0MOVCX,YY;CX為除數(shù)DIVCX

;AX=商,且<1010B,DX=余數(shù)MOVAH,0EHADDAL,30HINT10HENDMCODESEGMENTUSE16ASSUMECS:CODENUMDW65530;匯編后為二進制數(shù)BEG:DIVIDENUM,10000DIVIDEDX,1000①本題在代碼段中設(shè)置數(shù)據(jù),這是COM格式?EXE格式?②如果改為:BEG:MOVBX,OFFSETNUMDIVIDE[BX],10000……是錯誤的,為什么?DIVIDEDX,100DIVIDEDX,10DIVIDEDX,1MOVAH,4CHINT21HCODEENDSENDBEG顯示一位商值不能顛倒分析:應(yīng)寫成:DIVIDECS:[BX],10000[程序清單]DX,AX為被除數(shù)·48641代碼轉(zhuǎn)換4.8位二進制數(shù)→十進制數(shù),“除十取余”的算法分析

把11110101→十進制數(shù)245算法:①N被(10)10除,商再被(10)10除……,直到商數(shù)為0時止。②每次所得的余數(shù)按倒序方式排列顯示。編程技巧:每次除法的余數(shù)→棧,除法結(jié)束后,再從堆棧中依次彈出余數(shù)+30H→屏。11000

11110101101010101010101……51010即(10)1010

110001010100……410100……商為0時止

100010……21010代碼轉(zhuǎn)換4.8位二進制數(shù)→十進制數(shù),“除十取余”的算法分析428位~32位二進制數(shù)轉(zhuǎn)換成十進制數(shù),通用的除法求余框圖:(書程序,自學)設(shè)N為待轉(zhuǎn)換的8位~32位二進制數(shù)EAX=商,EDX=余數(shù),且余數(shù)肯定<1010B統(tǒng)計除法的次數(shù)CX=0?彈出余數(shù)+30H→顯示CX-1→CXN→EAX除數(shù)1010B→EBX0→CX計數(shù)器0→EDX(EDX,EAX)÷EBX余數(shù)→堆棧CX+1→CX商為0?轉(zhuǎn)換完畢YYNN8位~32位二進制數(shù)轉(zhuǎn)換成十進制數(shù),通用的除法求余框圖:E43CODESEGMENTUSE16ASSUMECS:CODEBENDB10101110B;=174BEG:CMPDISP100CMPDISP10CMPDISP1MOVAH,4CHINT21HCODEENDSENDBEG代碼轉(zhuǎn)換CODESEGMENTUSE16代碼轉(zhuǎn)換44.486CODESEGMENTUSE16ASSUMECS:CODEBENDB10101110B;=174BEG:MOVBL,100CALLCMPDISPMOVBL,10CALLCMPDISPMOVBL,1CALLCMPDISPMOVAH,4CHINT21H代碼轉(zhuǎn)換.486代碼轉(zhuǎn)換45

CMPDISPPROCMOVDL,0;DL清0LAST:CMPBEN,BL;比較JCNEXT;BEN<BX轉(zhuǎn)INCDL;DL加1SUBBEN,BL;BEN-BX→BENJMPLASTNEXT:ADDDL,30HMOVAH,2INT21H;顯示RETCMPDISPENDPCODEENDSENDBEG代碼轉(zhuǎn)換CMPDISPPROC代碼轉(zhuǎn)46第6章匯編語言程序設(shè)計

用匯編語言編程屬結(jié)構(gòu)化程序設(shè)計。需按照結(jié)構(gòu)化的思想來進行匯編程序的設(shè)計第6章匯編語言程序設(shè)計用匯編語言編程屬結(jié)構(gòu)化程47分析題意,確定算法根據(jù)算法畫出程序框圖根據(jù)框圖編寫程序上機調(diào)試程序執(zhí)行程序按照自上而下的設(shè)計方法,設(shè)計一個匯編程序的步驟:分析題意,確定算法按照自上而下的設(shè)計方法,設(shè)計一個匯編程序的48順序程序分支程序循環(huán)程序從結(jié)構(gòu)上來講,一般的匯編程序可分為:順序程序從結(jié)構(gòu)上來講,一般的匯編程序可分為:49Eg:從鍵盤輸入一個字符并存儲到字節(jié)變量BUF單元中.分析:用DOS功能調(diào)用完成鍵入,輸入的字符保存在AL寄存器中將AL中的內(nèi)容存到定義在數(shù)據(jù)段的變量BUF所指單元中

順序程序設(shè)計Eg:從鍵盤輸入一個字符并存儲到字節(jié)變量BUF單元中.分析:50 .486DATASEGMENTUSE16

BUF DB ?DATAENDS源程序清單:CODE SEGMENTUSE16 ASSUME CS:CODE,DS:DATABEG: MOV AX,DATA MOV DS,AX MOV AH,1 INT 21H;AL=鍵入字符的 MOV BUF,ALASIIC碼 MOV AH,4CH INT 21HCODE ENDS END BEG .486源程序清單:CODE SEGMENTUS51

分支程序設(shè)計

轉(zhuǎn)移指令可用來實現(xiàn)分支程序設(shè)計分支程序分三種:簡單分支

復(fù)合分支多分支分52

簡單分支即兩路分支,該分支程序結(jié)構(gòu)為:條件滿足否?程序段1程序段2YN簡單分支53

Eg:將BX寄存器的內(nèi)容以二進制數(shù)格式顯在屏幕上BX=1110010011100110B

簡單分支

RCL0SALROLCFCFCFEg:將BX寄存器的內(nèi)容以二進制數(shù)格式顯在屏幕上BX=154·486CODESEGMENTUSE16ASSUME

CS:CODEBEG:MOVBX,5678HMOVCX,16LAST:MOVAL,’0’ROLBX,1JNCNEXT

MOVAL,’1’NEXT:MOVAH,0EH

INT10HLOOPLASTMOVAH,4CHINT21H

CODEENDSENDBEGADCAL,0數(shù)→BX,16→CXC標=?‘1’→AL調(diào)BIOS.0EHCX-1→CXCX=0‘0’→ALBX左移一位10NY返DOS源程序清單:·486ADCAL,055復(fù)合分支判斷的條件是復(fù)合條件,稱復(fù)合判斷復(fù)合分支程序結(jié)構(gòu)為:條件1和條件2...滿足否?程序段1程序段2YN復(fù)合分支條件156Eg:某科室9人,統(tǒng)計月收入在800~900間的人數(shù),并用十進制數(shù)顯示

復(fù)合分支

分析:月收入是無符號數(shù),對一批數(shù)處理應(yīng)該用間址。數(shù)軸:··

N1(800)N2(900)

Eg:某科室9人,統(tǒng)計月收入在800~900間的人數(shù),并用十57多分支判斷條件后有多個出口,判斷一次只能選擇一個分支。多分支程序結(jié)構(gòu)為:1條件屬哪種情況?程序段1程序段n+m…...…...程序段nnn+m多分支1條件58例.多分支段內(nèi)轉(zhuǎn)移要求:鍵入0,轉(zhuǎn)P0程序段鍵入1,轉(zhuǎn)P1程序段……鍵入9,轉(zhuǎn)P9程序段思路:①用比較指令配合直接轉(zhuǎn)移指令實現(xiàn)CMP鍵入字符,‘0’JEP0CMP鍵入字符,‘1’JEP1……

②用轉(zhuǎn)移地址表配合間接轉(zhuǎn)移指令實現(xiàn)

多分支

例.多分支段內(nèi)轉(zhuǎn)移思路:①用比較指令配合直接轉(zhuǎn)移指令實現(xiàn)②用59·486DATASEGMENTUSE16TABDWP0,P1,…,P9;匯編后自動裝入相應(yīng)的偏移地址MESGDB0DH,0AH,’strike0~9:$’DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXAGA:MOVAH,9MOVDX,OFFSETMESGINT21HMOVAH,1INT21HCMPAL,’0’JCAGACMPAL,’9’JAAGASUBAL,30HMOVZXBX,ALADDBX,BX;2×BX→BXMOVSI,OFFSETTABJMP[BX+SI];DS:[BX+SI]→IPP0:…P1:………P9:…CODEENDSENDBEG或:MOVBX,[BX+SI]JMPBX;BX→IP源程序清單:·486CMPA60

循環(huán)程序設(shè)計循環(huán)程序的組成:循環(huán)準備

循環(huán)體循環(huán)控制循環(huán)程序設(shè)計循環(huán)程611.循環(huán)程序的結(jié)構(gòu)Y預(yù)置循環(huán)次數(shù)其他準備工作循環(huán)體循環(huán)減1計數(shù)退出循環(huán)結(jié)果為0?N(a)單循環(huán)結(jié)構(gòu)(b)雙循環(huán)結(jié)構(gòu)結(jié)果為0?循環(huán)體內(nèi)循環(huán)減1計數(shù)結(jié)果為0?外循環(huán)減1計數(shù)退出循環(huán)預(yù)置外循環(huán)次數(shù)其他準備工作預(yù)置內(nèi)循環(huán)次數(shù)其他準備工作NNYY1.循環(huán)程序的結(jié)構(gòu)Y預(yù)置循環(huán)次數(shù)循環(huán)體循環(huán)減1計數(shù)退出循環(huán)62Eg:假設(shè)從BUF單元開始為一個ASCII碼字符串,找出其中的最大數(shù)送屏幕顯示。循環(huán)程序設(shè)計思路:ASCⅡ碼數(shù)為無符號數(shù),無符號數(shù)的最小數(shù)為0YNN數(shù)據(jù)區(qū)首址→DS:BX無符號最小數(shù)→AL數(shù)據(jù)個數(shù)→CX[BX]→AL[BX]>=AL?BX+1→BXCX-1→CX顯示結(jié)果返回DOSCX=0?YEg:假設(shè)從BUF單元開始為一個ASCII碼字符串,找出63·486DATASEGMENTUSE16BUFDB'QWERTYUIOP123'

COUNTEQU$-BUF;統(tǒng)計串長度MAXDB'MAX=',?,0DH,0AH,'$'DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXMOVAL,0

;無符號最小數(shù)0→ALLEABX,BUF

;串首址偏移量→BX

MOVCX,COUNT

;串長度→CX

LAST:CMP[BX],AL;比較JCNEXTMOVAL,[BX];大數(shù)→ALNEXT:INCBXLOOPLAST;循環(huán)計數(shù)MOVMAX+4,AL;最大數(shù)→MAX+4單元MOVAH,9MOVDX,OFFSETMAXINT21H;顯示結(jié)果MOVAH,4CHINT21H;返回DOSCODEENDSENDBEG

源程序清單1:·486源程序清單64

·486DATASEGMENTUSE16BUFDB'QWERTYUIOP123'FLAGDB-1

;設(shè)置串結(jié)束標志MAXDB'MAX=',?,0DH,0AH,'$'DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXMOVAL,0

;無符號最小數(shù)0→ALLEABX,BUF

;串首址偏移量→BXLAST:CMPBYTEPTR[BX],-1

;[BX]=串結(jié)束標志?JEDISP;是,轉(zhuǎn)CMP[BX],ALJCNEXTMOVAL,[BX]

;大數(shù)→ALNEXT:INCBXJMPLASTDISP:MOVMAX+4,AL

;最大數(shù)→MAX+4單元MOVAH,9MOVDX,OFFSETMAXINT21H;顯示結(jié)果MOVAH,4CHINT21H;返回DOSCODEENDSENDBEG

源程序清單2:·486JE65匯編程序設(shè)計舉例

代碼轉(zhuǎn)換匯編程序設(shè)計舉例代碼轉(zhuǎn)換66代碼轉(zhuǎn)換代碼轉(zhuǎn)換67常見的代碼轉(zhuǎn)換有:二進制數(shù)→顯示二進制數(shù)→十進制數(shù)→顯示二進制數(shù)→十六進制數(shù)→顯示BCD碼數(shù)→二進制數(shù)微機原理與接口技術(shù)第6章2-課件68代碼轉(zhuǎn)換A二進制數(shù)顯示:例.把鍵盤輸入的一位數(shù)(0~9),轉(zhuǎn)換成等值二進數(shù)顯示顯示的格式要求如下:PleaseEnter:ERROR!PleaseEnter:9=00001001B代碼轉(zhuǎn)換A二進制數(shù)顯示:顯示的格式要求如下:PleaseE69代碼轉(zhuǎn)換思路:鍵盤緩沖區(qū)中是鍵入字符的ASCⅡ碼。0~9的ASCⅡ碼為30H~39H。二進制數(shù)每一位代碼的判斷:本程序采用兩種格式設(shè)計源程序:一種是EXE文件編程格式,另一種是COM文件編程格式。RCL0SALROLCFCFCF代碼轉(zhuǎn)換思路:本程序采用兩種格式設(shè)計源程序:RCL0SAL70程序框圖:AL-30H→BL‘=’→屏幕,8→CX‘0’→屏幕‘1’→屏幕CX-1→CX‘B’→屏幕,返回DOSNN給出操作提示鍵盤輸入→ALAL=‘0’~’9’?CF=?CX=0?BL左移一位Y顯示錯誤信息

Y01程序框圖:AL-30H→BL‘0’→屏幕‘1’→屏71.486DATASEGMENTUSE16MESG1DB'PleaseEnter!',0DH,0AH,'$'MESG2DB‘------Error!$'DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXMOVAH,9MOVDX,OFFSETMESG1INT21H;顯示操作提示MOVAH,1INT21H;等待鍵入CMPAL,3AHJNCERROR;>'9'轉(zhuǎn)CMPAL,30H[EXE格式程序清單]JC

ERROR;<'0'轉(zhuǎn)SUBAL,30HMOVBL,AL

;BL=0~9的二進制數(shù)MOVAH,2MOVDL,'='INT21HCALLDISPMOVAH,2MOVDL,'B'INT21HJMPEXITERROR:MOVAH,9MOVDX,OFFSETMESG2INT21H

;顯示錯誤信息EXIT:MOVAH,4CHINT21H.486[EXE格式72;---------------------------------DISPPROC;顯示BL中的二進制數(shù)MOVCX,8LAST:MOVDL,'0'RCLBL,1JNCNEXTMOVDL,'1'NEXT:MOVAH,2INT21HLOOPLASTRETDISPENDPCODEENDSENDBEG[EXE格式程序清單];-----------------------------73

.486CODESEGMENTUSE16ASSUMECS:CODEORG100HSTART:JMPBEGMESG1DB'PleaseEnter!',0DH,0AH,'$'MESG2DB'---Error!$'BEG:MOVAH,9MOVDX,OFFSETMESG1INT21H;顯示操作提示

MOVAH,1INT21H;等待鍵入CMPAL,3AHJNCERROR;>'9'轉(zhuǎn)CMPAL,30HJCERROR;<'0'轉(zhuǎn)SUBAL,30HMOVBL,AL

;BL=0~9的二進制數(shù)MOVAH,2MOVDL,'='INT21HCALLDISPMOVAH,2MOVDL,'B'INT21HJMPEXITMOVDX,OFFSETMESG2INT21H

;顯示錯誤信息INT21HERROR:MOVAH,9EXIT:MOVAH,4CH[COM格式程序清單]MOVBL,AL74;-------------------------------DISPPROC;顯示BL中的二進制數(shù)MOVCX,8LAST:MOVDL,'0‘RCLBL,1JNCNEXTMOVDL,'1'NEXT:MOVAH,2INT21HLOOPLASTRETDISPENDPCODEENDSENDSTART[COM格式程序清單];-----------------------------75問題:鍵入的是兩位十進制數(shù)時,如何將該十進制數(shù)的二進制數(shù)顯示在屏幕上?代碼轉(zhuǎn)換問題:鍵入的是兩位十進制數(shù)時,如何將該十進制數(shù)的二進制數(shù)顯示76二.二進制數(shù)→十六進制數(shù)顯示算法:四位二進制數(shù)等值的十六進制數(shù)十六進制數(shù)ASCⅡ碼算法0000~10011010~11110~9A~F30H~39H41H~46H四位二進制數(shù)+30H=等值的十六進制數(shù)ASCⅡ碼四位二進制數(shù)+37H=等值的十六進制數(shù)ASCⅡ碼代碼轉(zhuǎn)換二.二進制數(shù)→十六進制數(shù)顯示算法:四位二進制數(shù)等值的十六進77編程技巧:8位二進制數(shù)截取高4位顯示顯示截取低4位XXXXXXXXXXXX0000XXXX000016進制數(shù)ASCⅡ碼16進制數(shù)ASCⅡ碼代碼轉(zhuǎn)換編程技巧:8位二進制數(shù)截取高4位顯示顯示截取低4位XXXX78例.設(shè)從BNUM單元開始,有4個16位的二進制數(shù),要求把它們轉(zhuǎn)換成16進制數(shù),并送屏幕顯示。

[程序清單].486DATASEGMENTUSE16BNUMDW0001001000110100B;1234HDW0101011001111000B;5678HDW0001101000101011B;1A2BHDW0011110001001101B

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論