程序設計總結_第1頁
程序設計總結_第2頁
程序設計總結_第3頁
程序設計總結_第4頁
程序設計總結_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、程序設計程序設計 拆字程序拆字程序 算術運算算術運算 比較大小比較大小 統(tǒng)計個數統(tǒng)計個數 字符串操作字符串操作 DOS系統(tǒng)功能調用系統(tǒng)功能調用拆字程序例例1請設計一個拆字子程序,將請設計一個拆字子程序,將DATA單元的單元的內容拆成兩個十六進制數,并送入內容拆成兩個十六進制數,并送入RESULT、RESULT+1存儲單元。流程圖如圖存儲單元。流程圖如圖6.1所示。所示。圖圖6.1程序如下:程序如下:MOV AL,DATAMOV AH,ALAND AL,0FHMOV RESULT,ALAND AH,0F0HMOV CL,04SHR AH,CLMOV RESULT+1,AHHLT例例1請設計一個拆

2、字子程序,將請設計一個拆字子程序,將DATA單元的內容拆單元的內容拆成兩個十六進制數,并送入成兩個十六進制數,并送入RESULT、RESULT+1存儲單元。流程圖如圖存儲單元。流程圖如圖6.1所示。所示。十六進制數的十六進制數的ASCII碼碼例:例: AX寄存器中存放著寄存器中存放著4位十六進制數,位十六進制數,試編寫程序將這試編寫程序將這4位十六進制數分別轉換為位十六進制數分別轉換為相應的相應的ASCII碼,并依次存放到碼,并依次存放到RESULT數數組的組的4個字節(jié)中去,要求用調用子程序的方個字節(jié)中去,要求用調用子程序的方法實現。法實現。 DATADATA SEGMENTSEGMENT H

3、EXDATA DW 4D7EHHEXDATA DW 4D7EH RESULT DB 4 DUP(?)RESULT DB 4 DUP(?)DATADATA ENDSENDSCODECODESEGMENTSEGMENT ASSUME CS:CODE;DS:DATA ASSUME CS:CODE;DS:DATA START: START:MOV AX, DATAMOV AX, DATAMOV DS, AXMOV DS, AXMOV CX, 4MOV CX, 4 LEA SI, HEXDATA LEA SI, HEXDATA LEA DI, RESULTLEA DI, RESULTMOV BX, SI

4、MOV BX, SINEXT:NEXT:MOV AX, BXMOV AX, BXAND AL, 0FHAND AL, 0FHCALL HEXASCCALL HEXASCMOV DI, ALMOV DI, ALINC DIINC DIPUSH CXPUSH CXMOV CX, 4MOV CX, 4 ;十六進制轉換成;十六進制轉換成ASCIIASCII碼碼子程序子程序HEXASCHEXASC:PROCPROC CMP AL, 0AH CMP AL, 0AH JB PLUS30 JB PLUS30 ADD AL, 07H ADD AL, 07HPLUS30: ADD AL, 30HPLUS30: A

5、DD AL, 30H RET RETHEXASCHEXASC:ENDPENDP CODE ENDSCODE ENDS END ENDSTARTSTART 算術運算算術運算 例1:用數據運算指令,對兩個16位數相加運算。這兩個數從地址10050開始連續(xù)存放,結果放在這兩個數之后。 解:(1)分析題目 (2)確定算法 (3)繪制流程圖(見圖見圖 ) (4)內存空間分配(見表見表 )(5)編制的程序如下: MOV AXMOV AX,1000H1000H MOV DS MOV DS,AX AX ;DS=1000HDS=1000H MOV SI MOV SI,50H 50H ;被加數指針;被加數指針SI

6、=50HSI=50H MOV DI MOV DI,52H 52H ;加數指針;加數指針DI=52HDI=52H MOV BX MOV BX,54H 54H ;和的指針;和的指針BX=54HBX=54H CLC CLC ;清;清CFCF X0R AX X0R AX,AX AX ; MOV AXMOV AX,SI SI ;取一個字到;取一個字到AXAX ADC AX ADC AX,DIDI ;AXAX+DI+CFAXAX+DI+CF MOV MOV BXBX,AX AX ;存一個字到;存一個字到BXBX HLT HLT ;暫停;暫停 例例2設計程序:設計程序: 已知數據段已知數據段2000H單元開

7、始存放單元開始存放20個字型無符號數,請計算其累加和(和小于個字型無符號數,請計算其累加和(和小于65535),并送往),并送往3000H開始的存儲器單元。開始的存儲器單元。 MOVAX,0 MOVBX,2000H MOVCX,20AG ADD AX,BX ADDBX,2 DEC CX JNZ AG MOV3000H,AX HLT【例【例3 3】DATA SEGMENT X DB 5FH Y DB 57H ZDB ?DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATASTART: PUSH DS MOV AX, 0 PUSH AX

