概述
各种不同数制输入/输出的转换
例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
最后
以上就是务实手套为你收集整理的汇编(十二)——位操作类指令练习的全部内容,希望文章能够帮你解决汇编(十二)——位操作类指令练习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复