Pętla wyświetlająca luczby z przedziału od 0 do 9

0

Witam, chciałem stworzyć pętle w asemblerze (linux,nasm), która powinna obrócić sie 10 razy i wyświetlić cyfry 0-9, niestety nie chce zadziałać i nie rozumiem dlaczego :

section .txt
global _start

_start:
xor esi,esi

_wyswietl:
cmp esi,10
ja _end
mov eax,4
mov ebx,1
mov ecx, esi
mov edx,1
jmp _wyswietl
_end:
mov eax,1
int 80h

section .data
0
  1. Nigdy się nie kończy bo nigdzie nie inkrementujesz rejestru esi...
  2. Nic nie wypisuje bo nie wołasz nigdzie przerwania z wypisywaniem czegokolwiek...
0

Fakt, przepisując zgubiłem inkrementacje.
W jaki sposób powinienem uzupełnić to aby zadziałało? Co dokładnie dodać?

Sory za podwójnego ale tak wygląda końcowy efekt, mimo to i tak nie działa :
section .text
global _start

_start:
     xor esi,esi
_ccout:
     cmp esi,10
     jnl _end
     inc esi
     mov eax,4
     mov ebx,1
     mov ecx,esi
     mov edx,2
     int 80h

     jmp _ccout
     _end:
     mov eax,1
     int 80h

section .data
0

Bo ty wypisujesz znaki z początku tabeli ascii, czyli te niewiczoczne

0

Czyli liczby zaczynają się od 48, więc do esi powinienem dodać 48?? Próbowałem wstawiać linijkę

add esi,48

zaraz po ja, próbowałem również na samym początku dodać do esi 48 a później tam jak jest cmp esi,58

 też nie zadziałało
0

tak, ale pamiętaj że operujesz na cyfrach szesnastkowych (czyli 0 to 30h), moment, też asma sie ucze i próbuje to u siebie wykodować ( ale najpierw kanapki wszamie ) :p

0

Zamiast zerować rejestr xor esi,esi po prostu zacznij od 48 mov esi,48

Jeśli dodawanie wstawiłeś wewnątrz pętli to za pierwszym razem miałbyś 0, za drugim 48, za trzecim 96.. chyba nie o to chodzi.

0

W dalszym ciągu nic sie nie wyświetla.

0

Troche sie pod pytanie podepnie, nie rozumiem dlaczego przed sciągnienciem ze stosu rej. ecx odejmujemy od eax 48, potem inkrementujemy i dodajemy '0' do eax

kod z tej strony
http://www.tutorialspoint.com/assembly_programming/assembly_loops.htm

section	.text
    global _start         ;must be declared for using gcc
_start:	                ;tell linker entry point
	mov ecx,10
	mov eax, '1'
	
l1:
	mov [num], eax
	mov eax, 4
	mov ebx, 1
	push ecx
	mov ecx, num        
        mov edx, 1        
        int 0x80
	mov eax, [num]
	sub eax, '0' ;tu
	inc eax        ;tu
	add eax, '0' ;i tu
	pop ecx
	loop l1
	mov eax,1       ;system call number (sys_exit)
	int 0x80        ;call kernel
section	.bss
num resb 1
0

Wiem o pętli loop ale musze chciałem napisać pętle własnoręcznie i nie chce działać z niewiadomych przyczyn

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