|
各種不同數(shù)制輸入/輸出的轉(zhuǎn)換 例12-1:數(shù)字0~9對(duì)應(yīng)的格雷碼為:18H,31H,05H,06H,09H,0AH,0CH,11H,12H,14H。編程將0~9數(shù)字轉(zhuǎn)換成格雷碼,并顯示輸出。 將0~9數(shù)字對(duì)應(yīng)的格雷碼作為轉(zhuǎn)換表,用轉(zhuǎn)換指令XLAT將AL中的在表中的相對(duì)偏移量轉(zhuǎn)換為轉(zhuǎn)換表中的格雷碼。格雷碼的輸出,因?yàn)楦窭状a為兩位十六進(jìn)制數(shù),需要用邏輯運(yùn)算指令或移位指令將兩位十六進(jìn)制數(shù)分離出來,在將其轉(zhuǎn)換為相應(yīng)的ASCII碼并顯示輸出(轉(zhuǎn)換也是使用了轉(zhuǎn)換指令XLAT)。 NAME LI12-1.ASM DATA SEGMENT TABLE1 DB 18H,34H,05H,06H,09H,0AH,0CH,11H,12H,14H TABLE2 DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H BUF DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA GO: MOV AX,DATA MOV DS:AX MOV DH,0H MOV CX,10 @1: MOV BX,OFFSET TABLE1 MOV AL,DH XLAT TABLE1 MOV BUF,AL MOV BX,OFFSET TABLE2 SHR AL,1 SHR AL,1 SHR AL,1 SHR AL,1 XLAT TABLE2 MOV DL,AL MOV AH,02H INT 21H MOV AL,BUF AND AL,0FH XLAT TABLE2 MOV DL,AL MOV AH,02H INT 21H MOV DL,'H' INT 21H MOV DL,' ' INT 21H INC DH LOOP @1 MOV AH,4CH INT 21H CODE ENDS END GO 例12-2:非壓縮型bcd碼的輸入(ASCII碼轉(zhuǎn)換成非壓縮BCD碼)。 假設(shè)從鍵盤上鍵入一個(gè)8位的十進(jìn)制數(shù),要求將他們以真正的非壓縮型BCD碼的形式存放在內(nèi)存輸入緩沖區(qū)。0~9數(shù)字的ASCII碼,只要將高4位清零,即為對(duì)應(yīng)的非壓縮BCD碼。假設(shè)從十進(jìn)制的高位開始輸入,轉(zhuǎn)換后從低地址字節(jié)開始依次存放。 NAME LI12-2.ASM DATA SEGMENT BUF DB 8DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DI,OFFSET BUF MOV AH,01H L01: INT 21H AND AL,0F MOV [DI],AL INC DI LOOP L01 MOV AH,4CH INT 21H CODE ENDS END START 例12-3:非壓縮型BCD碼的輸出(非壓縮型BCD碼轉(zhuǎn)換成ASCII碼)。 將內(nèi)存緩沖區(qū)中的6位十進(jìn)制數(shù)字(非壓縮型BCD碼)顯示在屏幕上,假設(shè)十進(jìn)制數(shù)字低位存放在低地址,輸出時(shí)應(yīng)從高位依次顯示。顯示輸出數(shù)字時(shí),將0~9數(shù)字轉(zhuǎn)換成ASCII碼,即用OR指令將其高4位拼上3。 NAME LI12-3.ASM DATA SEGMENT A DB 06H,08H,04H,00H,03H COUNT EQU $-OFFSET A DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,COUNT MOV SI,OFFSET A+5 MOV AH,02H L01: MOV DL,[SI] OR DL,30H INT 21H DEC SI LOOP L01 MOV AH,4CH INT 21H CODE ENDS END START 例12-3:壓縮型BCD碼的輸入 從鍵盤上鍵入一個(gè)十進(jìn)制數(shù)字(如32495),以壓縮型BCD碼的形式存放在內(nèi)存緩沖區(qū)里。設(shè)計(jì)思想:首先將鍵入的數(shù)字字符以ASCII碼的形式存入具有30個(gè)字節(jié)的內(nèi)存緩沖區(qū)ASC_BUF;然后將ASC_BUF中的ASCII碼轉(zhuǎn)換成壓縮型BCD碼存入具有20個(gè)字節(jié)的內(nèi)存緩沖區(qū)BCD_BUF。從高位開始鍵入十進(jìn)制數(shù)字(例如:‘3’,‘2’,‘4’,‘9’,‘5’),以ASCII碼的形式從低地址字節(jié)開始依次存入ASC_BUF。數(shù)字以空格鍵為結(jié)束,并且在接收數(shù)字字符時(shí)在CX寄存器記下個(gè)數(shù)。若個(gè)數(shù)為奇數(shù)則將數(shù)字字符往后移動(dòng)一個(gè)字節(jié),空出的第一個(gè)字節(jié)填入‘0’,并將個(gè)數(shù)加1使之為偶數(shù)個(gè)。因此,個(gè)數(shù)減半為轉(zhuǎn)換成壓縮型BCD碼后所占的字節(jié)數(shù),將這個(gè)數(shù)字存入BCD_BUFF緩沖區(qū)的第一個(gè)字節(jié),然后,將ASC_BUF中的ASCII碼的高4位清0,并用邏輯指令和移位指令將它們每?jī)晌黄丛谝黄?,成為壓縮型BCD形式存入BCD_BUF(叢低地址的第2個(gè)字節(jié)開始一次存放)。 NAME LI12-3.ASM DATA SEGMENT ASC_BUF DB 30 DUP(?) BCD_BUF DB 20 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MOV AX,DATA MOV DS,AX MOV DI,OFFSET ASC_BUF MOV CX,0 MOV AH,01H L1: INT 21H CMP AL,' ' JE L2 MOV [DI],AL INC DI INC CX JMP L1 TEST CX,01H L2: JNE L4 MOV DX,CX MOV SI,CX L3: MOV AL,ASC_BUF[SI-1] MOV ASC_BUF[SI],AL DEC SI LOOP L3 MOV ASC_BUF,'0' MOV CX,DX INC CX L4: SHR CX,1 MOV DI,OFFSET BCD_BUF MOV SI,OFFSET ASC_BUF MOV [DI],CL INC DI LOOPER: MOV DL,[SI] SHL DL,1 SHL DL,1 SHL,DL,1 SHL,DL,1 MOV AL,[SI+1] AND AL,0FH OR DL,AL MOV [DI],DL ADD SI,2 INC DI LOOP LOOPER MOV AH,4CH INT 21H CODE ENDS END START 例12-4:壓縮型BCD碼的輸出。 將內(nèi)存緩沖區(qū)中的壓縮型BCD碼在屏幕上輸出。假設(shè)十進(jìn)制數(shù)字(壓縮型BCD碼)的低位放在低地址,因此輸出時(shí)需要從高地址(高位)開始。因?yàn)閴嚎s型BCD碼是一個(gè)字節(jié)里存放兩位十進(jìn)制數(shù)字,需要將兩位BCD碼分離出來。 NAME LI12-4.ASM DATA SEGMENT BUF DB 34H,04H,50H,47H,89H,00H,78H,90H COUNT EQU $-OFFSET BUF DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,COUNT MOV SI,OFFSET BUF+7 LL: MOV DL,[SI] MOV BX,CX MOV CL,4 SHR DL,CL OR DL,30H MOV AH,02H INT 21H MOV DL,[SI] AND DL,0FH OR DL,30H MOV AH,02H INT 21H DEC SI MOV CX,BX LOOP LL MOV AH,4CH INT 21H CODE ENDS END START 例12-5:從鍵盤上輸入十六進(jìn)制數(shù)。 假設(shè)需要從鍵盤上輸入一個(gè)無符號(hào)的十六進(jìn)制數(shù),將其存入一個(gè)字存儲(chǔ)器里。如輸入14A0。假設(shè)鍵入的字符都是0~9,A~F字符之一。0~9的ASCII碼的高四位中的3去掉,就成為與其對(duì)應(yīng)的十六進(jìn)制數(shù)值。而A~F的ASCII碼比與之對(duì)應(yīng)的十六進(jìn)制數(shù)值均達(dá)37H,從ASCII碼中減去37H,就是相應(yīng)的十六進(jìn)制數(shù)值了。 NAME LI12-5.ASM DATA SEGMENT BUF DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,4 MOV BUF,0 L1: MOV AH,01H INT 21H SUB AL,30H CMP AL,0AH JNAE L2 SUB AL,7 L2: MOV BX,CX MOV CL,4 SHL BUF,CL MOV AH,0 OR BUF,AX MOV CX,BX LOOP L1 MOV AH,4CH INT 21H CODE ENDS END START 例12-6:從鍵盤上輸入十進(jìn)制數(shù)并將其化為二進(jìn)制數(shù)(“十化二”輸入)。 對(duì)無符號(hào)整數(shù)來說,假設(shè)它的值不大于16位(一個(gè)字)所能表示的數(shù)的范圍(0~65535),則只需要將鍵入的0~9數(shù)字的ASCII轉(zhuǎn)換成對(duì)應(yīng)的數(shù)值送至AL,在把每一位十進(jìn)制數(shù)拼在一起時(shí),先將字緩沖區(qū)的內(nèi)容乘10,然后用算術(shù)加法指令A(yù)DD加上AX(AH=0)的內(nèi)容。假設(shè)鍵入的十進(jìn)制數(shù)字以“,”字符最為一個(gè)數(shù)的結(jié)束。 NAME LI12-6.ASM DATA SEGMENT BUF DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BUF,0 IN_L: MOV AH,01H INT 21H CMP AL,',' JE END_L AND AL,0FH SHLBUF,1 MOV BX,BUF SHL BUF,1 SHL BUF,1 ADD BUF,BX MOV AH,0 ADD BUF,AX JMP IN_L END_L: MOV AH,4CH INT 21H CODE ENDS END START 例12-7:二化十輸出。 在進(jìn)行算術(shù)運(yùn)算時(shí),常需要將二進(jìn)制的結(jié)果,轉(zhuǎn)換成十進(jìn)制數(shù)(BCD碼)形式,進(jìn)一步轉(zhuǎn)換成ASCII碼顯示或打印出來(簡(jiǎn)稱“二化十”輸出)。假設(shè)我們把CX寄存器中的無符號(hào)整數(shù)進(jìn)行二化十輸出,則需要把CX中的數(shù)值轉(zhuǎn)換成BCD碼,也就是檢查CX中的二進(jìn)制數(shù)包含有多少個(gè)10000(2710H),多少個(gè)1000(03E8H),多少個(gè)100(64H),多少個(gè)10(0AH),在把這些數(shù)以及剩下的個(gè)位數(shù)拼上30H,使之變成對(duì)應(yīng)的ASCII碼,輸出顯示。 NAME LI12-7.ASM CODE SEGMENT ASSUME CS:CODE START: MOV CX,0A2F0H MOV DL,0 L1: CMP CX,2710H JNAE L2 INC DL SUB CX,2710H JMP L1 L2: OR DL,30H MOV AH,02H INT 21H MOV DL,0 L3: CMP CX,03E8H JNAE L4 INC DL SUB CX,03E8H JMP L3 L4: OR DL,30H MOV AH,02H INT 21H MOV DL,0 L5: CMP CX,64H JNAE L6 INC DL SUB CX,64H JMP L5 L6: OR DL,30H MOV AH,02H INT 21H MOV DL,0 L7: CMP CX,0AH JNAE L8 INC DL SUB CX,0AH JMP L7 L8: OR DL,30H MOV AH,02H INT 21H MOV DL,CL OR DL,30H MOV AH,02H INT 21H MOV AH,4CH INT 21H CODE ENDS END START
|