Assembly 如何从汇编中的用户输入多位数?

Assembly 如何从汇编中的用户输入多位数?,assembly,dos,x86-16,Assembly,Dos,X86 16,我需要找到一个中断,可以从用户接收一个数字超过1位。 ;代码 我已经尝试过做一个无休止的循环,每次都使用 mov ah,1 int 21h 组合。当用户按下“q”键时,无限循环停止。 然而,我几乎确信我已经看到了一个代码,它用中断来做同样的事情 我想停止使用这个块,使用短中断来更好地工作在大多数情况下,如果将输入作为字符串接收,然后转换为整数,那么它会变得更容易int 21h/ah=0ah可以将缓冲输入读取到指向DS:DX的字符串中 一旦你有了这个字符串,你就可以把它转换成一个整数。这听起

我需要找到一个中断,可以从用户接收一个数字超过1位。 ;代码

我已经尝试过做一个无休止的循环,每次都使用

mov ah,1 
int 21h 
组合。当用户按下“q”键时,无限循环停止。 然而,我几乎确信我已经看到了一个代码,它用中断来做同样的事情


我想停止使用这个块,使用短中断来更好地工作

在大多数情况下,如果将输入作为字符串接收,然后转换为整数,那么它会变得更容易
int 21h/ah=0ah
可以将缓冲输入读取到指向DS:DX的字符串中

一旦你有了这个字符串,你就可以把它转换成一个整数。这听起来像是一个家庭作业问题,因此与其给您代码,不如提供一个高级算法,用于将包含以10为基数的数字的ASCII字符字符串转换为实际整数(伪代码):


健壮的代码也会检查溢出和无效字符。您在这里很幸运,因为在ASCII中,表示数字的字符('0'…'9')是连续存储的,并且x86具有一个可以检查溢出的功能。

没有DOS系统调用,也没有BIOS中断。您需要一个循环或字符串输入并自己转换为整数。请参阅(在该页中搜索多位数)以了解未来的读者,在上有一个NASM x86-64版本,可移植到32位。(或进行一些调整,调整到16位,并进一步调整到8086,以避免
movzx
imul ax,10
mov ah,1 
int 21h 
accum = 0
i = 0
while(string[i] != '\r')
    accum *= 10
    accum += (string[i] - '0')
    i++