Seite 1 von 1

Load Befehle- GDI3-Prak3

Verfasst: 1. Dez 2007 21:06
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

Re: Load Befehle- GDI3-Prak3

Verfasst: 2. Dez 2007 00:06
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

Verfasst: 2. Dez 2007 10:48
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

Verfasst: 2. Dez 2007 11:30
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.

Verfasst: 2. Dez 2007 17:39
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 ;).)

Verfasst: 2. Dez 2007 19:25
von MisterD123
dafür gibts den compiler in diesem fall, den gabs nur bei mips vorher nicht ;)

Verfasst: 2. Dez 2007 20:02
von Red*Star
Was, der konvertiert das automatisch? Das wär mir neu...

Verfasst: 2. Dez 2007 20:55
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 ;-)

Verfasst: 2. Dez 2007 21:20
von MisterD123
Red*Star genau für so optimierungen hast du doch den Compiler.. der macht mehr als nur zu übersetzen.

Verfasst: 2. Dez 2007 21:27
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. ^^

Verfasst: 2. Dez 2007 23:42
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 ^^