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

下載本文檔

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

文檔簡(jiǎn)介

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

2、,循環(huán)次數(shù)減一執(zhí)行:從BUFF取數(shù),進(jìn)行算術(shù)運(yùn)算,判斷符號(hào)標(biāo)志位SF初始化:設(shè)置緩沖區(qū)BUFF指針BX,設(shè)定循環(huán)次數(shù)256,統(tǒng)計(jì)計(jì)數(shù)器DL清零 開(kāi)始循環(huán)控制: CX=0NOYES 結(jié)束:將寄存器的統(tǒng)計(jì)結(jié)果存入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)計(jì)計(jì)數(shù)器清0 NEXT:MOV AL,BX;取數(shù)據(jù)到AL ADD AL,0 ;做運(yùn)算,影響標(biāo)志位SF JNS AA1 ;是正數(shù),跳到AA1 INC DL ;是負(fù)數(shù),統(tǒng)計(jì)加1 AA1: INC DH ;是正數(shù),加1 INC BX ;移動(dòng)指針 LOOP NEXT ;循環(huán)控制 MOV MEM1,DL MOV MEM2,DH MOV MEM3,SI ;保存統(tǒng)計(jì)結(jié)果 MOV AX,4C00H INT 21HCODE ENDS END START ·代碼轉(zhuǎn)換 編程將組合的BCD碼9649轉(zhuǎn)

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

5、結(jié)束實(shí)驗(yàn)代碼如下:DATAS SEGMENT buffer1 DW 9649h buffer2 DW ? ;分配兩個(gè)字節(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(十進(jìn)制)取出,并放入dx中 call change ;調(diào)用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,000fhmov buffer2,ax ;因?yàn)楹竺鏁?huì)用到ah,為避免在其過(guò)程中丟失ax中的數(shù)據(jù),故將ax 中的數(shù)據(jù)放入buffer2中 mov cx,16 again:shl buffer2,1 ;將已經(jīng)轉(zhuǎn)換成二進(jìn)制的數(shù)逐個(gè)顯示出來(lái) mov dl,0

7、 adc dl,30h mov ah,2 int 21h loop again mov ah,4CH INT 21H change proc ;子程序change的功能是實(shí)現(xiàn)dx乘以10 add dx,dx mov cx,dx add dx,dx add dx,dx add dx,cx ret change ENDPCODES ENDS END START ·排序 將80H個(gè)無(wú)符號(hào)的八位二進(jìn)制數(shù)按遞增方式排列。同時(shí)考慮它們有符號(hào)數(shù)、遞減等 方式。 實(shí)驗(yàn)分析: 實(shí)驗(yàn)要求將數(shù)排序,則用CMP比較兩個(gè)數(shù)大小,用標(biāo)志位JNG(有符號(hào)位不 大于),JGE(有符號(hào)位不小于),JAE(無(wú)符號(hào)位不低

8、于)來(lái)判定排序種類。 準(zhǔn)備將該題用“冒泡排序法”,將其兩兩比較。前一個(gè)數(shù)較大(遞減),則不會(huì) 改變?cè)瓉?lái)位置;否則,兩數(shù)交換,依次將全部數(shù)據(jù)排序依次(小循環(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 不過(guò),由于數(shù)據(jù)的原始情況不知,按以上方法排序一次不一定符合要求。本題 采取多次小循環(huán)方法,用數(shù)據(jù)個(gè)數(shù)控制循環(huán)次數(shù)。這種方法效率低,不過(guò)在循環(huán)次 數(shù)較少的情況下還是很簡(jiǎn)單的,畢竟原理很簡(jiǎn)單。 該程序流程圖如下: 執(zhí)行:采用變址尋址,將前數(shù)與后數(shù)比較前數(shù)>后數(shù) 前后

9、數(shù)交換位置 將結(jié)果寫(xiě)入緩沖區(qū)CX>數(shù)據(jù)總數(shù) 初始化:初始化數(shù)據(jù)段,設(shè)定循環(huán)次數(shù) 開(kāi)始NO 地址加一YESNOYES 進(jìn)入下一循環(huán) 結(jié)束 進(jìn)入小循環(huán)直到數(shù)按照從大到小的順序排列好為止。 附程序如下:1)、無(wú)符號(hào)位從小到大: 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:

10、MOV DX,CX ;保存循環(huán)次數(shù) MOV SI,0 ;采用變址尋址LOOP2:MOV AL,BUFFSI CMP AL,BUFFSI+1;前數(shù)與后數(shù)比 JNA COT ;前個(gè)數(shù)小于(或等于),轉(zhuǎn)(無(wú)符號(hào)) XCHG AL,BUFFSI+1;否則交換內(nèi)存位置 MOV BUFFSI,AL COT: INC SI LOOP LOOP2 ;所有數(shù)據(jù)排列一次 MOV CX,DX ;開(kāi)始下一次排序 LOOP LOOP1 MOV AX,4C00H INT 21HCODE ENDS END START2)、無(wú)符號(hào)位從大到小STACK SEGMENT STACKDW 64 DUP(?)STACK ENDS D

