匯編語言編程編程練習_第1頁
匯編語言編程編程練習_第2頁
匯編語言編程編程練習_第3頁
匯編語言編程編程練習_第4頁
匯編語言編程編程練習_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、匯編語言編程編程練習一、實驗題1. 非數值運算編程 (a)實驗目的 通過非數值運算(如統(tǒng)計,分類,排序,代碼轉換等)編程,進一步掌握 8086/8088 匯 編語言程序設計方法和技巧 (b)實驗內容 ·統(tǒng)計 設有100H個數,編程統(tǒng)計正數、負數和零的個數。 實驗分析: 程序中數的總數很多,某些部分需要重復執(zhí)行,因此要用到循環(huán)結構。循環(huán)結構 每次測試循環(huán)條件,當滿足條件時,重復執(zhí)行這一段程序;否則循環(huán)結束,順序往下 執(zhí)行。 其次,要統(tǒng)計正數、負數、零的個數,可以依靠標志位SF進行判斷,SF=0,正 數;SF=1,負數;零則為總數減去正負數的個數。 該程序流程圖如下:修改:移動緩沖區(qū)指針

2、,循環(huán)次數減一執(zhí)行:從BUFF取數,進行算術運算,判斷符號標志位SF初始化:設置緩沖區(qū)BUFF指針BX,設定循環(huán)次數256,統(tǒng)計計數器DL清零 開始循環(huán)控制: CX=0NOYES 結束:將寄存器的統(tǒng)計結果存入MEM單元,將控制交操作系統(tǒng)程序如下所示: STACK SEGMENT STACKDW 128 DUP(?)STACK ENDS DATA SEGMENTBUFF DB 256 DUP(?)MEM1 DB ?MEM2 DB ?MEM3 DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MO

3、V CX,256 LEA BX, BUFF XOR DL,DL XOR DH,DH XOR SI,SI ;統(tǒng)計計數器清0 NEXT:MOV AL,BX;取數據到AL ADD AL,0 ;做運算,影響標志位SF JNS AA1 ;是正數,跳到AA1 INC DL ;是負數,統(tǒng)計加1 AA1: INC DH ;是正數,加1 INC BX ;移動指針 LOOP NEXT ;循環(huán)控制 MOV MEM1,DL MOV MEM2,DH MOV MEM3,SI ;保存統(tǒng)計結果 MOV AX,4C00H INT 21HCODE ENDS END START ·代碼轉換 編程將組合的BCD碼9649轉

4、換成二進制數,考慮采用(A*10)+B)*10)+C)*10+D 的算法。 實驗分析: 由學習已知,寫成十六進制的BCD碼和十進制碼是完全一樣的,比如,75D= (01110101)BCD,而(01110101)B=75H。BCD碼的運算也遵循十進制運算 規(guī)則,這一點可以方便計算機本身擅長的二進制運算結合BCD碼的調整指 令來完成。 本題中,由于9469H計算機會默認為二進制數。因而,我們首先要做的是將 9469h BCD 碼先轉換成十進制數,計算機將會以二進制形式存儲。最后再輔 助程序令其輸出在屏幕上。 實驗大抵流程如下: 開始 初始化:設定字節(jié)空間執(zhí)行:BCD碼轉化成十進制 二進制碼輸出

5、結束實驗代碼如下:DATAS SEGMENT buffer1 DW 9649h buffer2 DW ? ;分配兩個字節(jié)的空間 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX mov ax,buffer1 and ax,0f000h mov cl,12 shr ax,cl mov dx,ax ;至此,已將9649h(BCD)中的9(十進制)取出,并放入dx中 call change ;調用chang,將9乘以10 mov ax,dx mov bx,buffer1 and bx,0f0

