PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Assembler-Sprachproblem



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 --

Joghurt
30-09-2005, 13:23
Siehe anderes Posting.

LSSuper2004
30-09-2005, 13:26
Siehe anderes Posting.

Für alle anderen, die den Zusammenhang nicht kennen:

http://www.mrunix.de/forums/showthread.php?p=185805