11、ATA 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 ;前個(gè)數(shù)小于(或等于),轉(zhuǎn)(有符號(hào)) XCHG AL,BUFFSI+1 MOV BUFFSI,ALCOT: INC SI LOOP LOOP2 MOV CX,DX LOOP LOOP1 MO

12、V AX,4C00H INT 21HCODE ENDS END START3)、有符號(hào)位遞減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 JGE COT ;前個(gè)數(shù)大于

13、(或等于),轉(zhuǎn)(有符號(hào)) XCHG AL,BUFFSI+1 MOV BUFFSI,ALCOT: INC SI LOOP LOOP2 MOV CX,DX LOOP LOOP1 MOV AX,4C00H INT 21HCODE ENDS END START2、數(shù)值運(yùn)算編程(a)實(shí)驗(yàn)?zāi)康?通過(guò)編程及程序調(diào)式,熟悉 8086/8088 運(yùn)算指令及 DEBUG 動(dòng)態(tài)調(diào)試程序的方法(b)實(shí)驗(yàn)內(nèi)容 ·無(wú)符號(hào)二進(jìn)制數(shù)運(yùn)算 已知有 20 個(gè) 8 位的無(wú)符號(hào)二進(jìn)制數(shù),編一個(gè)程序完成對(duì)這些數(shù)的求和。 實(shí)驗(yàn)分析: 求20個(gè)無(wú)符號(hào)的八位二進(jìn)制數(shù),直接進(jìn)行二進(jìn)制運(yùn)算要將數(shù)值轉(zhuǎn)換成二進(jìn)制 形式比較繁瑣。由此想到寫(xiě)

14、成十六進(jìn)制的BCD碼和十進(jìn)制碼是完全一樣的, 比如,75D= (01110101)BCD,而(01110101)B=75H。BCD碼的運(yùn)算也遵 循十進(jìn)制運(yùn)算規(guī)則,這一點(diǎn)可以方便計(jì)算機(jī)本身擅長(zhǎng)的二進(jìn)制運(yùn)算結(jié)合BCD 碼的調(diào)整指令來(lái)完成。 將輸入的20個(gè)無(wú)符號(hào)八位二進(jìn)制數(shù)看成BCD碼的十六進(jìn)制表示,直接進(jìn)行 BCD加法運(yùn)算。最終將結(jié)果轉(zhuǎn)換成以ASCII碼形式輸出,即為所得數(shù)的十六 進(jìn)制BCD碼形式。 流程圖略。 實(shí)驗(yàn)代碼如下(參考):STACK SEGMENT STACK 'STACK' ; STACK SEGMENTDW 128 DUP(?) ; 128 WORDSSTACK E

15、NDS ; 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 加法運(yùn)算結(jié)果PRINT DB ? ;顯示的 ASCII 字符DATA ENDS ; SEGMENT ENDCODE SEGMENT PARA 'CODE'ASSUME CS:CODE, DS:DATA, SS:STACKMAIN PROC FAR PUSH DS SUB AX,AX PU

16、SH 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 ;值<10? JB L30 ;是,退出 XOR DX,DX ;清除高位商 DIV CX ;除以 10 OR DL,30H MOV SI,DL ;存 ASCII 字符

17、 DEC SI JMP L20L30: OR AL,30H ;存最后的商 MOV SI,AL ;作為 ASCII 字符 MOV AH,02H ;打印算術(shù)結(jié)果 ; MOV CX,4 LEA DI,PRINTL10: MOV DL,DI INT 21H INC DI LOOP L10 MOV AX,4C00H INT 21HMAIN ENDPCODE ENDSEND MAIN ·BCD算術(shù)運(yùn)算 已知兩個(gè) 6 位的 BCD 碼,完成減法運(yùn)算,設(shè)被減數(shù)為 123456,減數(shù)為 789123 實(shí)驗(yàn)分析: 本題中先做減法,再采用未組合的BCD碼減法調(diào)整,從低位開(kāi)始逐位做減法運(yùn)算。 將計(jì)算結(jié)果低位

18、存入AL,高位存于AH。總體來(lái)說(shuō),該題原理較為簡(jiǎn)單。實(shí)驗(yàn)代碼如下(參考): STACK SEGMENT STACKDW 128 DUP(?)STACK ENDSDATA SEGMENT PARA'DATA'NUMBER1 DB '789123'NUMBER2 DB '123456'SF DB '-' ;需打印的符號(hào)RESULT DB ? ;存算術(shù)結(jié)果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 SI,NUMB

溫馨提示

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

評(píng)論

0/150

提交評(píng)論