各种不同数制输入/输出的转换 例12-1:数字0~9对应的格雷码为:18H,31H,05H,06H,09H,0AH,0CH,11H,12H,14H。编程将0~9数字转换成格雷码,并显示输出。 将0~9数字对应的格雷码作为转换表,用转换指令XLAT将AL中的在表中的相对偏移量转换为转换表中的格雷码。格雷码的输出,因为格雷码为两位十六进制数,需要用逻辑运算指令或移位指令将两位十六进制数分离出来,在将其转换为相应的ASCII码并显示输出(转换也是使用了转换指令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码转换成非压缩BCD码)。 假设从键盘上键入一个8位的十进制数,要求将他们以真正的非压缩型BCD码的形式存放在内存输入缓冲区。0~9数字的ASCII码,只要将高4位清零,即为对应的非压缩BCD码。假设从十进制的高位开始输入,转换后从低地址字节开始依次存放。 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码转换成ASCII码)。 将内存缓冲区中的6位十进制数字(非压缩型BCD码)显示在屏幕上,假设十进制数字低位存放在低地址,输出时应从高位依次显示。显示输出数字时,将0~9数字转换成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码的输入 从键盘上键入一个十进制数字(如32495),以压缩型BCD码的形式存放在内存缓冲区里。设计思想:首先将键入的数字字符以ASCII码的形式存入具有30个字节的内存缓冲区ASC_BUF;然后将ASC_BUF中的ASCII码转换成压缩型BCD码存入具有20个字节的内存缓冲区BCD_BUF。从高位开始键入十进制数字(例如:‘3’,‘2’,‘4’,‘9’,‘5’),以ASCII码的形式从低地址字节开始依次存入ASC_BUF。数字以空格键为结束,并且在接收数字字符时在CX寄存器记下个数。若个数为奇数则将数字字符往后移动一个字节,空出的第一个字节填入‘0’,并将个数加1使之为偶数个。因此,个数减半为转换成压缩型BCD码后所占的字节数,将这个数字存入BCD_BUFF缓冲区的第一个字节,然后,将ASC_BUF中的ASCII码的高4位清0,并用逻辑指令和移位指令将它们每两位拼在一起,成为压缩型BCD形式存入BCD_BUF(丛低地址的第2个字节开始一次存放)。 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码的输出。 将内存缓冲区中的压缩型BCD码在屏幕上输出。假设十进制数字(压缩型BCD码)的低位放在低地址,因此输出时需要从高地址(高位)开始。因为压缩型BCD码是一个字节里存放两位十进制数字,需要将两位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:从键盘上输入十六进制数。 假设需要从键盘上输入一个无符号的十六进制数,将其存入一个字存储器里。如输入14A0。假设键入的字符都是0~9,A~F字符之一。0~9的ASCII码的高四位中的3去掉,就成为与其对应的十六进制数值。而A~F的ASCII码比与之对应的十六进制数值均达37H,从ASCII码中减去37H,就是相应的十六进制数值了。 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:从键盘上输入十进制数并将其化为二进制数(“十化二”输入)。 对无符号整数来说,假设它的值不大于16位(一个字)所能表示的数的范围(0~65535),则只需要将键入的0~9数字的ASCII转换成对应的数值送至AL,在把每一位十进制数拼在一起时,先将字缓冲区的内容乘10,然后用算术加法指令ADD加上AX(AH=0)的内容。假设键入的十进制数字以“,”字符最为一个数的结束。 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:二化十输出。 在进行算术运算时,常需要将二进制的结果,转换成十进制数(BCD码)形式,进一步转换成ASCII码显示或打印出来(简称“二化十”输出)。假设我们把CX寄存器中的无符号整数进行二化十输出,则需要把CX中的数值转换成BCD码,也就是检查CX中的二进制数包含有多少个10000(2710H),多少个1000(03E8H),多少个100(64H),多少个10(0AH),在把这些数以及剩下的个位数拼上30H,使之变成对应的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
|