繁体   English   中英

如何用汇编语言8086将字符串转换为数字?

[英]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种口味:

  • 将两个8位值相乘( ALmul的操作数); 将16位结果存储在AX
  • 将两个16位值相乘( AXmul的操作数); 将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM