Я пытаюсь написать ассемблер для печати ascii '*' в порядке возрастания за 9 шагов. :
*
**
***
****
*****
******
*******
********
Я написал циклы, основанные на том, как я буду действовать в C ++. Я основал этот код на цикле while. Я думаю, что застревает на чем-то меньшем и большем, чем в «печати». Неправильно ли сравниваются мои переменные x и y (т. Е. Должен ли я перемещать их в регистры другим способом)? Я пробовал много разных твиков, но все равно не повезло. Я не могу использовать ничего, кроме прыжков.
;nasm 2.11.08
section .data
x db '2' ; int x = 2
y db '0' ; int y = 0
star db '*'
endl db 0xa
section .text
global _start
_start:
begin:
mov byte [x], '0'
cmp byte [y], '9'
jl print
je end
print:
mov ebx, [x]
mov ecx, [y]
cmp ebx, ecx
jl print2
mov eax,4
mov ebx,1
mov ecx,endl
mov edx,1
int 80h
inc byte [y]
jmp begin
print2:
mov eax,4
mov ebx,1
mov ecx,star
mov edx,1
int 80h
inc byte [x]
mov ebx, [x]
mov ecx, [y]
cmp ecx, ebx
jg begin
jmp print
end:
mov eax,1 ; The system call for exit (sys_exit)
mov ebx,0 ; Exit with return code of 0 (no error)
int 80h;
Не уверен, куда идти отсюда, хотелось бы получить рекомендации.
Обновление: так что я понял это благодаря некоторой помощи @PeterCordes
section .text
global _start
_start:
starts:
mov ecx, star ;
mov edx, 1 ;;
mov ebx, 1 ;;; Print *
mov eax, 4 ;;
int 0x80 ;
inc byte [x] ; add 1 to x
movzx cx, byte [y] ; mov the
cmp byte [x], cl ; check to see if x is less than y
jle starts ; x > y jump to top
mov ecx, endl ;
mov edx, 1 ;;
mov ebx, 1 ;;; Print \n
mov eax, 4 ;;
int 0x80 ;
mov [x], byte '0' ; reset x
inc byte [y] ; add 1 to y
cmp byte [y], '9' ; check to see if y is still less than 9
jl starts ; y > 9 jump to top
end:
mov eax, 1
int 0x80
section .data
x db '0' ; number of * per line
y db '0' ; number of lines
star db '*'
endl db 0xa