Assembler NASM - nie działająca pętla

0
extern printf
extern scanf
section .text
global main

main:

mov rdi, format
mov rsi, liczba
mov rax, 0
call scanf

mov r8, [liczba]
mov r9, [liczba]
inc r8
petla1:
	dec r8
	cmp r8, 0
	je koniec
	petla2:
		cmp r9, 0
		je petla1

		dec r9

		mov rdi, napis
		mov rax, 0
		call printf

		jmp petla2

koniec:
mov rax, 0
ret

section .data
liczba dq 0
format db "%d", 0
napis db "*",0

Witajcie
Mam problem z wyżej pokazanym kodem. Rozwiązuję takie zadanie : * Napisz program, który narysuje kwadrat z gwiazdek (*) o wczytanej z klawiatury długości boku *
Otóż program się kompiluje, nawet nie wywala błędu przy wprowadzeniu liczby, ale zaraz po niej wyprowadza tylko jedną * zamiast całego kwadratu pomimo pętli.
Gdzie tu błąd?

0

Tak na szybko zrobiłbym to tak:

global _main
extern _printf
extern _scanf

section .data
format db "%d", 0
char db "*", 0
question db "Give me a height: ", 0
newline db 0dh, 0ah, 0

section .bss
number resd 1    

section .text
_main:
    mov ebp, esp
    
    push question
    call _printf
    
    push number
    push format
    call _scanf
    add esp, 12

    xor ecx, ecx
    xor ebx, ebx

_loop:
    push ecx ;należy odłożyć ecx na stos, bo wywołanie funkcji niszczy zawartość tego rejestru

    _inner_loop:   
        call _print
        inc ebx ;ebx nie trzeba odkładać, bo nie jest niszczony
        
        cmp ebx, dword[number]
        jne _inner_loop           
        
    xor ebx, ebx
    call _print_newline
    pop ecx ;podnosimy ecx ze stosu
    inc ecx ;inkrementujemy
    
    cmp ecx, dword[number]
    jne _loop
    je _ending
    
_print:
    push char
    call _printf
    add esp, 4
    ret      

_print_newline:
    push newline
    call _printf
    add esp, 4
    ret 
    
_ending:
    xor eax, eax
    ret

Musisz odkładać na stos argumenty funkcji _printf i _scanf żeby to zadziałało, zamiast odkładać je do rejestrów.

PS: nie pamiętam już jakie rejestry nie są niszczone w wyniku wywołania funkcji ale pewnie pushowanie ecx dałoby się czymś zastąpić. Niemniej jednak - działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1