【问题标题】:How to input from a user multi digit number in assembly?如何在汇编中从用户输入多位数字?
【发布时间】:2019-02-14 18:01:42
【问题描述】:

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

mov [0],0
mov si,0
lop:    
    mov ah,1
    int 21h
    cmp al,'q'
    je finishedInput
    xor ah,ah 
    add [word ptr si], ax
    jmp lop

finishedInput:

我已经尝试做一个无限循环,每次都使用

mov ah,1 
int 21h 

组合。当用户按下“q”时,无限循环停止。 但是,我几乎确信我已经看到了一个使用中断来做同样事情的代码。

我想停止使用这个块并使用可以更好地工作的短中断

【问题讨论】:

  • 没有 DOS 系统调用或 BIOS 中断。您需要一个循环或字符串输入并自己转换为整数。见stackoverflow.com/tags/x86/info(在该页面搜索多位数字)

标签: assembly dos x86-16


【解决方案1】:

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

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

accum = 0
i = 0
while(string[i] != '\r')
    accum *= 10
    accum += (string[i] - '0')
    i++

健壮的代码也会检查溢出和无效字符。你很幸运,因为在 ASCII 中代表数字的字符('0'...'9')是连续存储的,而 x86 有一个 FLAGS register 可以检查溢出。

【讨论】:

  • 对于未来的读者,NASM Assembly convert input to integer? 上有一个 NASM x86-64 版本,可轻松移植到 32 位。 (或者进行一些调整,到 16 位,甚至更多地调整到 8086 以避免 movzximul ax, 10
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
相关资源
最近更新 更多