在弄清楚如何在 DOSBox 中正确循环时遇到困难

问题描述 投票:0回答:1

我正在尝试显示:

A123*B123*C123*

在 DOSBox 中使用

loop
但我得到的是:

A1*2*3*B*1*2*3*C*1*2*3*D

这是我当前的代码:

.model small
.stack
.data

.code
main    proc
        mov cx,3
        mov ah, 2
        mov dl, 'A'
Letter: int 21h
        push cx
        push dx
        mov cx, 3
        mov ah, 2
        mov dl, '1'
Number: int 21h
        push cx 
        push dx
        mov ah, 2
        mov cx, 1
        mov dl, '*'
Aste:   int 21h
        Loop Aste
        pop dx
        pop cx
        add dl,1
        Loop Number
        pop dx
        pop cx
        add dl, 1
        Loop Letter
        int 21h

        mov ah,4ch
        int 21h
main    endp
end     main

我尝试切换运行循环的方式,但每当我将循环“aste”放在末尾时,它都会不间断地打印“*”。

loops assembly x86-16 dosbox
1个回答
0
投票
        push cx
        push dx
        mov ah, 2
        mov cx, 1
        mov dl, '*'
Aste:   int 21h
        Loop Aste
        pop dx
        pop cx

如果您需要输出的只是单个字符,为什么要创建循环?它还让你写下这些烦人的

push
pop

从内到外解决任务

该任务需要使用两个循环。我们将这些称为“嵌套循环”,因为“内循环”将嵌入“外循环”中。

从简单打印的内循环开始
123

  mov  dl, '1'       ;
InnerLoop:           ;
  mov  ah, 02h       ;
  int  21h           ;
  inc  dl            ;
  cmp  dl, '4'       ;
  jb   InnerLoop     ;
  • 在内循环下方,我们打印单个字符
    *
  mov  dl, '1'
InnerLoop:
  mov  ah, 02h
  int  21h
  inc  dl
  cmp  dl, '4'
  jb   InnerLoop

  mov  dl, '*'       ;
  mov  ah, 02h       ;
  int  21h           ;
  • 在内循环之上,我们打印单个字符
    A
    ,我们从可用寄存器(如 BL)中检索该字符
  mov  dl, bl        ; BL is one of 'A', 'B', or 'C'
  mov  ah, 02h       ;
  int  21h           ;

  mov  dl, '1'
InnerLoop:
  mov  ah, 02h
  int  21h
  inc  dl
  cmp  dl, '4'
  jb   InnerLoop

  mov  dl, '*'
  mov  ah, 02h
  int  21h

现在我们用外循环将其括起来

  • 在顶部我们将 BL 寄存器初始化为
    A
  mov  bl, 'A'       ;
OuterLoop:           ;

  mov  dl, bl
  mov  ah, 02h
  int  21h

  mov  dl, '1'
InnerLoop:
  mov  ah, 02h
  int  21h
  inc  dl
  cmp  dl, '4'
  jb   InnerLoop

  mov  dl, '*'
  mov  ah, 02h
  int  21h
  • 在底部,我们放置迭代逻辑,递增 BL 寄存器并重复字符
    B
    C
  • 的外循环
  mov  bl, 'A'
OuterLoop:

  mov  dl, bl
  mov  ah, 02h
  int  21h

  mov  dl, '1'
InnerLoop:
  mov  ah, 02h
  int  21h
  inc  dl
  cmp  dl, '4'
  jb   InnerLoop

  mov  dl, '*'
  mov  ah, 02h
  int  21h

  inc  bl            ;
  cmp  bl, 'D'       ;
  jb   OuterLoop     ;

将其插入您的骨架程序并欣赏视图!

A123*B123*C123*
© www.soinside.com 2019 - 2024. All rights reserved.