微機原理與接口例題及答案_第1頁
微機原理與接口例題及答案_第2頁
微機原理與接口例題及答案_第3頁
微機原理與接口例題及答案_第4頁
微機原理與接口例題及答案_第5頁
已閱讀5頁,還剩32頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1、例 23 碼的形式存放)第一個商為1 1 26 7 5 6-第一個余數為1 1 5 1 2-程序如下:FIRSTSECOND DB 75HTHIRDFOURDB 06H;除數6;被除數75HDB 2;存商DB?;存余數MOV AH,00HMOV AL,SECONDAND AL,0F0HMOV CL,04HROL ;第一個被除數高位AH清0;AL 被除數75;截取高4位;移至低4位;AX/06,即000706;DIV FIRST;得結果:AL 商為1,AH余數 1MOV THIRD+1,ALMOV AL,SECONDAND AL,0FH;結果單元 第一個商1;AL 被除數75;AL 截低4位

2、,故AX0105HAAD;將AX中內容0105H調整為0FH;0FH/6,結果:AL 商為2,AH 余數3;THIRD 單元 第二個商2DIV FIRSTMOV THIRD,ALMOV FOUR,AH;FOUR 單元 第二個余數32、例設AL寄存器中存有報警標志。若D71,表示溫度報警,程序要轉到溫度報警處理程序T_ ALARM ;D61,則轉壓力報警程序P_ALARM 。用TEST指令來實現這種功能。解:TEST ;查AL的D71?JNZTEST ;D70,D61?JNZ 1,轉壓力報警(其中:JNZ為條件轉移指令,表示結果非0 3、例要求把數據段中以SRC_MESS 為偏移地址的一串字符“

3、HELLO 開始的單元中。解:DATASRC_MESS DBSEGMENT ;數據段 ;源串DATA;ENDSEXTRA NEW_LOC DB 6 ;存放目的串EXTRACODEENDS;SEGMENT , MOV DS;DS數據段段址 AX E ES附加段段址 LEALEAMOV;DI指向目的串偏移地址 ;CX作串長度計數器 志,地址增量MOVSB;重復傳送串中各字節,直到CX=0REP其中“REP NEW_LOC, SRC_MESSMOVSDECJNZCXAGAIN4、例比較兩個字符串,一個是程序中設定的口令串PASSWORD ,另一個是從鍵盤輸入的字符串IN_WORD ,若輸入串與口令串

4、相同,程序將開始執行。否則,程序驅動PC機的揚聲器發聲,警告用戶口令不符,拒絕往下執行。解:這可以用CMPS 指令來實現,有關程序段如下:DATASEGMENTPASSWORD DB 750424LI 口令串;IN_WORD DB 750424LE COUNTDATAEQU 8 串長度 ;ENDSCODESEGMENTLEA SI, PASSWORD LEA DI, IN_WORD MOV CX, COUNT CLD地址增量;REPZ CMPSBJNE SOUNDOK:SOUND:CODE使PC并退出 ;ENDS5、例 在某一字符串中搜尋是否有字符A,若有,則把搜索次數記下來,送到BX寄存器中

5、,若沒有查到,則將BX寄存器清0。設字符串起始地址STRING 的偏移地址為0,字符串長度為CX。解: MOV STRING ;DI字符串偏移地址 ;CX字符串長度 ;AL關鍵字A的A5CII碼CLD ;清標志方向REPNE (不相等)時重復JZ ,表示已搜到,轉出 DI;若ZF=0,表示沒搜到,DI 0FIND:MOV BX,DI ;BX 搜索次數HLT說明:DI初值存起始地址偏移量0,搜索一次后,DI自動加1,使DI的值等于1;每執行一次搜索操作,DI自動增1;因此可用DI的值表示搜索次數。 例 若在數據段中有一個數據塊,起始地址為BLOCK ,數據塊中的數為8位帶符號數,要求將其中所含的

6、正、負數分開,然后把正數送到附加段中始址為PLUS_DATA 的緩沖區,負數則送到附加段中始址為MINUS_DATA 的緩沖區。分析:把數據塊作為數據串處理:DI和BX分別作正、負數目的緩沖區的指針;CX用于控制循環次數。技巧:使用STOSB 為目的指針;負數區的目的指針在BX中,要用XCHG 指令將BX內容送進DI,讓DI指向負數區,同時也把DI中的正數區目的指針保護了起來;執行STOSB 指令后,再用XCHG 指令交換回來,以便下次重復執行時(轉回GOON 標號后),LODS 指令仍能正確執行。解:寫出如下程序段:START: MOV SI, OFFSET BLOCK指針MOV DI, O

7、FFSET PLUS_DATA 正數目的區指針MOV BX, OFFSET MINUS_DATA ;BX為負數目的區指針MOV CX, COUNTCLDGOON: LODSB BLOCKTEST AL, 80HJNZ MINUSSTOSBJMP AGAIN 字節送正數區MINUS: XCHG BX, DI 數區指針STOSBXCHG BX, DIAGAIN: DEC CXJNZ GOON次數減1 ;停機 ;HLT7、例 設某個學生的英語成績已存放在AL寄存器中,若低于60分,則 ;當在60分和84分之間時,打印P(PASS)。解:用下面程序實現要求的操作。程序:CMP ;與60分比較JB FA

8、IL;60,轉FAILCMP JAE GOOD MOV JMP PRINT ;轉打印程序MOV ALFFAIL:JMP PRINT ;轉打印程序GOOD : MOV ALGPRINT: ;打印存在AL中的字符8、例 假設某溫度控制系統中,從溫度傳感器輸入一個8位二進制的攝氏溫度值。當系統中溫度低于100度時,則打開加熱器;當溫度上升到100度或100度以上時,關閉加熱器,進行下一步處理。設溫度傳感器的端口號為320H,同時假設控制加熱器的輸出信號連到端口321H的最低有效位,當將這一位置1時,加熱器便打開,清0時則關閉加熱器。解:實現上述溫度控制的程序如下:程序:GET_TEMP :MOV 0

9、H ;DX指向溫度輸入端口IN ;讀取溫度值CMP , ;與100度比較JB HEAT JMPHEAT _ON :HEAT ,停止加熱MOV H ;D0位置1,加熱MOV 1H ;加熱器口地址OUT , ;打開加熱器JMPHEAT _OFF :繼續檢測溫度MOV , ;D0位置0,停止加熱MOV 1HOUT , ;關閉加熱器 ;進行其他處理9、例設商店里有8種商品,價格分別為83元,76元,65元,84元,7l元,49元,62元和58元,現要將每種商品提價7元,編程計算每種商品提價后的價格。解:加法問題:將商品的原價按BCD 碼的形式,依次存放在標號為OLD 開始的8個存儲單元中,而新的價格存

10、放進NEW 開始的8個單元,然后用LOOP 指令來實現8次循環。即程序清單:OLDDB ,65H,84HDB ,62H,58HDB 8NEWMOV HMOV H;共8種商品;BX作指針,初值為0NEXT : MOV OLDBXADD ;加上提價因子;調整為十進制;讀入一個商品的原價DAAMOV ;存放結果INC BX ;地址指針加1LOOP NEXT ;如未加滿8次,繼續循環 ;已加完8次10、例 這是一個用循環和跳轉指令來控制PC機的揚聲器發聲的程序。在PC機中,61H端口的D1和D0位接到揚聲器接口電路上,在D00的情況下:當Dl1時,揚聲器被接通,D10則斷開,通過控制這一位的值,就能產

11、生一個由1和0構成的二進制序列,使揚聲器發聲。解:IN,6 ; AL從61H端口讀取數據AND ;保護D7D2位, MORE : XOR ;觸發D1位,使之在0和1間變化OUT ;控制揚聲器開關通斷MOV 0 ;CX=循環次數DELAY : LOOP DELAY ;循環延時JMP MORE;再次觸發延時程序的實現:CX ;循環次數為10LOOP DELAY ;本指令重復執行10次11、例 設有一個由50個字節組成的數組存放在ARRAY 開始的內存單元中,現要對該數組中的元素進行測試,若元素為0,而且不是最后一個元素,便繼續進行下一個元素的測試,直到找到第一個非零元素或查完了為止。解:ARRAY

12、 : DB ;含50個元素的數據MOV ARRAYDEC BX ;指針減1;BX指向數組開始單元MOV ,;CX=元素個數NEXT : INC BX ;指向數組的下 個元素CMP ;數組元素與0比較LOOPE NEXT;若元素為0;和 ;否則,繼續查找12、例 設一個由17個字符組成的字符串存放在STRING 開始的內存中,查找該字符串中是否包含空格符。若沒有找到和尚未查完,測繼續查找,直到找到第一個空格符或查完了才退出循環。解:下面是實現上述操作的程序:STRING : DB Personal MOV OFFSET STRING ;BX指向字符串的開始DEC BX ;BX1MOV 17NEX

13、T : INC BX ;指向下一個字符串CMP ;字符串元素與空格比較;CX=字符串長度LOOPNE NEXT ;找到空格或CX已為013、例 設CPU的時鐘頻率為5MHZ ,試編寫一個延時1ms的程序。解:程序如下:DEL_1MS: MOV N NOP ;3NNOP ;3NLOOP NEXT ;循環時為17,不循環為5延時常數N的計算:;4 1CPU的時鐘頻率為5MHZ ,則一個時鐘周期為: 所需要的總的時鐘周期數CT為: CT5000總的時鐘周期數CT又可以用循環常數N來表示:CT43N3N85000N ,可實現1ms的精確延時。(注:第一條指令只執行一次;兩條NOP 指令各執行N次;最后

14、的LOOP 指令,共循環執行N一1次,最后一次不循環)14、例 若希望獲得時間更長的延時,可以采用嵌套的多重循環程序來實現。這時程序中往往有兩個定時常數,通常先指定其中的一個,再計算出另一個。解:觀察下面的程序:MOV N1 ;4 1 MOV N2 ;4 N1 LOOP CNT2 DEC BX ;2N1JNZ CNT1 ;16 上面程序執行所需要的總的時鐘周期數CT為: 假設CPU的時鐘頻率仍為5MHz ,可根據所需的延時,計算出總的時鐘周期數。然后,先選定常數N2,再根據上式算出N1來。15、例 兩個16位無符號二進制數相乘DDATASEGMENT;數據段D1 DW 1234HD2 DW 5

15、678HP1 DD ?P2 DD ?DDATAEDATAENDSSEGMENTENDS;附加段E1 DB ?E2 DW 4 DUP (?)EDATASSTACKSEGMENT STACK STACKDW 100 DUP (?)SSTACKCCODEMAINENDSSEGMENTPROC FARASSUME CS:CCODE, DS:DDATA, ES:EDATA, SS:SSTACKSTART:PUSH DS ;返回DOS 用SUBPUSH AXAX, AXMOV MOV SS, AXMOV AX, 始化DS DSMOV AX, 始化ESMOV ES, AXMOV BX, OFFSET ,積在

16、(DX,L1:AX)MOV AX, BXMOV DX, 0MUL WORD PTR BX+2MOV BX, P2和P1所指向的存儲單元MOV BX, AXMOV BX+2, DXRETMAINCCODEENDPENDSEND START16、例 用過程調用的方法,將內存中N個BCD 碼相加。DATA SEGMENTONETWODB 22,33,44,55DB 55,66,77,88DB 20 DUP(?)SUMENDSSEGMENT STACKSTT DB 50 DUP(?)TOP EQU LENGTH STTDATASTACKSTACK ENDSCODEMAINSEGMENTPROCASSU

17、ME CS:CODE, DS:DATA, FARSTART: MOVMOVMOVAX, STACKSS, AXSP, TOPDSPUSHSUBPUSHMOVMOVAX,AXAXAX, DATADS, AXMOVSI, OFFSET ONE MOVMOVBX, OFFSET TWODI, OFFSET SUM;清方向標志;清進位標志CX, 4CLDCLCMOVLL:CALLLOOPRETABCLLMAINABCENDPPROCLODSBADCDAASTOSBNEAR;完成單字節數據加法運算 SI+1SIAL, BX;相加L1:;十進調整;ALDI,DI+1DI;指針改變INC BXRETABCC

18、ODEENDPENDSENDSTART17、 例5-1內存中TABLE 開始存放09的平方值,通過人機對話,當的平方值,放在AL中。解: DATA SEGMENTTABLE DBBUF DB0,1,4,9,16,25,36,49,64,81Please inputDATA ENDSSTACK SEGMENT PARA STACK STACKDBTOP LABEL WORD50 DUP(?)STACK ENDSCODEMAINSEGMENTPROC DS:DATA, SS:STACKFARSTART :MOV AX, DATAMOVDS, AXMOVAX, STACKMOVMOVSS, AXSP

19、, OFFSET TOPMOVNEXT : MOVBX, OFFSET TABLEDX, OFFSET BUF 數(P161)MOVAH, 9INTMOVINT21HAH, 121H (P159)MOVANDADDMOVAH, 0 ;查表得輸入數的平方值AL, 0FHBX, AXAL, BXAH, 4CH21HMOVINTRETMAINCODEENDPENDSENDSTART18、 存儲器中有一串字符串首址為BUF,字符串長度N小于256,要求它們的個數存放到此字符串的下面三個單元中。解: DATA SEGMENTDB NBUFDB 01H,38H,47H,60H, 76HDB 3 DUP (

20、?)ENDSSEGMENTPROC FAR ,DS:DATANUMDATACODEMAINSTART :PUSH DSSUBPUSHMOVAX, AXAXAX, DATAMOVCH, NDS, AX;數組個數NCHBX, 1MOVMOVMOVMOVCMPJLCMPJG計數字的個數,DL計字母的個數AH, BUF BXAH, 30HAH, 39HNEXTLP:INCJMPABC : CMPJLAH, 41H AH, 5AH 字母的個數加1BX ;數組地址加1CMPJGINCNEXT : INCDECJNZMOV BUFBX, DHLP;數字的個數送入內存單元MOV BUFBX+1,MOV AH,

21、 NSUB AH, DH;NDHDL= 其它字符的個數SUB AH, DLMOV BUFBX+2, RETMAINCODEENDPENDSENDSTART19、設有首地址為BUFFER 的數組,已按升序排好,數組長度N10,在數組中查找數M(正確的排序位置,DX中記錄數組最后的長度。解: DATASEGMENTBUFFER DW 5,10,32,47,53,77,89,106,115,124NMEQUEQU1080DATA ENDSCODESEGMENT D DATA, MAIN PROC FARSTART :PUSH DSSUBAX, AXPUSH AXMOVMOVMOVAX, DATADS

22、, AXES, AXMOV AX, M;待查數AXMOVMOV DX, NCX, MOVCLDDI, OFFSET BUFFERREPNESCASW;串掃描查找JEDECMOVADDSI,SI, DXL1:CMPJLAX, BUFFERSIBUFFERSI+2,L3MOVJMPL2: MOVBX, BUFFERSI ;數組下移一位MOV BUFFERSI+2, BXSUBJMPSI, 2L1L3:ADDJMPJCXZDX, 1NEXT1NEXT;修改長度DEL:DEL1: MOV;找到,刪此元素;其后元素依次前移BX, DIMOVADDLOOPDXDI-2, BXDI, 2DEL1NEXT :

23、DECNEXT1 :RETMAIN ENDP;改變數組長度CODE ENDSEND START解:MOVSI, OFFSET 設置內存地址CH,計數初值4CL, 4MOVNEXT : MOVROLBX, 最高位移到右邊AL, 一個數轉換成ASCII碼AL, 0FHMOVANDADDCMPJLAL, 30HAL, 字符為AF嗎?STOREAL, 7ADDSTORE :MOVSI, ALMOV;字符存入內存MOVINTINCDECJNZDL, AL21HS 修改計數并判斷CHNEXTHLT ;循環結束21、 放到CL寄存器。解:相應程序如下MOVLCL, 0 ;初始化AND AX, AX ;控制循

24、環JZSTOP體L2SALJNCINCCLLJMPHLTL1 存儲器數據段從BUF開始存放一個字數組,數組中第一個字中存放該數組的長度N,編制一個程序使此數組中的數據按照從小到大的次序排列。解: ADATASEGMENTBUF DW N,15,37,8600,A768H,3412H,1256H,76HENDSASTACK SEGMENT STACK STACKADATASATOPDB 100 DUP(?)LABEL WORDASTACKACODEENDSSEGMENT DS:ADATA, SS:ASTACKMAINPROC FAR MOV AX, ASTACKMOV SS, AXMOV SP,

25、 OFFSET TOPPUSH DSSUB AX, AXPUSH AXMOV AX , ADTATMOV DS, AXMOVBX, 0MOVCX, 內循環次數DECCXDX, CXLMOV;設計數器DX,外循環次數LADDBX, 2MOVCMPAX, AX, BUF BUFI=BUFI+2轉JBECONT1XCHGMOVAX, BUFBX, AX;內循環CX, 外循環次數CXBX,地址返回第一個數據 LOOP L2MOVMOVLOOPRETMAIN ENDPACODE ENDSEND START23、 排序可采用另一種算法,用設置標志的方法排序。當排序已完成,即沒有數進行交換時,可以結束外循環

26、,不必循環Nl遍,節省了操作時間。設立一個FLAG 位作標志,進入外循環時標志為0,在內循環中每進行一次交換,標志置1。內循環結束測試標志,若為1再一次進入外循環;若為0表示內循環沒有進行數據交換,可以結束外循環了。下面給出了排序算法2的有關程序。MAIN PROC FARSTART :MOVDI, OFFSET BUF;數組起始地址MOVCXMOVMOVADDCX, DI;設計數器CX,內循環用;N1,內循環次數DX, 外循環用為FLAGDI, 2DECL1:L2:MOVAX, FLAG=1CMPJBEXCHGMOVMOVAX, DI+2CONTIAX, DI+2DI, AXBH, 1CON

27、TI :LOOP L2CMP內循環未交換數,跳出外循環,;否則DX1,又一次內循環,繼續比較JE STOPMOV CX, DXMOVLOOPDI, OFFSET BUFL1STOP: RET24、有一個子程序說明如下:;名稱:BCD2BIN;功能:將一個字節的BCD 碼轉換成二進制數;所用寄存器:CX;入口參數:AL存放兩位BCD 碼;出口參數:AL存放二進制數;調其它子程序:無子程序形式如下;BCD2BIN PROC PUSHMOVANDMOVSHRMOVMULADDPOPRETCXCH, ALCL, 4CL, 10CLCXBCD2BINENDP25、解:本例通過存儲器來傳遞參數。相應程序如

28、下:DATA SEGMENTARY1 DW 100 DW ?SUM1ARY2 DW 100 SUM2 DW ?DATASTACKENDSSEGMENT STACKSATOPDW 50 DUP(?)EQU LENGTH SASTACK ENDSCODE SEGMENTASSUME ,SS:STACKMAIN PROC FARSTART :MOV AX, DATAMOVMOVMOVMOVLEAMOVCALLLEAMOVCALLRETDS, AXAX, STACKSS, AXSP, TOPSI, CX, LENGTH SUM ;調用求和子程序SI, CX, LENGTH SUM ;調用求和子程序MA

29、IN ENDPSUM PROC NEARXOR;子程序AX, AX ;AX清0L1:ADDINCAX, WORD PTRSI;加數組元素SISIINCLOOPMOVMOVINTRETL1WORD PTRSI,AH, 4CH21HSUM ENDPCODE EDNS;子程序返回STARTEND26、通過堆棧傳遞參數,實現十進制數數組求和,要求主程序和過程不在同一個代碼段中,要進行段間調用。相應程序如下:MDATASEGMENTARY1SUM1DW 20 DW ?ARY2 DW 20 義數組2DW ?SUM2MDATAENDSMSTACK SEGMENT STACKSBTOPDW 100 DUP(?

30、)LABEL WORDMSTACKMCODEENDSSEGMENT;主程序段ASSUME CATA ,SS:MSTACKFARMOV AX, MSTACKMAINSTART :PROCMOVMOVSS, AXSP, OFFSET TOPPUSH DS;初始化DS, SS, SPAX, 0AXAX, MDATADS, AXAX, OFFSET 過程入口參數MOVPUSHMOVMOVMOV進棧PUSHMOV 組地址AX, SIZEAXPUSHCALL FAR PTR PADDMOVPUSHAX, OFFSET ARY2AXMOV AX, SIZE ARY2PUSH AXCALL FAR PTR P

31、ADDRETMAIN ENDPMCODE ENDSPCODESEGMENT DS :MDATA, SS :MSTACKPROC FAR;過程段PADDPUSH BX ;寄存器保護PUSH CXPUSH BPMOV BP, SPMOV CX, MOV BX, ARY 起始地址BXMOV AX, 0ADDAL, BX ;數組相加DAAMOVMOV 暫存AL, 0ADC AL, 進位 ALDAAMOV AHMOV INC BXLOOPMOVNEXT 組和SUMPOPPOPBPCXBXPOPRET ;彈出返回地址后,再彈出4個字節數據PADDPCODEENDPENDSEND START27、己知兩個無

32、符號數125及468,求它們的和并將和轉換成十六進制數在屏幕上顯示DATA SEGMENTP DW 125, 368SUMDW ?DATA ENDSCODEASSUME CS :CODE, DS:DATASEGMENTMAINSTARTPROC FARPUSHDSXORPUSHMOVMOVMOVCALLRETAX, AXAXAX, DATADS, AXSI, OFFSET P ;數組起始地址SIPADD ;兩數相加子程序MAINENDPPADD PROC NEAR;兩數相加子程序PUSHPUSHPUSHPUSHAXBXCXDXMOVAX, SI;數組起始地址SIAX, SI+2SUM, AXA

33、DDMOVCALLPOPPOPPOPPOPRETDISPDX;顯示子程序CXBXAXPADDENDPDISP PROC NEAR;顯示子程序BX, SUM MOVMOVL1:MOVROLMOVANDADDCMPJLCL, 4BX, AL, BLAL, 0FHAL, 碼AL, 3AHL2AL, 07HADDMOVL2:DL, AL ;顯示(P161)AH, 221HMOVINTDECJNZRETENDPENDSCHL1DISPCODEENDSTART28、要求計算N!(N0)解:遞歸調用的應用:一1)* 1, 0 N N 計算核心:N!子程序。注意入棧信息。N!子程序說明:;名稱:FACT;功能

34、:階乘子程序;入口參數:ALN;出口參效:DXN!;使用寄存器:CX具體程序如下:ADATAADATASEGMENTD1 DB 4 ;N=4D2 DW 2 ENDSASTACK SEGMENT PARA STACK STACKSATOPDW 100 DUP(?)LABEL WORDASTACKACODEENDSSEGMENTASSUME CS:ACODE, DS:ADATA, SS:ASTACKFARMAINSTART :PROCMOVMOVMOVAX, ASTACKSS, AXSP, OFFSET TOPPUSHMOVPUSHMOVDSAX, 0AXAX, DS, SS, SPDS, AX

35、N! 零,為AL入棧保護BX, AL, ,子程序的入口參MOVMOVMOVMOVMOV數CALLFACTBX+1, DXLP1:MOVRETENDPPROCMAINFACT;N!子程序CMP AL, 0JNZMOVCHN, N!=1RETPUSHCHN :LP2: N入棧DECCALL 子程序POPMULMOVRET彈出 FACTACODEENDPENDSENDSTART29、將十六位二進制數轉換成4位壓縮型BCD 碼算法:將AX中的二 數的千位、百位和十位數,余數是個位數。子程序名:B2TOBCD輸入參數:AX十六位二進制數輸出參數:CF0,則AX4位壓縮型BCD 碼;CF1,則要轉換的數大

36、于9999,AX不變。使用寄存器:CX:存放除數;DX:存放中間結果。B2TOBCD PROC FARCMP AX, ,則CF置1JBE TRANSTCJMPEXITDXTRAN :PUSHCXPUSHSUBMOV CX,千位數DIV ,余數在DXXCHG 中,余數在AX中;DX=_ _ _ MOVSHLMOVDIVCL, 4X DX=_ _ _百位數CLADDDL, AL;百位數加到DL中,DX=_ _ MOVSHLCL, 4 _XCHG AL, 數保留在AL中SUB AH, AHMOVDIVADDMOVSHLADDMOVPOPPOP十位數CL 數加到DL中,DX=_CL, 4 4位,DX=

37、 _ 中DXCXEXIT:B2TOBCDRETENDP30、將十進制數的ASCII字符串轉換成有符號二進制數算法:首先檢測字符串為正還是為負,若是為負,將標識符MINU 置1,然后進行字符串轉換,轉換結束判別標識符MINU ,若MINU 是1,把AX中的數取補。字符串轉換方法:采用累加和(DX)乘10,然后讀取下一個字符并轉換成二進制數加到累加和中。(例: 5)子程序名:AS2BIN輸入參數:DX= 字符串偏移量;CX字符串字符個數輸出參數:CF=0,則AX= 二進制數;CF=1,則字符串非法,AX0。使用寄存器:AS2BINPROC FARPUSHPUSHCXDXPUSHMOVSI CMP

38、JACLDMOVERRCMP AL, JNEMOVJMPCHK DECSCHK :CMP JNE CLRD 1INC 移DX, 清0,放結果DECS :DECCLRD :NEXT :SUBCALL CHE ;乘10JC 65535出錯LODSB ;讀下一個字符到ALCMP JBCMPERRERRAL, 9JAANDADDJCLOOPMOVCMPJNENEGJMPAX, DX, AXERR;累加和超過65535出錯NEXTAX, MINU, 負數求補EXITEXITERR:STCAX, 0POP;字符串為非法MOVEXIT:SIDXCXPOPPOPRETCHE果為0。PROCPUSHBXMOVS

39、HLSHLADDBX, DXDX, 1DX, 1DX, BXSHL POPRETBXCHEAS2BINENDPENDP31、完成兩個多位十進制數相乘,并將結果送屏幕顯示。解:該程序包含三個過程:MMUL 過程:一位和多位十進制數相乘,并輸出結果;MULS 過程:兩個一位十進制數相乘,結果以非壓縮型BCD 碼形式保留在AX中;DOUT 過程:累加部分積,采用過程嵌套調用的方法。NAME MULTDATA SEGMENTX DB 4,5,6,7;定義被乘數N1 $;被乘數位位數;數據段YN2ZPQDB 義乘數YEQU DB DB 45671234=DB DATAENDSSTACKSEGMENT S

40、TACKDW 50H DUP(?)TOP LABEL ;堆棧段STACKCODEENDSSEGMENT;代碼段ASSUME CS:CODE, DSACKPROC FARMAINSTART :MOV AX, DATAMOVDS, AXMOVMOVAX, STACKSS, AXMOVMOVSP, OFFSET TOPCL, 4MOVMOV 長度,即乘數指針LOOP1 :MOVCH, 1 ;取1位乘數CALL ;完成一次部分積并與前次部分積累加;INC ; DEC 指針前移JNZ MOV SI, DXMOVANDBX, 0AL, ASCII碼,ASC:MOVOR Q中;BXMOVINCDECCMPJ

41、NLMOVSISI, 0ASCAH, 9;顯示乘積結果DX, OFFSET P21HDISP:MOVMOVINTMOVINTRETAH, 4CH21H;主程序結束MAINMMULENDPPROC NEAR;并輸出部分積累加和PUSH 分積的起始累加位指針PUSH ;一位和多位十進制數相乘,MOVAL, ;取1位被乘數LOOP2 : MOVCALLCALL 一位十進制數相乘 部分積,嵌套調用INC 部分積指針后移DEC JNZLOOP2POP POP的起始累加位指針出棧RETMMULMULS PROC NEAR;非壓縮型BCD 碼形式保留在AX中ENDP;兩個一位十進制數相乘,結果以PUSHBX

42、MOVANDANDMUL;被乘數指針N1入棧保護中是1位乘數BL, 0FHBLAAM ;AHAL/10 的商,ALAL/10的余數POPRET出棧,到BXMULSENDPDOUT PROCNEARPUSH NEXT :ADD AL, ZSI;ALAAA; MOV ;累加部分積MOVXOR兩位乘積的十位AH, AHINC MOVCMPJNZ積高位指針入DX保護AL, 0POP SI RETDOUT ENDPCODE ENDSEND START32、 點亮相應的LED;掃描周期為10ms,通過調用一個子程序DELAYNEXT: MOV DX, 8000H ;DX指向接口IN NOT AL ;反相O

43、UT CALL JMP 重復 CPU與外設采用查詢方式傳送數據,現有一輸入設備,其數據端口地址為1000H,并于端口1002H提供狀態,當其D0位為1時表明輸入數據準備好,采用查詢方式編寫程序段,要求從該設備讀取200B并輸入到以F000H為起始地址的內存中。MOV CX, 200MOV BX, 0F000HNEXT:AGN :MOV DX, 1002HIN AL, DXTEST D0JZ AGNMOV DX, 1000HIN AL, DXMOV BX, ALINCBXLOOP NEXT34、用指令來設置中斷服務程序的入口地址表方法一:MOV AX, 0主程序中設置 ;MOV ES, AXMO

44、V DI, N4 ;中斷類型號4MOV AX, OFFSET CLISTOSW 元MOV AX, SEG INTRADSTOSWSTI元;開中斷INTRAD: 方法二:;中斷服務子程序IRETMOV AX, 0MOV ES, AXMOV BX, N4主程序中設置;;中斷類型號4MOV AX, OFFSET MOV ES:WORD PTRBX, AXMOV AX, SEG INTRAD ;置段地址MOV ES:WORD PTRBX+2, AXSTI;開中斷INTRAD: ;中斷服務子程序IRET利用DOS 功能調用來設置中斷服務程序的入口地址表MOV AL, NMOV AH, 35H取中斷向量到

45、ES:BX;INTPUSH ES21H存原中斷向量;PUSH BXPUSH DSMOV AX, SEG INTRADMOV DS, AX;設置中斷向量段地址在DSMOV DX, OFFSET INTRADMOV AL, NMOV AH, 25H;設置中斷向量偏移地址在DX;中斷類型號 ;設置中斷向量INT21HPOP DS;中斷在此段程序內產生并響應;恢復原中斷向量POP DXPOP DSMOV AL, NMOV AH, 25HINT 21HRETINTRAD:IRET35、例 編寫中斷處理程序,要求主程序運行時,每10秒響鈴一次,同時屏幕上顯示信息“The bell is 分析: 1CH;

46、INT 1CH的處理程序只有一條IRET指令;編寫一段程序替代INT 1CH,實現相應功能。注意:保存原中斷向量;設置新中斷向量;恢復原中斷向量。DATA SEGMENTCOUNT DW 1;定義數據段MESSDB The bell ,$DATAENDSSTACKSEGMENT;定義堆棧段STT DB 100 DUP(?)TOP LABLE WORDSTACK ENDSCODEMAINSEGMENTPROCASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACKSTART: MOV AX, STACK ;堆棧段初始化MOV SS, AXMOV SP, OFFSET TOPPUSH DS ;程序段前綴;定義代碼段FARSUB AX, AXPUSH AXMOV AX, DATAMOV DS, AX;主程序初始化MOV AL, 1CHMOV AH, 35HINT 21H;數據段初始化設置中斷向量;取原中斷向量,ES:BXPUSH ESPUSH BXPUSH DS;存儲原中斷向量MOV DX, OFFSET RINGMOV AX, SEG

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論