3

次の出力を取得する必要があります。

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

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ループを実行するために必要であると言われましたが、たとえば、関数で外側のループを呼び出す必要がある理由がわかりません。

pushとの組み合わせが見つかりませんでしpopた。私は常に多くの星を獲得するか、1 行に 1 つの星を獲得するか、または 1 つだけの星を獲得します。

私は文字通り、どのビットを変更して同じままにしているのか困惑しています。必要な出力を得ることができましたが、増加することはありませんでした。

星 10 個から星 1 個まで出力を得ることができましたが、望んだ結果にはなりませんでした。

私は何を間違っていますか?この質問はどうすればいいですか?

4

2 に答える 2