Assembly 程序集如何在用户定义计数器中循环字符

Assembly 程序集如何在用户定义计数器中循环字符,assembly,x86-16,dosbox,Assembly,X86 16,Dosbox,我是使用DosBOX组装8086的初学者。 我们的任务是制作以下文件: 我试过这样做,这是我的示例代码 mov ah,9 lea dx,[100] // Enter a character: $ int 21h mov ah,1 int 21h mov bl,al mov ah,9 lea dx,[120] // Enter a number: $ int 21h mov ah,1 int 21h mov [si],al mov cx,[si] mov ah,2 //

我是使用DosBOX组装8086的初学者。 我们的任务是制作以下文件:

我试过这样做,这是我的示例代码

mov ah,9
lea dx,[100]    // Enter a character: $
int 21h
mov ah,1
int 21h
mov bl,al
mov ah,9
lea dx,[120]    // Enter a number: $
int 21h
mov ah,1
int 21h
mov [si],al
mov cx,[si]
mov ah,2        // 14e
mov dl,bl
int 21h
inc cx
loop 14e
当我输入一个数字后再输入一个数字时,问题就出现了。 它显示我输入的正确字符,但不会停止到所需的循环数。它只是无限地喷射角色

编辑::: 它现在显示正确。我只想知道如何在下一行打印enteranumber:$

因为事情就是这样发生的: 输入字符:dEnter数字:4ddd

以下是编辑后的代码:

mov ah,9
lea dx,[100]    // Enter a character: $
int 21h
mov ah,1
int 21h
mov bl,al
mov ah,9
lea dx,[120]    // Enter a number: $
int 21h
mov ah,1
int 21h
sub al,30
mov cl,al
xor ch,ch
mov ah,2        // 150
mov dl,bl
int 21h
loop 150
loopinstruction减少CX,而您在循环内增加CX

因此,CX的值永远不会达到零,并导致循环指令结束

如果您在调试器中逐条执行代码指令,观察CX的值,那么发现这一点应该很容易

输入字符:dEnter数字:4ddd

在解决了最初的问题后,您表达了一个附加问题

我只想知道如何在下一行打印enteranumber:$

您可以通过输出回车符13/linefeed 10对来完成此操作

mov ah,9
lea dx,[100]    // Enter a character: $
int 21h
mov ah,1
int 21h
mov bl,al

mov dl, 13     ; Carriage return
mov ah, 02h
int 21h
mov dl, 10     ; Linefeed
mov ah, 02h
int 21h

mov ah,9
lea dx,[120]    // Enter a number: $
int 21h
...

请记住,DOS中断从终端读取字符。如果你把4读作输入,你就得不到数字4。您将得到4的ASCII表示,即34h。暂时忽略对有效输入的检查,只需从al中减去30小时即可得到数字。我也很好奇你为什么要做mov[si],然后是mov-cx[si]。为什么不只是mov cl,al和xor ch,ch?或者你也可以做类似的异或,啊,然后是mov-cx,ax。您的代码不清楚si在内存中指向的位置。@khnkhymkh请编辑您的问题以包含更新的代码。不要链接到外部粘贴服务。另外,请确保不要从问题中删除原始代码。如果要在循环中使用CL/CH/CX,或者要向上计数,您忘了说完全避免循环指令是正确的方法。cmp CX、9/jbe可能是他们想要的。loop是那些复杂的CISC指令中的一个,我们没有理由教它。只需对循环使用条件分支,因为您必须理解它们才能执行条件。所以,基本的倒计时循环样板文件是dec cx/jnz,它与循环相同,只是写入了标志。