Petla wykonywana n-razy

0

Program: Podajemy liczbę i ma tyle razy ją wyświetlić
Wynikiem działa programu jest wyświetlenie ok. 260 razy liczby 2 (bo taką podałem na starcie programu).
Pętla jest ok bo jak jak przed nią dam mov esi, 3 to ładnie 3 razy wyświetli wiec problem musi być przy "zamienianiu tekstu na liczbę"(sub esi,48).

NASM

section .text
global _start

_start:
	mov	eax, 4
	mov	ebx, 1
	mov ecx, text
	mov	edx, [d_text]
	int 80h
	
	mov	eax, 3
	mov	ebx, 0
	mov ecx, ile
	mov	edx, [d_ile]
	int 80h
	
	mov esi, [ile]
	sub esi,48	
	
_petla:
	cmp esi, 0
	je _koniec
	
	mov eax, 4
	mov ebx, 1
	mov ecx, ile
	mov edx, [d_ile]
	int 80h
	dec esi
	jmp _petla

_koniec:
	mov eax, 1
	int 80h


section .data
text	db	"Ile razy: "
d_text	dd	$ - text

ile	db	0
d_ile	dd	$ - ile
1
  1. Ale że co? Rozumiesz chyba że to twoje zamienianie działa tylko an CYFR? Dla wartości 0-9? jak ktoś poda 10 to juz nie zadziała?
  2. Za pisanie gołych liczb typu 48 powinni ucinać palce. Nie da sie napisać '0'? o_O
  3. A jeśli wyzerujesz esi przed przypisaniem? Poza ty masz tu niezgodność rozmiarów operandów. Masz zmienną db która ma 1 bajt a przypisujesz do rejestru esi który ma bajtów 4...
0

Ad1 Dokładnie tak, tylko zakres 0-9
Ad2 Czyli tak na prawdę odejmuje 0?
Ad3 Czyli chodzi o to że mam 4 bajty i mogą tam być śmieci a ja nadpisuje tylko jeden bajt - i z tego wniosek żeby wyzerować? (xor esi,esi tak?)

xor esi,esi
mov esi, [ile]
sub esi,'0' ;?
0

Udało się!! Ale mam pytanko. Bo teraz mi wyświetla w kolumnie, a ja bym chciał żeby wyświetlało ale w linii. Pewnie ten znak końca lini został wczytany podczas wczytywania zmiennej i niezbyt wiem jak go usunąć.

section .text
global _start

_start:
	mov	eax, 4
	mov	ebx, 1
	mov ecx, text
	mov	edx, [d_text]
	int 80h
	
	mov	eax, 3
	mov	ebx, 0
	mov ecx, ile
	mov	edx, [d_ile]
	int 80h
	
	xor esi,esi
	mov sil, [ile]
	sub esi, 48
	
_petla:
	cmp esi, 0
	je _koniec
	
	mov eax, 4
	mov ebx, 1
	mov ecx, ile
	mov edx, [d_ile]
	int 80h
	dec esi
	jmp _petla

_koniec:
	mov eax, 1
	int 80h


section .data
text	db	"Ile razy: "
d_text	dd	$ - text

ile	dd	000
d_ile	dd	$ - ile
0

Ciekawe jak i gdzie ten znak nowej linii miałby się wczytać skoro masz pamięć na JEDEN BAJT. Tam sie NIC WIĘCEJ nie zmieści. Ja bym jednak obstawiał że pisanie do stdout za pomocą int 80h daje taki efekt. Zresztą gdybyś rozumiał kod który wstawiasz to wiedziałbyś że wczytujesz tylko jeden bajt a reszta zostaje w buforze klawiatury, w tym i znak nowej linii.

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