Load Befehle- GDI3-Prak3

Juri
Mausschubser
Mausschubser
Beiträge: 64
Registriert: 13. Mär 2007 10:48

Load Befehle- GDI3-Prak3

Beitrag von Juri »

Hallo,

hatte eine Frage, wie soll das Datensegment deklariert werden, als ein byte-Array oder als ein word-Array?

Warum die Frage,

1. Bei loadbyte ist das kein grosses Problem, wenn das Datensegment als byte deklariert ist, da wir ein byte loaden von der Stelle s0 aus dem Datensegement.

2. Aber bei loadword bekommt man ein Problem, wenn wenn das Datensegment als byte deklariert ist, weil man laedt nur ein byte von der Stelle s0 vom Datensegement aber wir erwarten ein word.

Loesung zu 2, waere? Einfach so ein Byte bekommen und casten in word und das wars, oder

word w = ds[s0]*256 + ds[s0+1]; ????????

3. Bei savebyte ist das auch kein Problem, da man das machen kann

ds[s1] = (byte) (s0 % 256); und man hatte ein byte gespeichert.

4. Bei saveword bekommt man aber wieder ein Problem, da man ein word zu einer byte-Stelle zu speichern versucht, d.h es wird nur das zweite byte von dem ganzen wort gespeichert also, saveword = savebyte wie oben, macht nichts anderes.

Die Frage ist jetzt, soll man das Datensegment als word-Array deklarieren, und es wenn noetig byteweise ansprechen oder wie geht es da, ich nichts mehr weiter weiss.

Danke im Voraus.
Gruss,
Juri

Benutzeravatar
Red*Star
Kernelcompilierer
Kernelcompilierer
Beiträge: 510
Registriert: 28. Nov 2006 19:40

Re: Load Befehle- GDI3-Prak3

Beitrag von Red*Star »

Juri hat geschrieben:Hallo,

hatte eine Frage, wie soll das Datensegment deklariert werden, als ein byte-Array oder als ein word-Array?
Word-weise *geht* es bestimmt auch. Also es ist möglich. Nur möchte ich den Code dafür nicht implementieren müssen... das gibt ein Hin- und Hergeschaufele ^^.

Also ich habe es (wie wohl die meisten anderen auch) als Byte-Array gespeichert. Beim Laden/Speichern von Wörtern muss man halt ein bisschen aufpassen, so wie du das ja offenbar auch bemerkt hast ;).
Juri hat geschrieben: Warum die Frage,

1. Bei loadbyte ist das kein grosses Problem, wenn das Datensegment als byte deklariert ist, da wir ein byte loaden von der Stelle s0 aus dem Datensegement.

2. Aber bei loadword bekommt man ein Problem, wenn wenn das Datensegment als byte deklariert ist, weil man laedt nur ein byte von der Stelle s0 vom Datensegement aber wir erwarten ein word.

Loesung zu 2, waere? Einfach so ein Byte bekommen und casten in word und das wars, oder

word w = ds[s0]*256 + ds[s0+1]; ????????

3. Bei savebyte ist das auch kein Problem, da man das machen kann

ds[s1] = (byte) (s0 % 256); und man hatte ein byte gespeichert.

4. Bei saveword bekommt man aber wieder ein Problem, da man ein word zu einer byte-Stelle zu speichern versucht, d.h es wird nur das zweite byte von dem ganzen wort gespeichert also, saveword = savebyte wie oben, macht nichts anderes.

Tja, dann denk mal nach, wie du dieses Problem umschiffen kannst. Tipp: Ich sage nur dein Punkt 2 rückwärts ;).
Juri hat geschrieben: Die Frage ist jetzt, soll man das Datensegment als word-Array deklarieren, und es wenn noetig byteweise ansprechen oder wie geht es da, ich nichts mehr weiter weiss.

Danke im Voraus.
Gruss,
Juri
Gruß,

Red
Was Sonnenschein für das schwarze Erdreich ist,
ist wahre Aufklärung für die Verwandten des Erdreichs.

- N.F.S. Grundtvig

Juri
Mausschubser
Mausschubser
Beiträge: 64
Registriert: 13. Mär 2007 10:48

Beitrag von Juri »

Hi Red,

erstmal danke fuer deine Antwort und die Tipps.

Ich habe aber immer noch ein kleines Verstaendnis-Problem mit der Sache....

Wie gesagt man koennte es so loesen,

word w = pds[s0]*256 + pds[s0+1];

aber auch so,

word w = pds[s0-1]*256 + pds[s0];

Wer sagt jetzt was richtig oder was falsch ist???

Danke
Gruss,
Juri

hcdenton
Mausschubser
Mausschubser
Beiträge: 92
Registriert: 21. Dez 2006 17:15

Beitrag von hcdenton »

Juri hat geschrieben:word w = pds[s0]*256 + pds[s0+1];
Das ist richtig (was die Bytes betrifft), aber du musst noch die Endianness beachten.
Bild

Benutzeravatar
Red*Star
Kernelcompilierer
Kernelcompilierer
Beiträge: 510
Registriert: 28. Nov 2006 19:40

Beitrag von Red*Star »

Und ein Performance-Hinweis: Shiften geht meist schneller als Multiplizieren. Statt x * 256 kannst du hier also auch x << 8 benutzen. (Aber Hauptsache ist natürlich erstmal, dass es läuft ;).)
Was Sonnenschein für das schwarze Erdreich ist,
ist wahre Aufklärung für die Verwandten des Erdreichs.

- N.F.S. Grundtvig

Benutzeravatar
MisterD123
Geek
Geek
Beiträge: 811
Registriert: 31. Okt 2006 20:04
Wohnort: Weiterstadt

Beitrag von MisterD123 »

dafür gibts den compiler in diesem fall, den gabs nur bei mips vorher nicht ;)

Benutzeravatar
Red*Star
Kernelcompilierer
Kernelcompilierer
Beiträge: 510
Registriert: 28. Nov 2006 19:40

Beitrag von Red*Star »

Was, der konvertiert das automatisch? Das wär mir neu...
Was Sonnenschein für das schwarze Erdreich ist,
ist wahre Aufklärung für die Verwandten des Erdreichs.

- N.F.S. Grundtvig

hcdenton
Mausschubser
Mausschubser
Beiträge: 92
Registriert: 21. Dez 2006 17:15

Beitrag von hcdenton »

Grad mal getestet... der gcc optimiert das sogar bei -O0... (einfach -S angeben, dann die Ausgabe anschauen)

EDIT:
noch was lustiges zum Thema Optimierung... wir hatten in unserem Code diesen If-Block drin, um nur alle 2 Instructions vom Hauptspeicher lesen zu muessen:

Code: Alles auswählen

if (even) {
	cur_instr_byte = byte[cs];
}
Dann getestet... Ohne das if lief es fast doppelt so schnell ;-)
Bild

Benutzeravatar
MisterD123
Geek
Geek
Beiträge: 811
Registriert: 31. Okt 2006 20:04
Wohnort: Weiterstadt

Beitrag von MisterD123 »

Red*Star genau für so optimierungen hast du doch den Compiler.. der macht mehr als nur zu übersetzen.

Benutzeravatar
Red*Star
Kernelcompilierer
Kernelcompilierer
Beiträge: 510
Registriert: 28. Nov 2006 19:40

Beitrag von Red*Star »

Ja gut, aber dass er sich in solche semantisch eventuell relevanten Dinge einmischt, hätte ich nicht gedacht. Aber man lernt halt nie aus. ^^
Was Sonnenschein für das schwarze Erdreich ist,
ist wahre Aufklärung für die Verwandten des Erdreichs.

- N.F.S. Grundtvig

arke
Erstie
Erstie
Beiträge: 21
Registriert: 13. Feb 2006 13:12

Beitrag von arke »

Ist doch eigentlich egal was der compiler ausspuckt, solange es genau das tut was verlangt wurde. Es gibt ja auch architekturen ohne MUL opcode, da ist es schon ziemlich willkommen wenn der compiler a = x << 8 kompiliert anstatt a = 0; for(int i = 0; i < 256; i++) { a += x; } oder so ^^

Antworten

Zurück zu „Archiv“