LSSuper2004
30-09-2005, 13:11
Hallo,
nachdem mir Joghurt schon mal ein bisschen weitergeholfen hat, jetzt eine andere Frage, und zwar suche ich den Fehler (den mein GNU-Compiler = AT&T-Syntax) meint, gefunden zu haben. (Natürlich alles in asm("..."); eingeschlossen.)
mov $1020,%dx
in %dx,%cx
or $1,%cx
mov %cx,%al
out %al,%dx
Der Code soll (letztschlussendlich) folgendes machen:
per in den Wert aus der Adresse 1020 (dezimal) lesen und damit ins Register cx
per [/B]or[/B] das kleinste Bit (für den Wert 1) setzen (weiter unten genaueres)
per out diesen Wert wieder in die dezimale Adresse 1020.
Genaueres zum "or 1" (zum besseren Verständnis):
Es geht um das Setzen des Bits 1. Also maskieren wir den ausgelesen (beliebigen) Wert per ODER mit 1:
01101110
|00000001
=01101111
um so nur das erste Bit zu verändern. Später dann noch für eine andere Funktion aus dem OR ein AND machen und dann mit 11111110 maskieren, um das erste Bit wieder zu löschen.
Auf jeden Fall geht es mir darum, den Code in der AT&T-Syntax zu bekommen. Auf jeden Fall mit folgenden Funktionen (diesmal in der Intel-Syntax):
IN Ziel,Quelle zum Lesen aus einer Adresse
OUT Ziel,Quelle zum Schreiben an die Adresse
Wobei in dem C++-Buch irgendetwas drinsteht, von wegen.. ich zitiere:
IN Ziel, DX = Liest ein Byte, Wort oder Doppelwort aus einem Port. ... Die Port-Adresse muss zuvor in DX abgelegt werden.
OUT DX, Quelle = Schreibt ein Byte, ... in einen Port. ... Die Portadresse muss zuvor in DX abgelegt werden.
OK, machen wir von mir aus in DX rein, also erst mal (AT&T):
mov $1020,dx
und lesen erst dann aus.
Hoffe habe es *verständlich* geschildert. ;-)
-- penma --
nachdem mir Joghurt schon mal ein bisschen weitergeholfen hat, jetzt eine andere Frage, und zwar suche ich den Fehler (den mein GNU-Compiler = AT&T-Syntax) meint, gefunden zu haben. (Natürlich alles in asm("..."); eingeschlossen.)
mov $1020,%dx
in %dx,%cx
or $1,%cx
mov %cx,%al
out %al,%dx
Der Code soll (letztschlussendlich) folgendes machen:
per in den Wert aus der Adresse 1020 (dezimal) lesen und damit ins Register cx
per [/B]or[/B] das kleinste Bit (für den Wert 1) setzen (weiter unten genaueres)
per out diesen Wert wieder in die dezimale Adresse 1020.
Genaueres zum "or 1" (zum besseren Verständnis):
Es geht um das Setzen des Bits 1. Also maskieren wir den ausgelesen (beliebigen) Wert per ODER mit 1:
01101110
|00000001
=01101111
um so nur das erste Bit zu verändern. Später dann noch für eine andere Funktion aus dem OR ein AND machen und dann mit 11111110 maskieren, um das erste Bit wieder zu löschen.
Auf jeden Fall geht es mir darum, den Code in der AT&T-Syntax zu bekommen. Auf jeden Fall mit folgenden Funktionen (diesmal in der Intel-Syntax):
IN Ziel,Quelle zum Lesen aus einer Adresse
OUT Ziel,Quelle zum Schreiben an die Adresse
Wobei in dem C++-Buch irgendetwas drinsteht, von wegen.. ich zitiere:
IN Ziel, DX = Liest ein Byte, Wort oder Doppelwort aus einem Port. ... Die Port-Adresse muss zuvor in DX abgelegt werden.
OUT DX, Quelle = Schreibt ein Byte, ... in einen Port. ... Die Portadresse muss zuvor in DX abgelegt werden.
OK, machen wir von mir aus in DX rein, also erst mal (AT&T):
mov $1020,dx
und lesen erst dann aus.
Hoffe habe es *verständlich* geschildert. ;-)
-- penma --