由于汇编语言的输入都会当做字符,所以在我们需要读入数值的时候需要一个转换函数,将字符转换成数值。下面的程序以读入5个十六进制字节数为例,讲述一下个人的思路(程序只有个大体,并不完整,若要真正实现,需要有所修改)。
;数据段的定义
DATA SEGMENT
STRING DB 15,0,15 DUP(0) ;用于存储读入的字符串
DATA1 DB 5 DUP(0) ;用于存储转换后的数据
TIP1 DB 'Input 5 numbers(H):','$'
DATA ENDS
由于读入5个十六进制字节数据,每个数据的字符形式需要2个字节,在加上每两个数据之间的空格(包括输入最后的回车),一共需要15个字节,所以需要预设长度至少为15的缓冲区。
LEA DX,TIP1 ;显示提示TIP1
MOV AH,09H
INT 21H
LEA DX,STRING ;读取字符形式的数据
MOV AH,0AH
INT 21H
;字符转换成数值
MOV BX,05H ;目标读取的数据个数
MOV SI,02H ;用来指向STRING
MOV DI,00H ;用来指向DATA1
MOV CL,04H
TRANS1: MOV DL,STRING[SI] ;依次读取STRING中的字符
CMP DL,20H ;空格的ASCII码为20H
JE NEXT1 ;若是空格就跳转到NEXT1
CMP DL,0DH ;回车的ASCII码为0DH
JE NEXT1 ;若是回车就跳转到NEXT1
CMP DL,3AH
JB NEXT0 ;若是字母,则减去07H;若是数字,跳转到NEXT0
SUB DL,07H
NEXT0: SUB DL,30H ;减去30H后由ASCII转为数值
SHL DATA1[DI],CL ;逻辑左移4位后相加
ADD DATA1[DI],DL
INC SI
JMP NEXT2
NEXT1: INC DI ;遇到空格或是回车表示一个数据转换完成,此时DI加一,指向下一个存储数值的位置
INC SI
NEXT2: CMP BX,DI ;判断所有数据是否转换完成
JNE TRANS1
- 数字字符与数值的转换(以字符‘1’转化成数值01H为例):字符‘1’的ASCII码为31H,所以只要在其基础上减去30H,即可得到对应的数值。
- 英文字符与数值的转换(以字符‘A’转换成数值0AH为例):字符‘A’的ASCII码为41H,只要在其基础上减去37H,即可得到对应数值0AH。上述的代码中,若判断是字母,先减去07H,再同数字字符一样减去30H。当然这里可以设计成两个分支,直接减去37H。
- 对上述代码中逻辑左移部分的解释:上述代码中设计成每次读入并转换后的单个数值都存在对应区域的第四位,所以当我们已经读入高四位的数据后,想读入低四位的数据时,只需将原有的数据左移4位,再加上低位数据即可。这里也可以设计成乘10H后相加(与左移4位效果相同)。
十六进制字节数的显示输出可以采取类似的思路,读者可以自行考虑。