[英]multiplying two 32-Bit Numbers and printing the 64 bit result as decimal NASM assembly
[英]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
所有这些使代码正常工作。 一些其他评论:
num
表示n
但还定义了一个值n
,这有点令人困惑。 for
循环)时,请尝试保持每次执行时的一致方法。 它将减少出错的机会。 例如,以相同或相似的方式管理循环变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.