0

编辑:这个问题已经解决了。非常感谢 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
4

1 回答 1

1

您的代码中有很多效率低下的地方,它可以写得更清楚、更简洁。但是,我将只解决导致功能问题的区域。

有几个问题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循环之类的构造时,请尝试保持每次执行它们的一致方法。它将减少出错的机会。例如,以相同或相似的方式管理循环变量。
于 2013-08-10T14:10:02.770 回答