Rcall ,Rjmp

Başlatan james, 02 Aralık 2003, 22:01:11

james

yazdığım programda rcall veya rjmp ile çağırdığım alt programdan ret ile döndüğümde program kaldığı yerden

devam etmiyor.sürekli org 0 a gidiyor.bunu avrstudioda similasyon yaparak gördüm.AT90S8515 kullanıyorum.neden olabilir bu?
ARAMIYORUM , BULUYORUM

bmutlu

RJMP ve RCALL işleminde sınırda bir noktada (aşağıdaki sınırlar içinde) işlem yapabilirsin JMP ve CALL yaptığın adres

aşağıdaki belirtilen sınırlar içinde olmayabilir ve ASM derleyicisi bunu sana derleme esnasında uyarı olarak vermemiş olabilir veya Stack Pointer in kullandığı sram bölgesini kullanıyor olabilirsin ve

bundan da kaynaklanabilir. Programını görmedigim için fazla yorum yapamayacağım.
(Program execution continues at address PC + k + 1. The relative address k is -2048 to 2047.) kataloktan

alındı.

james

avrstudio nun içindeki örnek programlarda da aynı şey oluyor.benim programla alakalı birşey değil bu. galiba avrstudio dan

kaynaklanıyor.
ARAMIYORUM , BULUYORUM

bmutlu

Programı entegre üzerinde denedin mi ? Bir de proteusta devre kurarak dene.

DumrulBey

Alıntı yapılan: "james"yazdığım programda rcall veya rjmp ile çağırdığım alt programdan ret ile

döndüğümde program kaldığı yerden devam etmiyor.sürekli org 0 a gidiyor.bunu avrstudioda similasyon yaparak gördüm.AT90S8515 kullanıyorum.neden olabilir

bu?
Arkadaşım yığındaki (stack) dönüş adresi dallandığın alt program (subroutine) içinde kayboluyor olabilir. Dallanmadan önce PUSH, dönmeden önce POP komutlarını

kullan istersen. Aynı PIC'de kesme (interrupt) kullanırken yaptığımız gibi.

Kolay gelsin...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

es-es

rcall komutunda stack değeri 2 byte eksltiğinden ret komutu ile stack tekrar eski haline alınır   ama rjmp komutu sadece

dallanma yapar o yüzden peşine ret komutunu kullandığından stack taşacağı için 0h adresine döner

DumrulBey

Alıntı yapılan: "es-es"rcall komutunda stack değeri 2 byte eksltiğinden ret komutu ile stack

tekrar eski haline alınır   ama rjmp komutu sadece dallanma yapar o yüzden peşine ret komutunu kullandığından stack taşacağı için 0h adresine döner
Arkadaşım emin

misin? Her iki komutta aynı derecede yığını (stack) kullanıyor. Şimdi bir tane data sheet inceledim ikisi de PC + k + 1 bit kadar yer işgal ediyor. (bkz. Relative Program Addressing, RJMP and

RCALL)

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

james

ok arkadaşlar sorunu halletim.stack pointerı initialize etmek gerekiyormuş.yani top of stack adresi olarak SP ye 025F

yazdım.bu adres internal sramin bitiş adresi.yalnız o kadar örnek inceledim hiç birinde böyle bir şey yapıldığını görmedim.ilginç...
ARAMIYORUM , BULUYORUM