Forum: Mikrocontroller und Digitale Elektronik Hilfe beim Verständnis von S12 Code


von Olli Z. (z80freak)


Lesenswert?

Ich habe am Entrypoint einer Firmware die HCS12X Bytefolge "CF 3F FF", 
was dem Opcode "LDS #$3FFF" entspricht. Zuerst dachte ich das würden den 
Stack-Pointer mit dem WERT $3FFF einstellen, da beim besagten 
Memorylayout der MCU dies die höchste RAM-Adresse darstellt. Das wäre 
irgendwie logisch für mich.

Die S12 Doku von NXP sagt jedoch das hier eine Immediate Memory Value 
Adressierung zum tragen kommen und daher der Inhalt der Speicherstelle 
$3FFF in den SP geladen werden, also da es 16 Bit sind $3FFF und $4000.

Das CPU-Handbuch sagt zum "LDS" auf Seite 248:
"Operation: (M : M + 1) ⇒ SP"
"Loads the most significant byte of the SP with the content of memory 
location M : M + 1, and loads the least significant byte of the SP with 
the content of the next byte of memory at M : M + 1."
"LDS #opr16i" "IMM" "CF jj kk".

Das wiederum erscheint mir irgendwie unlogisch. Woher soll an dieser 
Speicherstelle ein sinnvoller Wert kommen? Vor allen an einer Adresse 
bei der ein Byte noch im RAM und das andere im ROM steht?

Der Anfang der RESET-Routine schaut so aus:
1
ROM:D1C2 _Vreset:                                ; DATA XREF: USER_VEC:FFFE↓o
2
ROM:D1C2                 lds     #$3FFF
3
ROM:D1C5                 movb    #$FD, RPAGE     ; RAM Page Index Register
4
ROM:D1CA                 movb    #$20, byte_12 ; ' '
5
ROM:D1CF                 movb    #$FF, PPAGE     ; Program Page Index Register
6
ROM:D1D4                 ldx     #$CDED
7
ROM:D1D7                 ldy     2,x+

von Olli Z. (z80freak)


Lesenswert?

Oder ist "M" ein Synonym für PC (Program-Counter)?

von H. H. (Gast)


Lesenswert?

Olli Z. schrieb:
> Ich habe am Entrypoint einer Firmware die HCS12X Bytefolge "CF 3F FF",
> was dem Opcode "LDS #$3FFF" entspricht. Zuerst dachte ich das würden den
> Stack-Pointer mit dem WERT $3FFF einstellen, da beim besagten
> Memorylayout der MCU dies die höchste RAM-Adresse darstellt. Das wäre
> irgendwie logisch für mich.

Genau so ist das auch.

von H. H. (Gast)


Lesenswert?

Olli Z. schrieb:
> Oder ist "M" ein Synonym für PC (Program-Counter)?

Das ist im Manual nach der Befehlssatztabelle erkärt.

von Olli Z. (z80freak)


Lesenswert?

H. H. schrieb:
> Olli Z. schrieb:
>> Oder ist "M" ein Synonym für PC (Program-Counter)?
>
> Das ist im Manual nach der Befehlssatztabelle erkärt.

Ich habe das S12 CPU Manual 
(https://www.nxp.com/files-static/microcontrollers/doc/ref_manual/S12XCPUV2.pdf) 
und da finde ich es wirklich nicht, aber es ist irgendwie logisch, daher 
wird es so sein. Komisch das wirklich alles erklärt ist nur dieses "M" 
nicht... naja.

von Dieter (Gast)


Lesenswert?

Ist die Beschreibung wirklich so schwer zu verstehen? "M" ist eine
Speicheradresse und die Adressierungsart bestimmt den Wert von "M".
Im Fall "Immediate" ist "M" der Programmcounter und die Konstante
aus dem Befehl wird geladen.

von Erich (Gast)


Lesenswert?

Meiner Meinung nach sollte sich ein (z80freak) nicht mit derartigen 
Fehlkonstruktionsprozessoren befassen.
Gruss

von mIstA (Gast)


Lesenswert?

Olli Z. schrieb:
> Die S12 Doku von NXP sagt jedoch das hier eine Immediate
> Memory Value Adressierung

Also das muß mittlerweile bald 40 Jahre her sein, daß ich mich mal ein 
wenig mit Assembler beschäftigt hatte, aber Immediate 'Adressierung' 
gehört zu den wenigen Dingen, die mir davon in Erinnerung geblieben 
sind; vermutlich genau deshalb, weil diese 'Adressierungsvariante' ohne 
Adresse auskommt - der Operand steht eben unmittelbar nach dem Opcode im 
Speicher.

Olli Z. schrieb:
> der Inhalt der Speicherstelle $3FFF in den SP geladen werden

Steht das wirklich genau so (also ohne Klammern, Kommas o.ä. um $3FFF) 
in der Doku?

Olli Z. schrieb:
> also da es 16 Bit sind $3FFF und $4000.

Daß die Doku auch das sagt, hast Du aber mit Sicherheit frei erfunden.
Als ich beim Lesen Deines OP an diesem Punkt angekommen war, hab ich 
mich dann doch ziemlich gewundert, ob NXP hier unter Immediate 
Adressierung etwas völlig anderes versteht, als allgemein üblich?


Olli Z. schrieb:
> "Loads the most significant byte of the SP with the content
> of memory location M : M + 1, and loads the least significant
> byte of the SP with the content of the next byte of memory at > M : M + 1."

Nachdem in dieser Erklärung der Ausdruck M : M + 1 explizit zwei Mal 
vorkommt, erst für das MSB und dann nochmal in Bezug auf das LSB, kann 
dieser Ausdruck offensichtlich nicht direkt für die beiden 
aufeinanderfolgenden Bytes an Adresse M und M+1 stehen, sondern nur für 
die Anweisung bzw. den Vorgang daß M um eins hochgezählt wird.


Olli Z. schrieb:
> Oder ist "M" ein Synonym für PC (Program-Counter)?

Das könnte man so sagen, ja. Ich vermute 'M' steht konkret für das 
Memory (Address Register) des Rechenwerks, daß direkt den Zustand der 
Adressleitungen repräsentiert.

Wenn das Rechenwerk dieses M grundsätzlich inkrementiert während es 
gleichzeitig den eben geladenen Opcode decodiert - was jedenfalls 
absolut sinnvoll wäre, weil der nächste Speicherzugriff fast immer 
(außer bei Stackoperationen) auf diese unmittelbar folgende 
Speicherstelle erfolgen wird - dann kann es anschließend sofort mit der 
Befehlsausführung beginnen. Das erklärt dann auch die Bezeichnung 
Immediate, dessen Bedeutung ja eine zeitliche und keine Örtliche 
Unmittelbarkeit ist.


Olli Z. schrieb:
> Komisch das wirklich alles erklärt ist nur dieses "M"
> nicht... naja.

Dann schau noch mal ganz genau… (kleiner Tip: Seite 22, ganz oben)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.