汇编(十二)——位操作类指令练习

种不同数制输入/输出的转换

 

例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
  

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值