assembly - 如何在 assembly 中打印星形三角形?

标签 assembly nasm x86-64 yasm

我需要获得以下输出:

*
**
***
****
*****
******
*******
********
*********
**********

所以它有 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

我试了又试,但我无法得到我需要得到的东西。

由于所有这些pushpop,我似乎无法找到一种方法将行与星线分开。

说实话,我不太明白这些。有人告诉我,执行循环需要它们,但我不确定为什么,例如,在函数 star 中,我需要调用外循环。

我找不到任何有效的 pushpop 组合。我不断地得到很多星星或每行一颗星星或只有一颗星星。

我真的很困惑我要改变哪些部分并保持不变。我能够获得所需的输出,但输出永远不会停止增加。

我能够获得从 10 星开始一直到 1 星的输出,但从来都不是我想要的。

我做错了什么?这道题该怎么做?

最佳答案

您的第一行有 10 颗星,因为您在内部循环中使用了 [trianglerows]。我确定您打算使用 [trianglesize] (目前您在任何地方都没有使用)。然后在 down_triangle 中,您需要再次增加 [trianglesize] 而不是 [trianglerows]。最后,您可能希望 [trianglesize] 从 1 而不是 0 开始,即第一行有 1 颗星。

此外,请务必按照 Michael Petch 在下面的评论中所述更正您的内存使用情况,否则您的变量将被损坏,因为它们共享相同的内存。

关于assembly - 如何在 assembly 中打印星形三角形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49342767/

相关文章:

assembly - 在 DDD 中解释 eFlags

c - 逆向汇编 x86 的工程片段?

linux - Hello World 程序 Nasm 汇编和 C 的执行指令数不同

assembly - 如何在屏幕上显示一个数字并使用 DOS x86 程序集休眠一秒钟?

linux - 多次读取后结果错误

汇编-x86调用指令和内存地址?

68HC11计算sin(x)的汇编代码

c++ - 如何从 Windows x64 的汇编程序访问 C 数组?

assembly - 确定汇编中的 32/64 位架构

c - C/x64 ASM 中的实用定界延续