汇编程序 MASM,当值为 0 或以下时在 JNZ 循环中打印

Assembler MASM, printing in JNZ loop when value is 0 or below

我有一个任务要编写一个程序,该程序将在下面创建为输出:

ABCD******
   ABCD***
      ABCD

我的代码是:

kod segment
org 100h
assume cs:kod

start:
mov cx,3
mov bx,3
mov ax,6

mov ah, 02h

    PETLA_ZEW:

    push cx
    mov cx,4
    mov dl, 'A'

        PETLA_CIAG:

            int 21h
            inc dl
            dec cx

        jnz PETLA_CIAG

    push ax
    mov cx, ax
    mov dl, '*'

        PETLA_GWIAZD:

            int 21h
            dec cx

        jnz PETLA_GWIAZD

    sub ax, 3

    mov dl, 0ah
    int 21h
    mov dl, 0dh
    int 21h

    push bx
    mov cx, bx
    mov dl, ' '
        PETLA_SPACJE:

            int 21h
            dec bx

        jnz PETLA_SPACJE

    pop bx
    add bx, 3

    pop cx
    dec cx

    jnz PETLA_ZEW

koniec:
    mov ah, 4ch
    int 21h
kod ends
end start

但问题是在调用 PETLA_GWIAZD 的循环中,当我第二次减去 ax 时,它的值为 0,这导致了无限循环。减法时我应该使用任何其他循环吗?也许在循环之前进行一些验证检查?我刚开始使用 Assembly,但还不是很了解...

谢谢!

问题在于您使用的寄存器:AXCX 用于中断和循环,因此您可以使用其他寄存器,例如 SI 而不是 CXDI 而不是 AX :

kod segment
org 100h
assume cs:kod

start:
mov si,3        ;◄■■ INSTEAD OF CX.
mov bx,3
mov di,6        ;◄■■ INSTEAD OF AX.

mov ah, 02h

    PETLA_ZEW:

    mov cx,4
    mov dl, 'A'

        PETLA_CIAG:

            int 21h
            inc dl
            dec cx

        jnz PETLA_CIAG

    cmp di, 0   ;◄■■ IF COUNTER == 0 ...
    je  koniec  ;◄■■ ... NO MORE ASTERISKS.

    mov cx, di  ;◄■■
    mov dl, '*'

        PETLA_GWIAZD:

            int 21h
            dec cx

        jnz PETLA_GWIAZD

    sub di, 3        ;◄■■

    mov dl, 0ah
    int 21h
    mov dl, 0dh
    int 21h

    push bx
    mov cx, bx
    mov dl, '_'
        PETLA_SPACJE:

            int 21h
            dec bx

        jnz PETLA_SPACJE

    pop bx
    add bx, 3

    dec si       ;◄■■
    jnz PETLA_ZEW

koniec:
    mov ah, 4ch
    int 21h
kod ends
end start