Мне нравится разбивать каждую часть на шаги. Начнем с того, что я бы не использовал память для переменных. Как указывает Питер, по-прежнему доступны 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
Вывод:
*
**
***
****
*****
******
*******
********
*********