assembly - 如何在汇编中从用户输入多位数?

标签 assembly dos x86-16

我需要找到一个可以从用户那里接收超过 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”时,无限循环停止。
然而,我几乎确信我已经看到了一个代码,它用中断来做同样的事情。
我想停止使用这个块并使用可以更好地工作的短中断

最佳答案

在大多数情况下,如果将输入作为字符串接收然后转换为整数,会更容易。 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你可以检查溢出。

关于assembly - 如何在汇编中从用户输入多位数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54696513/

相关文章:

c++ - 确定指令是否具有间接内存操作数

c - ASM - 优化的 `for` 循环

assembly - x86 程序集 - 为什么 [e]bx 保留在调用约定中?

assembly - "operands do not match"汇编语法错误

algorithm - 在 Assembler 上以 10 为基数添加两个数字

assembly - 使用 int13h 从软盘加载段

assembly - ARM错误消息分支目标未对齐

php - 优美的DOS命令错误处理

assembly - 使用自己的键盘中断 `int 09h` 处理程序时代码的奇怪行为(损坏的绘制)

c++ - DOS32 的编译器?