我需要获得以下输出:
*
**
***
****
*****
******
*******
********
*********
**********
所以它有 10 行,我的星星将从 1 开始,到 10。
目前我得到:
**********
***********
************
*************
**************
***************
****************
*****************
******************
*******************
********************
我的代码:
section .data
char db ' '
trianglesize db 0; ;stars per line
trianglerows db 10;
section .text
global _start
_start
mov rax, [trianglerows] ;rows
outer_loop:
mov rbx, [trianglerows]
inner_loop:
call star
dec bx
cmp bx,0
jg inner_loop
call newline
call down_triangle
dec ax
cmp ax, 0
jne outer_loop
call newline
call exit
exit:
mov eax,1 ;sys_exit
mov ebx,0 ;return 0
int 80h;
ret
newline:
mov [char],byte 10
push rax;
push rbx;
mov eax,4; ;sys_write
mov ebx,1; ;stdout
mov ecx, char;
mov edx,1; ;size of new line
int 80h
pop rbx;
pop rax;
ret
star:
mov [char], byte '*';
push rax;
push rbx;
mov eax,4; ;sys_write
mov ebx,1; ;stdout
mov ecx, char;
mov edx,1;
int 80h;
pop rbx;
pop rax;
ret
down_triangle:
push rax;
push rbx;
mov rax, [trianglerows]
inc ax
mov [trianglerows],rax
pop rbx
pop rax
ret
我试了又试,但我无法得到我需要得到的东西。
由于所有这些push
和pop
,我似乎无法找到一种方法将行与星线分开。
说实话,我不太明白这些。有人告诉我,执行循环需要它们,但我不确定为什么,例如,在函数 star
中,我需要调用外循环。
我找不到任何有效的 push
和 pop
组合。我不断地得到很多星星或每行一颗星星或只有一颗星星。
我真的很困惑我要改变哪些部分并保持不变。我能够获得所需的输出,但输出永远不会停止增加。
我能够获得从 10 星开始一直到 1 星的输出,但从来都不是我想要的。
我做错了什么?这道题该怎么做?
最佳答案
您的第一行有 10 颗星,因为您在内部循环中使用了 [trianglerows]
。我确定您打算使用 [trianglesize]
(目前您在任何地方都没有使用)。然后在 down_triangle
中,您需要再次增加 [trianglesize]
而不是 [trianglerows]
。最后,您可能希望 [trianglesize]
从 1 而不是 0 开始,即第一行有 1 颗星。
此外,请务必按照 Michael Petch 在下面的评论中所述更正您的内存使用情况,否则您的变量将被损坏,因为它们共享相同的内存。
关于assembly - 如何在 assembly 中打印星形三角形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49342767/