微處理器第三次實驗_第1頁
微處理器第三次實驗_第2頁
微處理器第三次實驗_第3頁
微處理器第三次實驗_第4頁
微處理器第三次實驗_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 第三次實驗1、 從鍵盤上輸入一個十六進制數(shù),將其轉(zhuǎn)換成一個十進制數(shù)顯示。準備工作:此試驗的難度之一在于如何將輸入的十六進制數(shù)AF的ASCII代碼轉(zhuǎn)換成十進制數(shù)的ASCII代碼。我原本一直是這樣想的,于是進入了死胡同。于是換個思路,把A到F的ASCII代碼進行某種運算,使他等于要輸出的十進制數(shù),然后分別輸出個位和十位。 流程圖如下:程序:DATA SEGMENT DATA1 DB 0;定義一個數(shù)據(jù)段存放AL的低位 DATA2 DB 0;存放AL的高位DATA ENDSSTACK SEGMENT DB 5 DUP(?);定義一個棧段暫時存放ALSTACK ENDSCODE SEGMENTASSU

2、ME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX;把數(shù)據(jù)段的首地址即段地址給DS mov ax,stack mov ss,ax;把棧段的段地址給SS Mov cl,4;設(shè)置偏移量input: mov ah,01 int 21h;等待輸入 push ax;把AX的值暫時存放在棧段里 cmp al,'0';和零的ASCII代碼比較 jb input;小于則重新輸入 cmp al,'9';和九的ASCII代碼比較 jbe output;不大于則跳轉(zhuǎn)到output cmp al,'A';和A的

3、ASCII代碼比較 jb input;小于則重新輸入 cmp al,'F';和F的ASCII代碼比較 jbe change;不大于則跳轉(zhuǎn)到change cmp al,'a'和a的ASCII代碼比較 jb input;小于重新輸入 cmp al,'f';和f的ASCII代碼比較 jbe exchange;不大于則跳轉(zhuǎn)到exchange jmp input;否則重新輸入output: mov dl,al mov ah,2h int 21h jmp input;AL的值為數(shù)字,則原樣輸出change: or al,00100000B;AL和001000

4、00邏輯或,轉(zhuǎn)換成大寫字母 jmp exchange;跳轉(zhuǎn)到exchangeexchange: sub al,51h;AL減51H and al,00001111b;把AL與00001111邏輯與,高位置零 Add al,30h;把低位轉(zhuǎn)換成十進制對應(yīng)的ASCII代碼 mov data2,al;把低位存入DS:DATA2 pop ax;取出原AX sub al,51h Shr al,cl;右移4位 Add al,30h; mov data1,al;把高位保存在DS:DATA1中output2: mov dl,data2; mov ah,2h int 21h;輸出高位 mov dl,data1

5、mov ah 2h int 21h:輸出低位 code ends start endQuestion1 原因分析:push和pop不能和8位寄存器使用Question2分析:指令格式錯誤,正確的應(yīng)該是,前面還要填上mov cl,4 ,shl al,clQuestion2分析:少了冒號錯誤全部修改好了,運行結(jié)果是這樣的 不是預(yù)期的效果.看了一下程序,把output里的mov dl,ss:0改成mov dl,al,可以正確輸出數(shù)字了,但是字母不是這個原因,下面調(diào)試調(diào)試看看:輸入e目前一切正常然后快速進行到輸出ds:data1輸出小圖案的ascii代碼是5,錯把應(yīng)該輸出的十進制數(shù)保存在內(nèi)存里,應(yīng)該加

6、上30H轉(zhuǎn)換成ASCII代碼。修改過后2、 判斷閏年的程序程序data segmentinfon db 0dh,0ah,'Please input a year: $'Y db 0dh,0ah,'This is a leap year! $'N db 0dh,0ah,'This is not a leap year! $'w dw 0buf db 8 db ? db 8 dup(?) data endsstack segment stackdb 200 dup(0)stack endscode segmentassume ds:data,ss:s