8、MOV AX, DATA MOV DS, AX MOV AL, X ADD AL, Y MOV AH, 0 ADC AH, AH SHR AX, 1 MOV Z, AL RETMAIN ENDPCODE ENDS END START比較大小例例1二分支程序實例。二分支程序實例。 已知在數據段已知在數據段2000H單元存儲一個無符號單元存儲一個無符號字節(jié)數據,如果此數據大于等于字節(jié)數據,如果此數據大于等于55H,則將,則將它送到寄存器它送到寄存器BL中,否則將它送到存儲器中,否則將它送到存儲器2010H單元。單元。流程圖如圖流程圖如圖5.8所示。所示。圖圖5.8 MOV AL,2000H CMP

9、 AL,55H JNC DAS;大于等于則跳轉;大于等于則跳轉XAO MOV 2010H,AL;送小數;送小數 JMP EDDAS MOV BL,AL;送大數;送大數ED HLT 【例【例2 2】求AX累加器和BX寄存器中兩個無符號數之差的絕對值,結果放在內存(2800)單元中。 (1)分析題目:此題目中,AX累加器和BX寄存器中的數是不知道的。對兩個不知大小的數相減并求絕對值,顯然應該先解決哪一個值稍大些,然后再用大數減小數的方法,才可求得絕對值。(2)根據指令系統(tǒng)中的比較指令,編出判斷大小的環(huán)節(jié),即可解決問題。圖6-5為該例題的程序流程圖。(3)根據流程圖編制程序如下: CLC ;清除;清

10、除CFCF CMP AX,BX ;AX-BXAX-BX,結果不返回,結果不返回 JC AA ;CF=1CF=1轉轉AAAA去執(zhí)行(即去執(zhí)行(即 AXBXAX1,并且放在內存(2001)單元中,而數據塊本身是從(2002)單元開始存放的,最后,把找出的最大值放到(2000)單元中。假設這段數據塊中的數都是無符號的8位數。 (1 1)分析題目)分析題目:此題必定是個循環(huán)程序,而且在處理部分應包括判斷分支環(huán)節(jié)。 (2)根據指令系統(tǒng),我們可以采用尋找最尋找最大值大值的計算方法。 (3 3)繪制出此計算過程的程序流程如圖)繪制出此計算過程的程序流程如圖6-6-l5l5所示。所示。(4) 編制的程序如下編

11、制的程序如下(未作為子程序時未作為子程序時): MOVSI,2001H ; 指針指向放數據塊長度的單元指針指向放數據塊長度的單元 MOVCL,SI ; 取出來作為循環(huán)次數取出來作為循環(huán)次數 INCSI ; 指針指向第一個數指針指向第一個數 MOVAL,00 ; 設置最大值設置最大值00 MOVCH,00 ; 初始化初始化LP:CLC ; 清除進位位清除進位位 CMPAL,SI ; 取出數與最大值比較取出數與最大值比較 JCBB ; AL中數小,轉到取代處中數小,轉到取代處 JMPAA ; AL中數大,跳過去中數大,跳過去BB: MOVAL,SI ; 把大數放到把大數放到AL中保存中保存AA:

12、INCSI ; 指針下移指針下移 LOOPLP ; 次數減次數減1,判循環(huán)結束否,判循環(huán)結束否 MOV2000H,AL; 把最大值放到指定單元保存把最大值放到指定單元保存 HLT【例【例1 1】YYNNDATASEGMENTxx DB 49,38,65,12,97,13,55,27,28,85yy DB ?DATAENDSCODE SEGMENTASSUME CS:CODE, DS:DATASTART: MOV AX, DATA MOV DS, AX LEABX, xx MOV AL, BX MOV CX, 29LOOP1: INC BX CMPAL, BX JAE NEXT;高于等于:比較無

13、符號數高于等于:比較無符號數 XCHG AL, BX NEXT: LOOP LOOP1 MOV yy, AL MOV AH, 4CH INT 21HCODE ENDSEND START【例【例3】已知已知X單元內有一自變量,請按如下條件編單元內有一自變量,請按如下條件編出求函數值并將它存入出求函數值并將它存入Y單元的程序。單元的程序。 Y=1X00 X=0-1 X0算法算法: 這是一個三分支歸一的條件轉移問題。由題意可知,這是一個三分支歸一的條件轉移問題。由題意可知,自變量自變量X是個帶符號數,故可采用與零比較和條件轉移是個帶符號數,故可采用與零比較和條件轉移指令來做。指令來做。DATA SE

14、GMENT X DB -25 Y DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE , DS:DATASTART: MOV AX , DATA MOV DS , AX MOV AL , X CMP AL , 0 JGE LOOP1:大于等于:有符號數:大于等于:有符號數 MOV AL ,0FFH JMP EXITLOOP1:JE LOOP2 MOV AL , 01H JMP EXIT LOOP2: MOV AL , 00HEXIT : MOV Y , AL MOV AH ,4CH INT 21HCODE ENDS END START AL XAL0?AL=0?A

