当前位置: 首页 > 知识库问答 >
问题:

在x86程序集中,两个循环嵌套在另一个循环内

焦光霁
2023-03-14

我在汇编语言中遇到了循环问题。

当我们想要使用计数器寄存器在嵌套循环中循环时,我们首先要做的是将计数器寄存器的值移动到外部循环的堆栈中,然后在我们完成内部循环时取回它,这样我们就能够使用一个计数器寄存器在每个循环中循环不同的迭代次数。

但是嵌套循环中的嵌套循环呢?

我想打印一个由字符< code>S组成的金字塔。我得到的是,

SSSSSSSSSS
SSSSSSSSS
SSSSSSSS
SSSSSSS
SSSSSS
SSSSS
SSSS
SSS
SS
S

我真正想要的是,

 SSSSSSSSSS
  SSSSSSSS
   SSSSSS
    SSSS
     SS
     S

这是我的程序代码

MOV BX,10           ; HOLD 10 IN BX FOR INNER LOOP
     MOV AX,0           ; START ITERATIONS FROM 0
     MOV CX,10          ; MAX NUMBER OF ITERATIONS

    L2:

        PUSH CX         ;PUSH CX IN A STACK
        MOV CX,BX       ;STORE NEW VALUE IN CX FOR INNER LOOP ITERATION

            L1:

                MOV DX, [SI]               ; MOVE THE STRING INTO DX
                MOV AH,02H                 ; DISPLAY EVERYTHING FROM DX
                INT 21H

            LOOP L1

        MOV DX,0AH     ;PRINT LINE FEED AFTER PRINTING EACH LINE OF ASTERIKS
        MOV AH,02H
        INT 21H

        SUB BX,01     ;DECREASE THE VALUE OF BX BY 1

        POP CX        ;RESTORE ORIGINAL VALUE OF CX FOR OUTER LOOP
        ADD AX,01     ;INCREMENT VALUE OF AX BY 1

    LOOP L2


     MOV AH, 4CH                  ;RETURN CONTROL TO DOS
     INT 21H

为了实现我想要的,我需要在嵌套循环中添加另一个输出空格字符的循环(即020H)。但为此,我需要另一个柜台登记,我不能这样做。我该如何解决这个问题?

共有2个答案

乐正镜
2023-03-14

差不多吧?

L2:

    PUSH CX         ;PUSH CX IN A STACK

    ; insert this
    MOV CX, 10      ; width of your tree = 10
    SUB CX, BX      ; subtract length of "s" string
    SHR CX, 1       ; divide CX by 2 => number of spaces at the beginning
    JCXZ endL3      ; no spaces? don't do anything

       L3:
            MOV DX, 20H ; space character
            MOV AH,02H                 ; print space
            INT 21H

        LOOP L3

    endL3:

    MOV CX,BX       ;STORE NEW VALUE IN CX FOR INNER LOOP ITERATION

        L1:

            MOV DX, [SI]               ; MOVE THE STRING INTO DX
            MOV AH,02H                 ; DISPLAY EVERYTHING FROM DX
            INT 21H

        LOOP L1

    MOV DX,0AH     ;PRINT LINE FEED AFTER PRINTING EACH LINE OF ASTERIKS
    MOV AH,02H
    INT 21H

    SUB BX,01     ;DECREASE THE VALUE OF BX BY 1

    POP CX        ;RESTORE ORIGINAL VALUE OF CX FOR OUTER LOOP
    ADD AX,01     ;INCREMENT VALUE OF AX BY 1

LOOP L2

顺便问一下,您初始化和增加AX的目的是什么?当您将数据移动到AH/AL时,无论如何都要覆盖它。

梁建德
2023-03-14

您已经在做给定ASM中需要做的事情。您可以将CX的当前值推送到堆栈(保存它)并稍后弹出它以恢复它。当您需要额外的嵌套时,您需要这样做。

在JohnB提供的代码中,他只是添加了一个循环,以便在打印星号之前打印出空格。不需要额外的嵌套,这意味着它相当直接。

有点像这样:

For each line
    Print an incrementing number of spaces
    Print a decrementing number of asterisks
Repeat

这正是JohnB向你们展示的。

 类似资料:
  • 问题内容: 我已经使用Java已有一段时间了,但是我对循环的教育还是有点不足。我知道如何创建存在于Java中的每个循环以及如何打破循环。但是,最近我想到了: 假设我有两个嵌套循环。我可以只使用一条语句来打破两个循环吗? 这是我到目前为止所拥有的。 有没有办法做到这一点? 问题答案: 在Java中,您可以使用标签来指定要中断/继续的循环:

  • 我用For创建了一个嵌套循环,这是程序代码和输出,然后我尝试了同时循环,得到了不同的结果 对于 虽然 请引导我。。谢谢

  • 问题内容: 如果我在一个循环中有一个循环,并且一旦满足一条语句,我想中断主循环,那我应该怎么做? 这是我的代码: 问题答案: 使用标记的中断: 另请参阅 Java代码中的“循环:”。 这是什么,为什么会编译? 文献资料

  • 我需要12次外循环,每个外循环1次内循环 例如: 等 但现在我的内循环在第一次迭代的外循环上运行。 请帮助我如何使用for循环执行此操作。

  • 制作一个单页的WordPress主题。使用此循环调用所有页面并将其显示为部分(html5标记): 这将创建一个基于页面的漂亮的小循环部分。我唯一关心的是:其中一个“页面”/部分应该显示一些博客文章。正在寻找一种基本上在循环中创建循环的方法——可以随页面一起重新排序。 所以我想我的问题是: 这段代码看起来像什么 谢谢

  • 我的程序中有两个while循环。第一个是针对游戏菜单的,第二个是针对实际游戏的。如果“Gameover-Event”发生,我想返回菜单。我不知道该怎么做。