7、tack,cs:codestart:mov ax,datamov ds,ax lea dx,infonmov ah,9int 21hlea dx,bufmov ah,0Ahint 21hxor ch,chmov cl, buf+1call datacatecall ifyearsjc a1lea dx,nmov ah,9int 21hjmp exita1: lea dx,ymov ah,9int 21hexit: mov ah,4chint 21hdatacate proc nearpush cx dec cxlea si,buf+2tt1: inc siloop tt1pop cxmov a

8、x,1l1: push ax mov dh,30hmov bx,10mov dl,sisub dl,dh xor dh,dhmul dx add w,axpop axmul bxdec siloop l1retdatacate endpifyears proc near push bxpush cxpush dx mov ax,w mov dx,0 mov bx,100div bxcmp dx,0 je nextxor dx,dxmov ax,wmov bx,4 div bxcmp dx,0je lab2jmp lab1 next: xor dx,dxmov ax,w mov bx,400di

9、v bx cmp dx,0 je lab2jmp lab1lab1: clc jmp lab3lab2: stclab3: pop dx pop cxpop bxretifyears endpcode endsend start流程圖3. (1)兩個一位數(shù)變量的加法 DATA SEGMENTDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AH,1 INT 21H;輸入一個變量 SUB AL,30H MOV BL,AL;把變量轉(zhuǎn)換成十進制數(shù)存在BL里 MOV AH,2 MOV DL,2BH IN

10、T 21H;輸出加號 MOV AH,1 INT 21H;輸入另一個變量 SUB AL,30H ADD AL,BL;兩變量的十進制形式相加 AAM ;加法調(diào)整,兩個數(shù)不用轉(zhuǎn)換成二進制,直接進行加法運算,高位 PUSH AX;保存在AH,低位保存在AL中 POP BX MOV AH,2 MOV DL,3DH;輸出等號 INT 21H MOV AH,2 MOV DL,BH ADD DL,30H;輸出高位 INT 21H MOV AH,2 MOV DL,BL ADD DL,30H INT 21H MOV AH,4CH INT 21H CODE ENDS END START運行結(jié)果: 新學(xué)的指令A(yù)AM是

11、此題的關(guān)鍵!,它能把二進制修正成十進制顯示。AAM也有局限性,AL中的數(shù)值必須小于等于99,否則出錯。AAM.AAA,AAS用于非壓縮BCD碼,DAA,DAS用于壓縮BCD碼。(2) 兩位數(shù)的變量加法流程圖此實驗耗費時間較長,且結(jié)果是這樣的加法不等于真實結(jié)果?只好調(diào)試:源程序是定義的w1和w2都是一個字節(jié)的數(shù)據(jù)段,導(dǎo)致把加數(shù)和被加數(shù)存在里面時,產(chǎn)生了覆蓋調(diào)整定義的w1和w2的字節(jié)為2,繼續(xù)運行,結(jié)果還是不對.然后繼續(xù)調(diào)試,發(fā)現(xiàn)置STC用錯了,我的本意是讓個位相加如果產(chǎn)生進位就置一,但是結(jié)果是不論有么有進位都置一了,還有個位十位輸出順序反了.比如我先后輸入12和34 結(jié)果是46,但是顯示的是74

12、.對STC的用法不熟,不知道在滿足條件的時候置一。而我恰恰不知道如何在滿足條件的條件下置CF為一,百度了一下,沒有.然后就這老師給的匯編指令大全,挨個看了一下,發(fā)現(xiàn)CMP a,b,如果a>=b,則cf等于零,那么我想a<B,那么cf是不是就置一了,一運行,果然可以!下面是我的程序:(在老師閏年的基礎(chǔ)上大改動,應(yīng)用了一位數(shù)變量的加法)data segmentinfon db 0dh,0ah,'Please input a number: $'w1 db 2 dup(0);存放加數(shù)w2 db 2 dup(0);存放另一個加數(shù)w db 00;存放和buf db 8 db

