CP/M-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Memberlist || Home || Statistik || Kalender || Staff Willkommen Gast!
[ Unofficial CP/M Website ] [ Z80 Family Support Page ] [ Forum-Regeln ] [ Impressum/Kontakt ] [ Datenschutzerklärung ]

CP/M-Forum » CPUs, Bauteile und Peripherie » was für einen Sinn macht das eigentlich? » Threadansicht

Autor Thread - Seiten: -1-
000
06.09.2014, 21:00 Uhr
zilog



Bei einem 8080 und einem Z80 Prozessor sind die Einträge auf dem Stack immer 16 Bit weit.

Schiebe ich den Akkumulator auf den Stack wird auch gleich noch das Flag Register mitgespeichert.

Schiebe ich das B Register auf den Stack wird auch gleich noch das C Register mitgespeichert.

Das hat allerdings zur Folge dass ich mir jedesmal wenn ich das B Register vom Stack hole ich mir das C Register kaputt mache.

was soll das eigentlich?

ich kenne das vom 6502 dass bei einem 8 bit Prozessor die Stackeinträge nur 8 Bit weit sind also PUSH A oder PULL A ohne ein weiteres Register dabei zu überschreiben.

Dieser Post wurde am 06.09.2014 um 21:01 Uhr von zilog editiert.
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
001
07.09.2014, 21:11 Uhr
proof80




Zitat:
zilog postete

Schiebe ich das B Register auf den Stack wird auch gleich noch das C Register mitgespeichert.
Das hat allerdings zur Folge dass ich mir jedesmal wenn ich das B Register vom Stack hole ich mir das C Register kaputt mache.

Wieso? Du hast doch vorher auch den alten Inhalt von C auf dem Stapel abgelegt. Was machst Du dann kaputt?

Vielleicht bringst Du mal ein Programmbeispiel, wo Dir das Probleme macht.

Gruß, Wolfram

Dieser Post wurde am 07.09.2014 um 21:12 Uhr von proof80 editiert.
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
002
08.09.2014, 16:26 Uhr
zilog



ich brauche dafür kein Programmbeispiel.

wenn ich den wert von C verändere nachdem ich B auf den Stack geschoben habe und mir nun B wiederholen möchte..

wäre es nicht sinnvoller ich könnte die Register einzeln auf den Stack schieben?
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
003
08.09.2014, 17:57 Uhr
proof80



Mit dem Programmbeispiel wollte ich Näheres darüber erfahren, warum Du B auf den Stack packen willst und ob danach ein Problem mit C entsteht.

In den meisten 8080- und Z80-Programmen, die ich kenne, werden die Register vor einem Unterprogrammaufruf gesichert, damit sie darin frei verwendet werden können, und nach der Aktion wieder restauriert.

Schau Dir mal die Z80-Befehle an, insbesondere die Blockladebefehle LDIR etc.
Daran sind die Besonderheiten der einzelnen Register schön zu erkennen.

Ob sinnvoll oder nicht steht ja nur zur Debatte, wenn man eine neue CPU entwerfen will ...
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
004
10.09.2014, 18:10 Uhr
zilog



Es geht mir nicht um das Sichern von Registern bei einem Interrupt oder vor einem Unterprogrammaufruf.

Ich meine etwa wenn ich mir den wert des B Registers für einen späteren Zeitpunkt aufheben möchte.

Dann pushe ich B auf den Stack und hole es irgendwann einmal wieder herunter.

Dabei möchte ich mir jedoch nicht ein anderes Register kaputt machen.

Ich hoffe Du verstehst was ich meine = )
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
005
10.09.2014, 19:33 Uhr
proof80



Wozu auf den Stack? Da würde ich (über den Akku) einfach in den Speicher sichern:

LD A,B
LD (Buffer), A

wobei Buffer die 2byte-Speicheradresse darstellt.

Und zurückholen geht umgekehrt:
LD A,(Buffer)
LD B,A
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
006
11.09.2014, 00:28 Uhr
Hein_Ko

Avatar von Hein_Ko

Hi zilog

Wenn du Push BC verwendest... und später dann aber POP DE (anstatt BC) verwendest, ist BC kaputt, bzw. landet dessen Inhalt in DE. So kann man schön schnell 16Bit Register über den Stack swappen ;-)

Grüße
Heinrich
--
Es gibt keine Probleme - nur Lösungen !
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
007
12.09.2014, 13:23 Uhr
zilog



@proof80:

Na ja ich finde es vielleicht eleganter Ergebnisse auf dem Stack zwischenzuspeichern.

Jedenfalls bin ich das bisher so gewohnt.
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
008
12.09.2014, 19:55 Uhr
proof80



Klar, das ist ja der Punkt. Deine Gewohnheiten hast Du aber mit der 6502 und nicht mit einer 8080 oder Z80 entwickelt.

Warum interessierst Du Dich eigentlich für diese "anderen" Prozessoren? Wenn Du mit denen was anfangen willst, heißt es eben umgewöhnen.

Meine Frage nach dem Programmbeispiel bleibt. Angenommen Du hast ein bestimmtes Problem, das Du lösen willst. Mit Deinem Vorwissen und der Kenntnis der neuen CPU-Befehle versuchst Du Deine Strategie in Codezeilen umzusetzen und vermisst dabei schließlich den 8bit-Push/Pop. Hier im Forum könnten Dir bestimmt eine ganze Reihe von Leuten zeigen, wie man Dein Poblem mit der Z80 elegant löst.