6、0h mov cl,8 shr bx,cl add ax,bx mov dx,ax call change mov ax,dx mov bx,buffer1 and bx,00f0h mov cl,4 shr bx,cl add ax,bx mov dx,ax call change mov ax,dx mov bx,buffer1 and bx,000fhadd ax,bx ;至此,ax中的值已是9649(十進制),但電腦是將其以二進制的形式存 儲的,故應是25B1h,二進制就是0010010110110001 mov buffer2,ax ;因為后面會用到ah,為避免在其過程中丟失ax中的

7、數據,故將ax 中的數據放入buffer2中 mov cx,16 again:shl buffer2,1 ;將已經轉換成二進制的數逐個顯示出來 mov dl,0 adc dl,30h mov ah,2 int 21h loop again mov ah,4CH INT 21H change proc ;子程序change的功能是實現dx乘以10 add dx,dx mov cx,dx add dx,dx add dx,dx add dx,cx ret change ENDPCODES ENDS END START ·排序 將80H個無符號的八位二進制數按遞增方式排列。同時考慮它們有符

8、號數、遞減等 方式。 實驗分析: 實驗要求將數排序,則用CMP比較兩個數大小,用標志位JNG(有符號位不 大于),JGE(有符號位不小于),JAE(無符號位不低于)來判定排序種類。 準備將該題用“冒泡排序法”,將其兩兩比較。前一個數較大(遞減),則不會 改變原來位置;否則,兩數交換,依次將全部數據排序依次(小循環(huán))。示例 如下: 13 -39 96 84 -75 58 13 96 84 -39 58 -75 96 84 13 58 -39 -75 96 84 58 13 -39 -75 不過,由于數據的原始情況不知,按以上方法排序一次不一定符合要求。本題 采取多次小循環(huán)方法,用數據個數控制循環(huán)

9、次數。這種方法效率低,不過在循環(huán)次 數較少的情況下還是很簡單的,畢竟原理很簡單。 該程序流程圖如下: 執(zhí)行:采用變址尋址,將前數與后數比較前數>后數 前后數交換位置 將結果寫入緩沖區(qū)CX>數據總數 初始化:初始化數據段,設定循環(huán)次數 開始NO 地址加一YESNOYES 進入下一循環(huán) 結束 進入小循環(huán)直到數按照從大到小的順序排列好為止。 附程序如下:1)、無符號位從小到大: STACK SEGMENT STACKDW 64 DUP(?)STACK ENDS DATA SEGMENTBUFF DB 128 DUP(?)COUNT EQU $-BUFF ;等值命令DATA ENDSCOD

10、E SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV CX,COUNT-1LOOP1:MOV DX,CX ;保存循環(huán)次數 MOV SI,0 ;采用變址尋址LOOP2:MOV AL,BUFFSI CMP AL,BUFFSI+1;前數與后數比 JNA COT ;前個數小于(或等于),轉(無符號) XCHG AL,BUFFSI+1;否則交換內存位置 MOV BUFFSI,AL COT: INC SI LOOP LOOP2 ;所有數據排列一次 MOV CX,DX ;開始下一次排序 LOOP LOOP1 MOV AX,4C00H

11、INT 21HCODE ENDS END START2)、無符號位從大到小STACK SEGMENT STACKDW 64 DUP(?)STACK ENDS DATA SEGMENTBUFF DB 128 DUP(?)COUNT EQU $-BUFF ;等值命令DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV CX,COUNT-1LOOP1:MOV DX,CX MOV SI,0LOOP2:MOV AL,BUFFSI CMP AL,BUFFSI+1 JNG COT ;前個數小于(或等于),轉(有

12、符號) XCHG AL,BUFFSI+1 MOV BUFFSI,ALCOT: INC SI LOOP LOOP2 MOV CX,DX LOOP LOOP1 MOV AX,4C00H INT 21HCODE ENDS END START3)、有符號位遞減STACK SEGMENT STACKDW 64 DUP(?)STACK ENDS DATA SEGMENTBUFF DB 128 DUP(?)COUNT EQU $-BUFF ;等值命令DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV CX,C

13、OUNT-1LOOP1:MOV DX,CX MOV SI,0LOOP2:MOV AL,BUFFSI CMP AL,BUFFSI+1 JGE COT ;前個數大于(或等于),轉(有符號) XCHG AL,BUFFSI+1 MOV BUFFSI,ALCOT: INC SI LOOP LOOP2 MOV CX,DX LOOP LOOP1 MOV AX,4C00H INT 21HCODE ENDS END START2、數值運算編程(a)實驗目的 通過編程及程序調式,熟悉 8086/8088 運算指令及 DEBUG 動態(tài)調試程序的方法(b)實驗內容 ·無符號二進制數運算 已知有 20 個 8

14、 位的無符號二進制數,編一個程序完成對這些數的求和。 實驗分析: 求20個無符號的八位二進制數,直接進行二進制運算要將數值轉換成二進制 形式比較繁瑣。由此想到寫成十六進制的BCD碼和十進制碼是完全一樣的, 比如,75D= (01110101)BCD,而(01110101)B=75H。BCD碼的運算也遵 循十進制運算規(guī)則,這一點可以方便計算機本身擅長的二進制運算結合BCD 碼的調整指令來完成。 將輸入的20個無符號八位二進制數看成BCD碼的十六進制表示,直接進行 BCD加法運算。最終將結果轉換成以ASCII碼形式輸出,即為所得數的十六 進制BCD碼形式。 流程圖略。 實驗代碼如下(參考):STA

15、CK SEGMENT STACK 'STACK' ; STACK SEGMENTDW 128 DUP(?) ; 128 WORDSSTACK ENDS ; SEGMENT ENDDATA SEGMENT PARA 'DATA' ; DATA SEGMENTTABLE DB 01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20TOTAL DW ? ;BCD 加法運算結果PRINT DB ? ;顯示的 ASCII 字符DATA ENDS ; SEGMENT ENDCODE SEGMENT PARA &

16、#39;CODE'ASSUME CS:CODE, DS:DATA, SS:STACKMAIN PROC FAR PUSH DS SUB AX,AX PUSH AX ;DS:0000為返回地址 MOV AX,DATA MOV DS,AX ;DS初始化 MOV AX,0 LEA BX,TABLE ;DS:BX指向TABLE的首地址 MOV CX,20 ;循環(huán)20次SUM: ADD AL,BX JNC OVER INC AH CLCOVER: INC BX LOOP SUM MOV TOTAL,AX MOV CX,0010 LEA SI,PRINT+3L20: CMP AX,CX ;值<

17、;10? JB L30 ;是,退出 XOR DX,DX ;清除高位商 DIV CX ;除以 10 OR DL,30H MOV SI,DL ;存 ASCII 字符 DEC SI JMP L20L30: OR AL,30H ;存最后的商 MOV SI,AL ;作為 ASCII 字符 MOV AH,02H ;打印算術結果 ; MOV CX,4 LEA DI,PRINTL10: MOV DL,DI INT 21H INC DI LOOP L10 MOV AX,4C00H INT 21HMAIN ENDPCODE ENDSEND MAIN ·BCD算術運算 已知兩個 6 位的 BCD 碼,完成

18、減法運算,設被減數為 123456,減數為 789123 實驗分析: 本題中先做減法,再采用未組合的BCD碼減法調整,從低位開始逐位做減法運算。 將計算結果低位存入AL,高位存于AH??傮w來說,該題原理較為簡單。實驗代碼如下(參考): STACK SEGMENT STACKDW 128 DUP(?)STACK ENDSDATA SEGMENT PARA'DATA'NUMBER1 DB '789123'NUMBER2 DB '123456'SF DB '-' ;需打印的符號RESULT DB ? ;存算術結果DATA ENDSCODE SEGMENT PARA'CODE'ASSUME CS:CODE,DS:DATA,SS:STACKMAIN PROC FAR PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA

溫馨提示

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

評論

0/150

提交評論