版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、匯編語言編程編程練習一、實驗題1. 非數(shù)值運算編程 (a)實驗?zāi)康?通過非數(shù)值運算(如統(tǒng)計,分類,排序,代碼轉(zhuǎn)換等)編程,進一步掌握 8086/8088 匯 編語言程序設(shè)計方法和技巧 (b)實驗內(nèi)容 統(tǒng)計 設(shè)有100H個數(shù),編程統(tǒng)計正數(shù)、負數(shù)和零的個數(shù)。 實驗分析: 程序中數(shù)的總數(shù)很多,某些部分需要重復執(zhí)行,因此要用到循環(huán)結(jié)構(gòu)。循環(huán)結(jié)構(gòu) 每次測試循環(huán)條件,當滿足條件時,重復執(zhí)行這一段程序;否則循環(huán)結(jié)束,順序往下 執(zhí)行。 其次,要統(tǒng)計正數(shù)、負數(shù)、零的個數(shù),可以依靠標志位SF進行判斷,SF=0,正 數(shù);SF=1,負數(shù);零則為總數(shù)減去正負數(shù)的個數(shù)。 該程序流程圖如下:修改:移動緩沖區(qū)指針,循環(huán)次數(shù)減
2、一執(zhí)行:從BUFF取數(shù),進行算術(shù)運算,判斷符號標志位SF初始化:設(shè)置緩沖區(qū)BUFF指針BX,設(shè)定循環(huán)次數(shù)256,統(tǒng)計計數(shù)器DL清零 開始循環(huán)控制: CX=0NOYES 結(jié)束:將寄存器的統(tǒng)計結(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 MOV CX,2
3、56 LEA BX, BUFF XOR DL,DL XOR DH,DH XOR SI,SI ;統(tǒng)計計數(shù)器清0 NEXT:MOV AL,BX;取數(shù)據(jù)到AL ADD AL,0 ;做運算,影響標志位SF JNS AA1 ;是正數(shù),跳到AA1 INC DL ;是負數(shù),統(tǒng)計加1 AA1: INC DH ;是正數(shù),加1 INC BX ;移動指針 LOOP NEXT ;循環(huán)控制 MOV MEM1,DL MOV MEM2,DH MOV MEM3,SI ;保存統(tǒng)計結(jié)果 MOV AX,4C00H INT 21HCODE ENDS END START 代碼轉(zhuǎn)換 編程將組合的BCD碼9649轉(zhuǎn)換成二進制數(shù),考慮采用(
4、A*10)+B)*10)+C)*10+D 的算法。 實驗分析: 由學習已知,寫成十六進制的BCD碼和十進制碼是完全一樣的,比如,75D= (01110101)BCD,而(01110101)B=75H。BCD碼的運算也遵循十進制運算 規(guī)則,這一點可以方便計算機本身擅長的二進制運算結(jié)合BCD碼的調(diào)整指 令來完成。 本題中,由于9469H計算機會默認為二進制數(shù)。因而,我們首先要做的是將 9469h BCD 碼先轉(zhuǎn)換成十進制數(shù),計算機將會以二進制形式存儲。最后再輔 助程序令其輸出在屏幕上。 實驗大抵流程如下: 開始 初始化:設(shè)定字節(jié)空間執(zhí)行:BCD碼轉(zhuǎn)化成十進制 二進制碼輸出 結(jié)束實驗代碼如下:DAT
5、AS 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 ;調(diào)用chang,將9乘以10 mov ax,dx mov bx,buffer1 and bx,0f00h mov cl,8
6、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(十進制),但電腦是將其以二進制的形式存 儲的,故應(yīng)是25B1h,二進制就是0010010110110001 mov buffer2,ax ;因為后面會用到ah,為避免在其過程中丟失ax中的數(shù)據(jù),故將ax 中的數(shù)據(jù)
7、放入buffer2中 mov cx,16 again:shl buffer2,1 ;將已經(jīng)轉(zhuǎn)換成二進制的數(shù)逐個顯示出來 mov dl,0 adc dl,30h mov ah,2 int 21h loop again mov ah,4CH INT 21H change proc ;子程序change的功能是實現(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個無符號的八位二進制數(shù)按遞增方式排列。同時考慮它們有符號數(shù)、遞減等 方式。 實驗分析: 實
8、驗要求將數(shù)排序,則用CMP比較兩個數(shù)大小,用標志位JNG(有符號位不 大于),JGE(有符號位不小于),JAE(無符號位不低于)來判定排序種類。 準備將該題用“冒泡排序法”,將其兩兩比較。前一個數(shù)較大(遞減),則不會 改變原來位置;否則,兩數(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 不過,由于數(shù)據(jù)的原始情況不知,按以上方法排序一次不一定符合要求。本題 采取多次小循環(huán)方法,用數(shù)據(jù)個數(shù)控制循環(huán)次數(shù)。這種方法效率低,不過在循環(huán)次
9、數(shù)較少的情況下還是很簡單的,畢竟原理很簡單。 該程序流程圖如下: 執(zhí)行:采用變址尋址,將前數(shù)與后數(shù)比較前數(shù)后數(shù) 前后數(shù)交換位置 將結(jié)果寫入緩沖區(qū)CX數(shù)據(jù)總數(shù) 初始化:初始化數(shù)據(jù)段,設(shè)定循環(huán)次數(shù) 開始NO 地址加一YESNOYES 進入下一循環(huán) 結(jié)束 進入小循環(huán)直到數(shù)按照從大到小的順序排列好為止。 附程序如下:1)、無符號位從小到大: STACK SEGMENT STACKDW 64 DUP(?)STACK ENDS DATA SEGMENTBUFF DB 128 DUP(?)COUNT EQU $-BUFF ;等值命令DATA ENDSCODE SEGMENT ASSUME CS:CODE,D
10、S:DATASTART:MOV AX,DATA MOV DS,AX MOV CX,COUNT-1LOOP1:MOV DX,CX ;保存循環(huán)次數(shù) MOV SI,0 ;采用變址尋址LOOP2:MOV AL,BUFFSI CMP AL,BUFFSI+1;前數(shù)與后數(shù)比 JNA COT ;前個數(shù)小于(或等于),轉(zhuǎn)(無符號) XCHG AL,BUFFSI+1;否則交換內(nèi)存位置 MOV BUFFSI,AL COT: INC SI LOOP LOOP2 ;所有數(shù)據(jù)排列一次 MOV CX,DX ;開始下一次排序 LOOP LOOP1 MOV AX,4C00H INT 21HCODE ENDS END START
11、2)、無符號位從大到小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 ;前個數(shù)小于(或等于),轉(zhuǎn)(有符號) XCHG AL,BUFFSI+1 MOV B
12、UFFSI,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,COUNT-1LOOP1:MOV DX,CX MOV
13、SI,0LOOP2:MOV AL,BUFFSI CMP AL,BUFFSI+1 JGE COT ;前個數(shù)大于(或等于),轉(zhuǎn)(有符號) 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ù)值運算編程(a)實驗?zāi)康?通過編程及程序調(diào)式,熟悉 8086/8088 運算指令及 DEBUG 動態(tài)調(diào)試程序的方法(b)實驗內(nèi)容 無符號二進制數(shù)運算 已知有 20 個 8 位的無符號二進制數(shù),編一個程序完成對這些數(shù)的求和。 實驗分析:
14、 求20個無符號的八位二進制數(shù),直接進行二進制運算要將數(shù)值轉(zhuǎn)換成二進制 形式比較繁瑣。由此想到寫成十六進制的BCD碼和十進制碼是完全一樣的, 比如,75D= (01110101)BCD,而(01110101)B=75H。BCD碼的運算也遵 循十進制運算規(guī)則,這一點可以方便計算機本身擅長的二進制運算結(jié)合BCD 碼的調(diào)整指令來完成。 將輸入的20個無符號八位二進制數(shù)看成BCD碼的十六進制表示,直接進行 BCD加法運算。最終將結(jié)果轉(zhuǎn)換成以ASCII碼形式輸出,即為所得數(shù)的十六 進制BCD碼形式。 流程圖略。 實驗代碼如下(參考):STACK SEGMENT STACK STACK ; STACK S
15、EGMENTDW 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 加法運算結(jié)果PRINT DB ? ;顯示的 ASCII 字符DATA ENDS ; SEGMENT ENDCODE SEGMENT PARA CODEASSUME CS:CODE, DS:DATA, SS:STACKMAIN PROC FAR PU
16、SH 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 ;值10? JB L30 ;是,退出 XOR DX,DX ;清除高位商 DIV CX ;除以 10 OR DL,30H MOV SI,
17、DL ;存 ASCII 字符 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ù)運算 已知兩個 6 位的 BCD 碼,完成減法運算,設(shè)被減數(shù)為 123456,減數(shù)為 789123 實驗分析: 本題中先做減法,再采用未組合的BCD碼減法調(diào)整,從低位開始逐位做減法運算。
18、 將計算結(jié)果低位存入AL,高位存于AH??傮w來說,該題原理較為簡單。實驗代碼如下(參考): STACK SEGMENT STACKDW 128 DUP(?)STACK ENDSDATA SEGMENT PARADATANUMBER1 DB 789123NUMBER2 DB 123456SF DB - ;需打印的符號RESULT DB ? ;存算術(shù)結(jié)果DATA ENDSCODE SEGMENT PARACODEASSUME CS:CODE,DS:DATA,SS:STACKMAIN PROC FAR PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA SI,NUMBER1+
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高速硅光子通信-洞察及研究
- 基于大數(shù)據(jù)分析的面向?qū)ο筌浖踩匝芯?洞察及研究
- 凍干狂犬病疫苗的質(zhì)量控制與長期穩(wěn)定性評估-洞察及研究
- 非線性平衡動力學-洞察及研究
- 2026年空管業(yè)務(wù)考試題庫及答案解析
- 小波變換應(yīng)用
- 蛋白質(zhì)結(jié)構(gòu)與功能解析-洞察及研究
- 2025江蘇南京大學集成電路學院助理招聘備考題庫及答案詳解一套
- 未來五年在線親子旅游企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略分析研究報告
- 未來五年勞務(wù)派遣服務(wù)企業(yè)縣域市場拓展與下沉戰(zhàn)略分析研究報告
- 石子廠規(guī)范管理制度
- 大數(shù)據(jù)驅(qū)動下的塵肺病發(fā)病趨勢預測模型
- 成都2025年四川成都市新津區(qū)招聘衛(wèi)生專業(yè)技術(shù)人才21人筆試歷年參考題庫附帶答案詳解
- 2026屆廣東省高考英語聽說考試備考技巧講義
- 炎德英才大聯(lián)考雅禮中學2026屆高三月考試卷英語(五)(含答案)
- 2026年經(jīng)營人員安全生產(chǎn)責任制范文
- 2026年及未來5年中國鍛造件行業(yè)市場深度分析及發(fā)展前景預測報告
- 2026年及未來5年市場數(shù)據(jù)中國大型鑄鍛件行業(yè)市場深度分析及投資戰(zhàn)略數(shù)據(jù)分析研究報告
- 林草濕地生態(tài)調(diào)查監(jiān)測技術(shù)探索
- 兒科2025年終工作總結(jié)及2026年工作計劃匯報
- 2025赤峰市敖漢旗就業(yè)服務(wù)中心招聘第一批公益性崗位人員112人(公共基礎(chǔ)知識)測試題附答案解析
評論
0/150
提交評論