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