Wenn Du dagegen nur auf einen Vergleich der CPUs aus bist, ist die Diskussion vergebens. Die Z80 hat halt nur die 16bittigen Stackbefehle und das zu ändern besteht meiner Ansicht nach weder Grund noch Möglichkeit ...

Apropos, was verstehst Du unter Eleganz? Schnellen Code, speichersparsamen Code, gut zu lesenden Code?

Dieser Post wurde am 12.09.2014 um 19:56 Uhr von proof80 editiert.
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
009
22.09.2014, 20:59 Uhr
TFM

Avatar von TFM

Der Z80 ist eben ein 8/16 Bit Prozessor, dementsprechend hat er auch 8 und 16 Bit Register.

Es ist natürlich besser immer 16 Bit Register auf den Stack zu speichern, sonnst würde man ja ewig viel zu tun haben um mal ein paar mehr Register zu sichern bzw. zu restaurieren.

Um einen 8 Bit wert zu sichern verwendet man den Stack nicht, dazu ist er nicht gedacht. Auch wenn das in der kleinen 6502 Welt so ist, aber da ist eben alles 8 Bit - leider auch den Adressraum.

Um z.B. ein Register B zu sichern kann man es:
- in ein anderes Register sichern (LD E,B z.B)
- in das RAM sichern (s.o.)
- oder in ein Zweitregister sichern (EX AF,AF':LD A,B:EX AF,AF')
- in ein Index-Register sichern (LD YL,B z.B.)

Letzteres macht oft Sinn, falls BC, DE und HL belegt sind.
--
TFM of FutureSoft
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
010
05.10.2014, 01:39 Uhr
timetube

Avatar von timetube

Ich finde man kann die Frage, warum die Z80 immer nur WORTE, keine BYTES auf/vom Stack transferiert, durchaus mal stellen.

Und man kann darauf auch sachlich antworten.

Die Z80 ist zwar ein 8bitter, wie die 650X auch, hat aber bereits ein fast vollwertigen 16Bit Core.

Natürlich könnte man zwei unterschiedliche POP/PUSH Opcodes haben.

Da der Stack bei Interrupt und Unterprogrammen immer 16Bit Adressen speichern muss, braucht es zwingend einen 16Bit Stack und passende Opcodes.

8Bit Push/Pop käme also oben drauf, auf das Set von Opcodes.

Die Z80 ist ja eine Weiterentwicklung der 8080, mit diese Opcode-kompatible.

Die 8080 hatte ausnahmslos 1 Byte Opcodes. Mit nur einem Byte "wusste" das Core was zu tun ist. Um nun bereits beim 8080 weiter 8bit-Push/Pops zu implementieren, hätte man auf andere, wichtigen Befehlen verzichten müssen oder den Befehlssatz auf 2Byte-Opcodes erweitern müssen. Der Nachteil wiegt bei weiten den Vorteil nun auch 8bit zwischen dem Stack zu transferieren nicht auf.

Ein acht Bit Push/Pop für jedes der [a,f,b,c,d,e,h,l,i,r] 10 Register bedeutete ja, dass
2 x 10 also 20 Opcodes der 256 möglichen nur dafür zu belegen sind.

Mit der Z80 kommen nun die Prefix-Opcodes hinzu, da wäre Platz für solche "nice to have but not really necessary" Opcodes gewesen. Da die ja um kompatible zu bleiben mit Prefix wären, wären die vom Timing her er ungünstig. Man würde ein 1 Byte weniger speichern/laden dafür aber ein Byte längeren Code. Also was brächte es?

Dann kann man die Sache ja auch anders sehen. Die 8080/Z80 hat nur 16Bit Register, die intern auch als zwei getrennte MSB/LSB angesprochen werden können.

Man hätte statt dem jeweiligen Anteil der 16 Bit Registers eigenen Bezeichner zu vergeben, ja auch das folgende definieren können.

Es gibt nur 16Bit Register in der Assembler Mnemonics.
A,B,D,H,X,Y,I Alle 16bit! (AF,BC,DE,HL,IX,IY,IR)

Aus

LD HL, nnnn
LD H, nn
LD L, B

würde dann zu

LD H, nnnn
LD high(H), nn
LD low(H), high(B)

Dann wäre die 16Bit Charakteristik deutlicher geworden.

Man darf sich die Register nämlich nicht so als Schubladen vorstellen, für jedes eine eigene Schublade. Intern sind es 16Bit Register und F gibt es als Register gar nicht, das sind zusammengefasste Ausgänge der ALU. Die Werden in der Mnemonics halt asl F-Register zusammen mit AF angesprochen.

Du wünscht Dir von daher nicht ein PUSH/POP für einzelne Register sondern eins für halbe Register Du erkennst nun sicher das die 650x einfach nicht mit der Z80 zu vergleichen ist. Du könntest genauso gut fragen warum die ARM nur 32 (Thrump 16) BIT Befehle kennt.

mfg
j.
--
"Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt." Ein Stein.

Dieser Post wurde am 05.10.2014 um 01:58 Uhr von timetube editiert.
Seitenanfang Seitenende
Profil || Private Message || Suche Zitatantwort || Editieren || Löschen || IP
Seiten: -1-     [ CPUs, Bauteile und Peripherie ]  



gaby.de

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek