logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega][asm] Dziwne zachowanie się instrukcji RET.

pawelC51 25 Lut 2010 22:03 1425 3
REKLAMA
  • #1 7751010
    pawelC51
    Poziom 12  
    Witam.
    Piszę pewien prosty programik który realizuje pewną funkcję. Niestety podczas działania programu napotkałem na mały problem, a mianowicie procedura powrotu z podprogramu RET. Podczas działania programu, a dokładniej przy powrocie z podprogramu skok nie następuje tam gdzie powinien, ignoruje wszystko i idzie na sam początek programu. Napisałem malutki programik do sprawdzenia instrukcji RET.
    Małe rozczarowanie i znowu tak samo, czyli znowu wykonywanie programu od początku. Czy może ktoś wyjaśnić mi, jak działa instrukcja RET?

    PS. Miałem trochę do czynienia z 8051, ale AVR to trochę inna bajka.

    Paweł.[/img]
  • REKLAMA
  • #2 7751020
    grysek
    Poziom 19  
    Brak inicjacji stosu. Może pokaż kod :P
  • REKLAMA
  • #3 7751038
    mateusz1313
    Poziom 10  
    Może problem z długością stosu bez kodu trudno co kolwiek powiedzieć
  • #4 7751107
    pawelC51
    Poziom 12  
    Ten krótszy programik nic specjalnego.
    
    ; Zapalanie diody  LED
    
    .INCLUDE "m8def.inc"
    ;.INCLUDE "czekaj_ms.inc"
    ;.EQU SYS_FREQ	= 1		; czŕstotliwoťŠ pracy w MHz (dla opˇčnie˝	
    
    ;inicjacja stosu
    LDI R16, HIGH (RAMEND)
    OUT SPH, R16
    LDI R16, LOW (RAMEND)
    OUT SPL, R16
    
    	ldi	R25, 0x01
    	out	DDRB, R25	
    Petla:
    
    	ldi	R16, 0
    	ldi	R17, 2
    
    	ldi	R25, 0b00000001
    	out	PORTB, R25		
    
    
    	ldi	R25, 0b00000000
    	out	PORTB, R25		
    
    	rjmp proc
    ;	rcall proc
    bo:	
    	ldi	R18, 10
    	rjmp	Petla
    
    proc:
    	push R14
    	push R13
    	ldi   R18, 1
    	clr  R13
    	clr  R14
    	pop  R13
    	pop  R14
    	ret
    
    	rjmp bo
    
    Petla1:
    	rjmp	Petla1			; petla nieskonczona
    
    
    
    


    Dodano po 15 [minuty]:

    Rozwiązałem problem. Nie odznaczyłem procedury wywołującej podprogram. Wchodziłem poleceniem rjmp proc a powinno być rcall proc.
    Przepraszam za zamieszanie. Ale siedzę nad pewną rzeczą już 6 godzin i dostaję oczopląsu.
REKLAMA