Aktualności: C64 Power - online od stycznia 2000 !

Autor Wątek: Asembler 6502 - Skoki i znacznik na stosie dla RTS  (Przeczytany 172 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline siudym

  • Level 1
  • *
  • Wiadomości: 22
Asembler 6502 - Skoki i znacznik na stosie dla RTS
« dnia: 25 Marzec 2019, 08:49 »
Niestety będąc zawsze głąbem z matmy mam zawsze jakieś zagwosdki związane z asemblerem. Zastanawia mnie zasada działania skoku długiego JSR i powrotu RTS. Wiem, że wykonując skok na stos leci adres powrotu dla RTS, ale nie wiem czy gdy w między czasie wystąpi jakiś inny JSR/RTS w środku danego skoku, to czy adres powrotu jest "nadpisany" ?

Cytuj
How JSR and RTS work. When you call a subroutine using JSR, two things happen:

the address of the last byte of the JSR (that is, the next instruction minus 1) is pushed onto the stack
the program counter jumps to the subroutine indicated.
When the program encounters an RTS instruction, this happens:

an address is popped off the stack.
the program counter jumps to this address + 1

Pytanie zobrazowane na tym obrazku:

https://postimg.cc/218czvpJ

W pętli pseudo-nieskończonej mam skok JSR Kod1, w którym jest kolejny skok JSR SkaczeZarazWracam, potem mamy sprawdzenie pewnej zmiennej, porównanie i skok krótki BEQ. Gdy on się wykona czyli SkoczCosZmien na koncu mam RTS, który nie zadziała z BEQ, bo ten skok nie działa w parze z RTS.
Pytanie gdzie wróci RTS po wykonaniu się tego Skoku BEQ ? Jaki adres powrotu będzie na stosie? Bo nie czaje czy na stosie zapamiętany dalej jest adres powrotu JSR Kod1, który przecież ma "w sobie" skok JSR SkaczeZarazWracam i jego RTS jakby zakończył swoje zadanie czyli wrocił w miejsce JSR. Czy teraz JSR Kod1 dalej ma swój adres na stosie dla "swojego" RTS ? Wtedy rozumiem, że RTS będące na koncu SkoczCosZmien wykona powrót na adres zostawiony przez JSR Kod1. ? :)

Wiem, że namieszane.



Offline wegi

  • Level 7
  • *******
  • Wiadomości: 2588
Re: Asembler 6502 - Skoki i znacznik na stosie dla RTS
« Odpowiedź #1 dnia: 25 Marzec 2019, 08:58 »
ZAWSZE JSR zmniejszy wskaźnik stosu o 2 i odłoży adres powrotu-1.
Po beq nic na stosie się nie odkłada ani nie zmienia się wskaźnik stosu.
Więc po beq w końcu i tak wykonasz rts, które zdejmie ze stosu adres powrotu i zmniejszy o 2 wskaźnik stosu.
Polecam VICE monitor, breakpointy i praca krokowa.
Gdy po wynalezieniu komputera kwantowego jedni pytali o sposób wytwarzania prądu, kisiel pytał jak wytwarzać świeczki...

NIECH NIE BĘDZIE NICZEGO !!!

CZY RAF PIŁ Z JERICHA KUBECZKA ???

Offline siudym

  • Level 1
  • *
  • Wiadomości: 22
Re: Asembler 6502 - Skoki i znacznik na stosie dla RTS
« Odpowiedź #2 dnia: 25 Marzec 2019, 09:03 »
Czyli chyba wszystko jasne:







Ale jeszcze jedno zwiazane z powyzszym pytaniem:

Mamy kawalek tego kodu z obrazka,
gdy lda pozycja ma wartosc hex 33
skok beq wykona sie zrobic SkoczCosZmien
tam jest RTS ale nie wroci juz "za" BEQ wykonac
kod opisany ";jakis kod" bo RTS nie wroci tu.

Cytuj
Kod1:

   jsr SkaczeZarazWracam

   lda pozycja
   cmp #$33
   beq SkoczCosZmien

   ;jakis kod

   RTS

Aby zrobic to tak, aby po powrocie z SkoczCosZmien
wykonal sie dalej kod ";jakis kod" mozna zrobic tak:
wtedy gdy nie bedzie #$33 w pozycja SkoczCosZmien
pominie sie wykonujac ";jakis kod" a nawet jak 33
bedzie zgadzac sie, to nizej JSR wykona sie i wroci
wykonac nizej ";jakis kod"

Cytuj
Kod1:

   jsr SkaczeZarazWracam

   lda pozycja
   cmp #$33
   bne Kod1_Skip

   jsr SkoczCosZmien

   Kod1_Skip:

   ;jakis kod

   RTS

;---------

SkoczCosZmien:

   ;cow wyliczam

   RTS

Czy robie to poprawnie czy mozna jakos inaczej taka
sytuacje ogarnac?
« Ostatnia zmiana: 25 Marzec 2019, 09:05 wysłana przez siudym »

Offline wegi

  • Level 7
  • *******
  • Wiadomości: 2588
Re: Asembler 6502 - Skoki i znacznik na stosie dla RTS
« Odpowiedź #3 dnia: 25 Marzec 2019, 09:18 »

Kod1:

   jsr SkaczeZarazWracam

   lda pozycja
   cmp #$33
   bne Kod1_Skip

   jsr SkoczCosZmien

   Kod1_Skip:

   ;jakis kod

   RTS

;---------

SkoczCosZmien:

   ;cow wyliczam

   RTS



w tym wypadku skok WARUNKOWY pozwoli ominąć (moze pozwolic w zaleznosci od wartosc w ACC)
   jsr SkoczCosZmien

(tym samym nie odłoży się nic na stos i nic nie trzeba z niego zdejmowac)

  Kod1_Skip:
wykona się zawsze


« Ostatnia zmiana: 25 Marzec 2019, 09:21 wysłana przez wegi »
Gdy po wynalezieniu komputera kwantowego jedni pytali o sposób wytwarzania prądu, kisiel pytał jak wytwarzać świeczki...

NIECH NIE BĘDZIE NICZEGO !!!

CZY RAF PIŁ Z JERICHA KUBECZKA ???