汇编如何在用户定义的计数器中循环字符

时间:2019-02-21 13:13:21

标签: assembly x86-16 dosbox

我是Assembly8086的初学者(使用DosBOX)。 我们有一个任务来产生以下内容: See this image.

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

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

输入数字后输入数字会出现问题。 它显示我输入的正确字符,但不会停止到所需的循环次数。它只是无限地向角色发送垃圾邮件。

编辑:::: 现在可以正确显示。我只想知道如何在下一行上打印“输入数字:$”。

因为这是发生的情况: 输入字符: d 输入数字: 4 dddd

这是编辑后的代码:

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

2 个答案:

答案 0 :(得分:1)

当您进入循环增加 loop时,CX指令减少CX

因此CX的值将永远不会为零,并导致loop指令结束。

如果您在调试器中逐条指令逐步执行代码指令,并观察CX的值,发现这一点应该非常容易。

答案 1 :(得分:0)

  

输入字符: d 输入数字: 4 dddd

解决原始问题后,您表示了另一个问题。

  

我只想知道如何在下一行上打印“输入数字:$”。

您可以通过输出回车符(13)/换行符(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
...