Load Befehle- GDI3-Prak3
Load Befehle- GDI3-Prak3
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
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
Re: Load Befehle- GDI3-Prak3
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 ^^.Juri hat geschrieben:Hallo,
hatte eine Frage, wie soll das Datensegment deklariert werden, als ein byte-Array oder als ein word-Array?
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

Gruß,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
Red
Was Sonnenschein für das schwarze Erdreich ist,
ist wahre Aufklärung für die Verwandten des Erdreichs.
- N.F.S. Grundtvig
ist wahre Aufklärung für die Verwandten des Erdreichs.
- N.F.S. Grundtvig
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
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
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
ist wahre Aufklärung für die Verwandten des Erdreichs.
- N.F.S. Grundtvig
- MisterD123
- Geek
- Beiträge: 811
- Registriert: 31. Okt 2006 20:04
- Wohnort: Weiterstadt
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:
Dann getestet... Ohne das if lief es fast doppelt so schnell 
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];
}


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