13、? db 8 dup(?) data endsstack segment stackdb 200 dup(0)stack endscode segmentassume ds:data,ss:stack,cs:codestart:mov ax,datamov ds,ax lea dx,infonmov ah,9int 21hcall input;調(diào)用輸入子程序,輸入加數(shù)call datacate;調(diào)用子程序,把加數(shù)以十進制形式存在w1里mov dl,10mov ah,02int 21h;輸出轉(zhuǎn)行call input;調(diào)用輸入子程序,輸入另一個加數(shù)mov dl,10mov ah,02int 21h

14、;輸出轉(zhuǎn)行call datacate1;調(diào)用子程序call add1;調(diào)用相加子程序exit: mov ah,4chint 21h;退出input proc near lea dx,buf mov ah,0Ah int 21h xor ch,ch mov cl, buf+1 retinput endp;輸入加數(shù),和閏年實驗一樣datacate proc near dec cx lea si,buf+2 tt1: inc si loop tt1 mov cx,2;和閏年實驗一樣l1: mov dh,30h;備用,把加數(shù)的ASCII代碼減去它 mov al,si;把加數(shù)個位存到此 mov bl,a

15、l; sub bl,dh dec si;自減 mov al,si;把加數(shù)十位存到此 mov bh,al sub bh,dh mov w1,bh; mov w1+1,bl;把bx即加數(shù)存到w1中 retdatacate endp;和上一個子程序類似,不過是另一個加數(shù)datacate1 proc near dec cx lea si,buf+2 tt1: inc si loop tt1 mov cx,2l1: mov dh,30h mov al,si mov bl,al sub bl,dh dec si mov al,si mov bh,al sub bh,dh mov w2,bh mov w2+

16、1,bl retdatacate1 endpadd1 proc nearxor ah,ah mov al,w1+1;把加數(shù)個位給al mov bl,w2+1;把另一個加數(shù)個位給bl add al,bl;al,bl相加 Aam;加法調(diào)整 Clc;cf位清零 cmp ah,1;al位和1比較,等于1則CF等于1 mov w,al;把個位相加結(jié)果存放到w中 mov al,w1 mov bl,w2 adc al,bl;bl,al,cf相加,十位和進位相加 Aam;加法調(diào)整 mov bx,axadd bh,30hmov ah,02mov dl,bhint 21h;輸出百位mov ah,02add bl,

17、30hmov dl,blint 21h;輸出十位mov bl,byte ptr wmov ah,02add bl,30hmov dl,bl;輸出個位int 21hretadd1 endpcode endsend start;結(jié)束3、 十五位數(shù)相加對上一個程序稍加修改,要用到循環(huán)指令,流程圖暫時不畫。程序如下data segmentinfon db 0dh,0ah,'Please input a number: $'w1 db 45 dup(0);存加數(shù)、被加數(shù),和buf db 16 db ? db 16 dup(?) data endsstack segment stackdb

18、 200 dup(0)stack endscode segmentassume ds:data,ss:stack,cs:codestart:mov ax,datamov ds,ax lea dx,infonmov ah,9int 21hcall input;輸入加數(shù)call datacate;把加數(shù)以十進制形式存入的子程序mov dl,10mov ah,02int 21hcall input;輸入被加數(shù)mov dl,10mov ah,02int 21hcall datacate1;把被加數(shù)以十進制形式存入的子程序call add1;兩數(shù)求和的子程序exit: mov ah,4chint 21h

19、input proc near lea dx,buf mov ah,0Ah int 21h xor ch,ch mov cl, buf+1 retinput endpdatacate proc near dec cx lea si,buf+2 tt1: inc si loop tt1 mov cx,15 mov dh,30h xor di,dil1: mov bl,si sub bl,dh dec si mov w1+di,bl inc di loop l1 retdatacate endpdatacate1 proc near dec cx lea si,buf+2 tt1: inc si loop tt1 mov cx,15 mov dh,30h xor di,dil2: mov al,si mov bl,al sub bl,dh dec si mov w1+di+15,bl inc di loop l2 retdatacate1 endpadd1 proc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論