[英]How to convert a string to number in assembly language 8086?
我是汇编的新手,我需要转换的帮助。下面的代码应该从带有中断01h的键盘读取的字符串中转换。我知道这是错误的,但是您可以帮助我确定错误吗?
mov dx,0
convert:
sub al,48 ;to covert to int
mov bl,al ;in bl will be the digit read
mov ax,dx
mul ten ;ax will store the old result multiplied by 10
mov bh,0
add ax,bx
mov dx,ax
mul ten ;ax will store the old result multiplied by 10
从注释中,我知道十是一个单词大小的变量,包含值10。
这意味着乘法是字大小的,因此将覆盖DX。
解决方案:将DX更改为pe CX
mov cx,0
convert:
sub al,48 ;to covert to int
mov bl,al ;in bl will be the digit read
mov ax,cx
mul ten ;ax will store the old result multiplied by 10
mov bh,0
add ax,bx
mov cx,ax
mul
有2种口味:
AL
和mul
的操作数); 将16位结果存储在AX
AX
和mul
的操作数); 将32位结果存储在DX AX
您的问题有点含糊,但是我想您想要第一种口味,但是相反,您却发现自己要面对第二种口味。
为了告诉assember您想要第一种口味,请为mul
提供明确无误的 8位操作数。 在所有汇编器上肯定有效的一种方式是使用8位寄存器,例如BH
(我之所以选择一个寄存器,是因为它的值在mul
时显然是无关紧要的,因为它很快就会被覆盖)。
sub al,48 ; to covert to int
mov bl,al ; in bl will be the digit read
mov ax,dx
mov bh,10 ; use BH to hold factor 10
mul bh ; multiply AL by BH; the product is stored in AX; DX is unaffected
mov bh,0
add ax,bx
mov dx,ax
编辑:
我刚刚意识到这将可以输入的数字范围限制为0 ... 255,这可能不是您想要的。 改用user3628942的解决方案; 它允许您输入最大65535的数字。
通常,还有其他方法。 以下是使用add
而不是mul
的解决方案。 许多年前,这是处理器架构的流行技巧,而mul
要么是昂贵的(即,缓慢的)指令,要么根本不存在。 适用于最大65535的数字; 静默换成零以获得更高的数字。
sub al,48 ; ASCII value --> numeric value
mov ah,0 ; AX = numeric value of digit
add dx,dx ; DX = 2 * original DX
add ax,dx ; AX = 2 * original DX + digit
add dx,dx ; DX = 4 * original DX
add dx,dx ; DX = 8 * original DX
add dx,ax ; DX = 10 * original DX + digit
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.