Seite 1 von 1

RET nur ein vom CALL Modifizierter JMP

Verfasst: Sa 14. Feb 2015, 09:35
von PIC18F2550
Bei meinem Versuch den CODE des propellers besser zu verstehen zeigen sich seltsame ergebnisse.

Ist der RET nur ein vom CALL Modifizierter JMP ?

Code: Alles auswählen

010111 000i 1111 --------- sssssssss JMP S 
010111 0001 1111 --------- --------- RET 
Und wieder stößt sich alles am ominösen i. :x

Re: RET nur ein vom CALL Modifizierter JMP

Verfasst: Sa 14. Feb 2015, 10:23
von drohne235
Jo, genau so ist es. Da die Cog ja keinen Stack hat, modifiziert Call den entsprechenden Jmp, also die Rücksprungadresse. Ist quasi wie ein verteilter Stack.

Re: RET nur ein vom CALL Modifizierter JMP

Verfasst: Sa 14. Feb 2015, 11:05
von PIC18F2550
Und genau deshalb verstehe ich nicht den Sinn des i Bits. :SCHREIEN

Re: RET nur ein vom CALL Modifizierter JMP

Verfasst: Sa 14. Feb 2015, 11:49
von drohne235
Naja, das i-Bit (immediate) definiert den Verarbeitungsmodus für das Sourcefeld im Befehlscode. Abhängig von diesem Bit wird der 9 Bit Wert im S-Feld als direkter, eingebetteter Parameter (immediate), oder als Adresse zu dem Parameter in einem Cog-Register interpretiert.

RET ist dabei quasi ein JMP mit gesetztem i-Bit und
CALL ist ein JMPRET mit gesetztem i-Bit.

Beide Befehle (Call/Ret) sind Assembler Makros, welche die Bezeichner in die entsprechenden Zielbefehle (JMP/JMPRET) umsetzen. Im Prinzip kannst du es überprüfen, indem du statt Call und Ret manuell einfach JMPRET und Ret setzt - funktioniert analog den Makros.

Re: RET nur ein vom CALL Modifizierter JMP

Verfasst: Sa 14. Feb 2015, 12:10
von PIC18F2550
OK jetzt klährt sich alles langsam auf. :)

Der Unterschied ist nur in den d und s Elementen zu finden.
(nicht zur Laufzeit)
Beim RET sind d und s = 0,
Beim JMP ist nur d = 0


i = 1 ===> JMP nnn
i = 0 ===> JMP(nnn)

Analog des Z80 :mrgreen:

Fürs erste werd ich daher CALL und RET misachten :twisted: