Попытка напечатать звездный треугольник в сборке - PullRequest
0 голосов
/ 11 октября 2019
section .data
        star db '*'
        num db '1'
        endl db 10
        line db '1'
    section .text
     global _start

    _start:

    Star:
        mov edx,1           ;using 1 byte as appropriate
        mov ecx,star        ;;moving num into ecx to print the star
        mov ebx,1           ;;_STDOUT
        mov eax,4           ;;SYS_WRITE
        int 80h

         inc byte [num];num= 2

        mov al, [line];al=1
        mov bl, [num];bl=1
        cmp al,bl
        je Star;always false



        jmp PrintLine
      ;loop

    PrintLine:

        mov edx,1;using 1 byte as appropriate
        mov ecx,endl ;;moving num into ecx to print the star
        mov ebx,1  ;;_STDOUT
        mov eax,4  ;;SYS_WRITE
        int 80h

        inc byte [line] ;2
        cmp byte[line] , '9' ;comparing 2 to 9

        jl Star

    end:
    mov eax,1 ; The system call for exit (sys_exit)
    mov ebx,0 ; Exit with return code of 0 (no error)
    int 80h;

результат для этого кода - просто одиночные звезды в 9 строках, но я не могу понять, как увеличить количество звездочек по мере увеличения числовой строки. ПОЖАЛУЙСТА ПОМОГИ. Я использовал две петли, где одна петля находится внутри другой. И увеличивать, если прыжок не проходит или проходит. Один цикл используется для печати звездочек, а другой - для печати следующей строки. Я выписал логику несколько раз, и логически она, кажется, работает, но я не могу понять синтаксис и размещение кода

1 Ответ

1 голос
/ 11 октября 2019

Мне нравится разбивать каждую часть на шаги. Начнем с того, что я бы не использовал память для переменных. Как указывает Питер, по-прежнему доступны esi и edi.

_start:

    mov esi, 0 ; line counter
    mov edi, 0 ; star counter

Основная задача циклов - в основном проверить, достигли ли мы 9 строк, и выйти, если так. Если нет, нам нужно напечатать несколько звездочек:

main_loop:

    inc esi
    cmp esi, 9
    jg end ; have we hit 9 lines?

    ; print 1 whole line of stars
    call print_line

    jmp main_loop

Теперь нам нужно распечатать строку звездочек:

print_line:

    mov edi, 0; we've printed no stars yet, this is a new line

printline_loop:

    call print_star ; print a single star character
    inc edi ; increment the number of stars we've printed
    ; have we printed the same number of stars as we have lines?
    cmp edi, esi
    jne printline_loop
    call print_eol

    ret

Чтобы закончить, окончательный набор отдельных подпрограммчтобы напечатать звезду или символ новой строки:

print_star:

    mov edx, 1
    mov ecx, star
    mov ebx, 1
    mov eax, 4
    int 80h

    ret

print_eol:

    mov edx, 1
    mov ecx, endl
    mov ebx, 1
    mov eax, 4
    int 80h

    ret

end:

    mov eax, 1
    mov ebx, 0
    int 80h

Здесь он работает с IDEOne

Вывод:

*
**
***
****
*****
******
*******
********
*********
...