繁体   English   中英

组装-(NASM 32位)打印一个三角形的星形不能正常工作

[英]Assembly - (NASM 32-bit) Printing a triangle of stars not working properly

编辑:这个问题已经解决。 非常感谢mbratch。

我的代码输出:

电流输出

但是它应该显示以下内容:

预期产量

我认为问题出在内部循环中,但我无法解决,它可以在第一个循环中正常运行,但不能在后续循环中正常运行。

这是我的代码:

innerloop1: ;;for(j=n-i;j>0;j--)
mov bl, [i]
sub byte [num], bl
mov dl, [num]
mov byte [j], dl
cmp byte [j], 0
jle printStar

mov eax, 4
    mov ebx, 1
    mov ecx, space
    mov edx, spaceLen
    int 80h
dec dl
    jmp innerloop1

printStar:
mov eax, 4
    mov ebx, 1
    mov ecx, star
    mov edx, starLen
    int 80h

innerloop2: ;;for(k=0;k<(2*i)-1;k++)
mov al, [i]
mul byte [two]
dec al
cmp byte [k], al
jge printMe

mov eax, 4
    mov ebx, 1
    mov ecx, space
    mov edx, spaceLen
    int 80h

    inc byte [k]
    jmp innerloop2

printMe:
mov eax, 4
    mov ebx, 1
    mov ecx, star
    mov edx, starLen
    int 80h

    mov eax, 4
    mov ebx, 1
    mov ecx, newLine
    mov edx, newLineLen
    int 80h

    inc byte [i]
    jmp outerloop

    printSpace:
mov eax, 4
    mov ebx, 1
    mov ecx, space
    mov edx, spaceLen
    int 80h

您的代码中有很多低效率的地方,可以更清楚,简洁地编写它。 但是,我将仅解决引起功能问题的区域。

innerloop1有两个问题。 您每次通过循环都在修改[num] 相反,您想在循环之前作为j的初始化器执行此操作。 其次,您希望通过执行循环来保持dl的值不变,但是mov edx, spaceLen破坏它,就像对int 80h的调用一样。 因此,您可以通过以下方式纠正它:

    mov dl, [num]       ; INITIALIZE j=n-i
    sub dl, byte [i]
innerloop1: ;;for(j=n-i;j>0;j--)
                        ; REMOVED modification of 'num' here
    mov byte [j], dl
    cmp byte [j], 0
    jle printStar

    mov eax, 4
    mov ebx, 1
    mov ecx, space
    push dx             ; SAVE dx
    mov edx, spaceLen
    int 80h
    pop dx              ; RESTORE dx
    dec dl
    jmp innerloop1

在您的第二个内部循环( innerloop2 )中,您每次进入循环时都依赖于k的预初始化值,该值在第一次遇到循环后不再有效。因此,您每次都必须对其进行初始化:

    mov byte [k], 0   ; INITIALIZE k=0
innerloop2: ;;for(k=0;k<(2*i)-1;k++)
    mov al, [i]
    mul byte [two]
    dec al
    cmp byte [k], al
    jge printMe

所有这些使代码正常工作。 一些其他评论:

  • 您在计数寄存器的值时需要谨慎,并注意它们可能在何处被更改
  • 您可能不应该依赖预初始化的声明来初始化循环变量或其他可能与此相关的数据。 如果要定期更改代码中的值,通常是一个好习惯
  • 既然基本可以正常工作,请考虑如何优化代码(使其更加简洁明了)。
  • 在变量用法上更加一致。 您的asm程序使用num表示n但还定义了一个值n ,这有点令人困惑。
  • 代码缩进和间距保持一致。 这将使它更容易阅读。
  • 在进行构造(例如for循环)时,请尝试保持每次执行时的一致方法。 它将减少出错的机会。 例如,以相同或相似的方式管理循环变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM