[Assembler] Wraca do poczatku programu

0

Witam, chcialem napisac programik, ktory wykona serie czynnosci i konczy prace, tzn zostawia wartosci i nic nie robi, jednak z niewiadomych mi przyczyn wraca on do poczatku programu i caly sie loopuje. Moglby ktos zerknac?

ZLICZ:
	mov a, #0
	loop:
	 call zamien
	 inc a
	cjne a,p1,loop

zamien:
	mov r0, a
	JZ ZERO			
	DEC A			
	JZ JEDEN		
	DEC A			
	JZ DWA			
	DEC A			
	JZ TRZY
	DEC A
	JZ CZTERY
	DEC A
	JZ PIEC
	DEC A
	JZ SZESC
	DEC A
	JZ SIEDEM
	DEC A
	JZ OSIEM
	mov a, r0
	RET
	
zero:
	mov p0,#00111111b
	mov a, r0
	ret 
jeden:
	mov p0,#00000110b
	mov a, r0
	ret
dwa:
	mov p0,#01011011b
	mov a, r0
	ret
trzy:
	mov p0,#01001111b
	mov a, r0
	ret
cztery:
	mov p0,#01100110b
	mov a, r0
	ret
piec:
	mov p0,#01101101b
	mov a, r0
	ret
szesc:
	mov p0,#01111101b
	mov a, r0
	ret
siedem:
	mov p0,#00000111b
	mov a, r0
	ret
osiem:
	mov p0,#01111111b
	mov a, r0
	ret

END

Dodam ze na p1 wprowadzilem 001, a po przejsciu przez instrukcje "cztery" wraca do poczatku;/ a dodatkowo wykonuje sie kilka razy ta petla, a potem wartosc na p0 staje na 101

Dzieki za pomoc

0
        mov a, #0

Zapomniałeś napisać, na jaki to procesor kod jest.

0

@up: na 80515.

Dla mnie tam gdzies musisz zmieniac wartosc tego ( a ), poniewaz teoretycznie, jesli dajesz na poczatku 0 i zwiekszasz o jeden to skok ten z porownaniem sie wykona, ale dla nastepnego juz nie powinien, poniewaz warunek nie zostanie spelniony.
Niewiem tez jak jest z ta etykieta ( loop ), poniewaz na x86 nie mozesz tego uzyc jako etykiety, bo to jest petla, ale to juz inna sprawa.

Kolejna, ze zamiast ret w tych jeden, dwa... powinienes dac jmp, albo jak chcesz ret wywolywac call'em te instrukcje, poniewaz jesli tam skaczesz to wroci Ci do ostatniego calla, czyli w miejsce wywolania tego kodu, tego miejsca nie widac na zalaczonym przykladzie, ale mam nadzieje, ze wiesz o co mi chodzi.

0

Namnieszalem z tym ret, poniewaz w kod nie patrzylem jak pisalem posta, ale dobra chodzi o to, ze w procedurze zamien skaczesz do jeden, dwa, trzy, cztery, itd. a jak tam skoczysz gdzies jmp i wywolasz dalej ret to wroci do miejsca wywolania procki zamien, a nie do procki zamien, bo niby dlaczego ret mialoby wracac do miejsca z ktorego skakales skoro jmp nie umieszcza na stosie adresu powrotnegom chyba ze znaczne roznice sa pomiedzy asmem na to, a na x86, ale to sam ocen.

0

Miałem troche styczności z 8051/8052 i tak jak juz napisano:
Nie mozesz robic ret po jmp! Taki skok nie odłoży na stos adresu powrotu! Musisz tutaj użyć ACALL (tak sie to nazywa w 8051) albo podobnej instrukcji pod twoim asemblerem.

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