3

我在汇编语言中循环出现问题。

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

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

我想打印一个由字符组成的金字塔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)。但为此,我需要另一个计数器寄存器,但我做不到。我怎么解决这个问题?

4

2 回答 2

4

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

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

有点像这样:

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

这正是 JohnB 向您展示的。

于 2012-09-08T08:07:25.477 回答
3

差不多这样?

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 时,无论如何都要覆盖它。

于 2012-09-08T07:56:19.443 回答