15、L -1AL 1AL 0 FUNC ALYYNN 開始 結束統(tǒng)計1或0的個數 例例1 1 編寫統(tǒng)計編寫統(tǒng)計AXAX寄存器中寄存器中0 0和和1 1個數的程序個數的程序段,將統(tǒng)計結果分別存入變量段,將統(tǒng)計結果分別存入變量VAR0VAR0和和VAR1VAR1中。中。 XOR DX XOR DX,DXDX MOV CX MOV CX,10H10HLOOP1LOOP1:SHL AXSHL AX,1 1 JC ONE JC ONE INC DL INC DL;統(tǒng)計;統(tǒng)計0 0的個數的個數 JMP NEXTJMP NEXT ONE ONE: INC DHINC DH;統(tǒng)計;統(tǒng)計1 1的個數的個數NEXTN

16、EXT: LOOP LOOP1LOOP LOOP1;循環(huán);循環(huán)1616次次 MOV VAR0MOV VAR0,DLDL MOV VAR1 MOV VAR1,DHDH【例【例2】在在ADDR開始的單元中存放著一個字開始的單元中存放著一個字,將字將字中中1的個數存入的個數存入COUNT單元中。單元中。算法算法: 要測出要測出1的個數就應逐位比較的個數就應逐位比較,可根據最高有效位是可根據最高有效位是否為否為1來計數來計數,然后用移位的方法把各位數逐次移到最高然后用移位的方法把各位數逐次移到最高位去。位去。 可以用測試字是否為可以用測試字是否為0來作為結束條件,這樣可縮來作為結束條件,這樣可縮短程序

17、的執(zhí)行時間,對不同的字循環(huán)次數不同,采用當短程序的執(zhí)行時間,對不同的字循環(huán)次數不同,采用當型循環(huán)結構。型循環(huán)結構。 CX=0字字=0?字為負字為負?CXCX+1COUNTCX字邏輯左移字邏輯左移1位位NYN開始開始YN 結束結束DATA SEGMENTADDR DW 76A3HCOUNT DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE , DS:DATA START: MOV AX , DATA MOV DS , AX MOV CX , 0 MOV AX , ADDR REPEAT:TEST AX , 0FFFFH JZ EXIT JNS SHIFT;結果為正

18、結果為正SF=0 INC CX SHIFT: SHL AX , 1 JMP REPEAT EXIT: MOV COUNT , CX MOV AH , 4CH INC 21HCODE ENDS ENDS START字符串比較例例1 1 設有兩個等長字節(jié)型字符串,試編寫程序,比較它們是否設有兩個等長字節(jié)型字符串,試編寫程序,比較它們是否完全相同,若相同則將字符完全相同,若相同則將字符Y Y送送ALAL,否則將字符,否則將字符N N送送ALAL。 設:兩個等長字節(jié)型字符串分別存放在首址為設:兩個等長字節(jié)型字符串分別存放在首址為STRING1STRING1和和STRING2STRING2的內存中,其長

19、度均為的內存中,其長度均為8 8,則程序段為:,則程序段為: LEA SI, STRING1LEA SI, STRING1 LEA DI, STRING2 LEA DI, STRING2 MOV CX, 8 MOV CX, 8 CLD CLD REPZ CMPSBREPZ CMPSB JZ YESJZ YES MOV AL, N MOV AL, N JMP DISP JMP DISP YES: MOV AL ,Y YES: MOV AL ,Y DISP: MOV DL, AL DISP: MOV DL, AL MOV AH ,02H MOV AH ,02H INT 21H INT 21H例例2

20、 2 編寫一匯編語言程序,把編寫一匯編語言程序,把2020個字節(jié)的數組分成正數組和負數個字節(jié)的數組分成正數組和負數組,并分別計算這兩個數組中數據的個數組,并分別計算這兩個數組中數據的個數。 DSEG SEGMENTDSEG SEGMENT ARRAY DB 9,-66,7,-89,25,32,36,11,29,-125 ARRAY DB 9,-66,7,-89,25,32,36,11,29,-125 DB 5,56,-45,-65,98,8,-33,68,75,-100 DB 5,56,-45,-65,98,8,-33,68,75,-100 PLUARR DB 20 DUP(?) PLUARR DB 20 DUP(?) MINARR DB 20 DUP(?) MINARR DB 20 DUP(?) DSEG ENDS DSEG ENDS CSEG SEGMENT CSEG SEGMENT ASSUME CS:CSEG ASSUME CS:CSEG,DS:DSEGDS:DSEG,ES:DSEGES:DSEG BEGIN: MOV AX, DSEG BEGIN: MOV AX, DSEG MOV DS, AX MOV DS, AX MOV ES, AX

溫馨提示

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

評論

0/150

提交評論