Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

GAS / GCC Inline Assembler

4 views
Skip to first unread message

Ingmar Friedrichsen

unread,
May 11, 2001, 6:19:25 PM5/11/01
to
Hi...

Weiss jemand, wo ich irgentwelche Beispiele/Dokus zu den GCC
Inline-Assembler und/bzw. GAS für dem i386 finden kann? Ich hab den Syntax
noch nicht so recht intus und die offizielle Doku hat mir wenig
weitergeholfen, da sie sich mit einen mir unbekannten Prozessor bescheftigt.

MfG
Ingmar

Florian Weimer

unread,
May 12, 2001, 3:50:19 AM5/12/01
to
Ingmar Friedrichsen <ingmar.fr...@firemail.de> writes:

> Weiss jemand, wo ich irgentwelche Beispiele/Dokus zu den GCC
> Inline-Assembler und/bzw. GAS für dem i386 finden kann?

Im Linux-Kernel.

Andi Kleen

unread,
May 12, 2001, 3:14:47 PM5/12/01
to
Ingmar Friedrichsen <ingmar.fr...@firemail.de> writes:

info as erklaert den Unterschied zum normalen Intelsyntax und setzt voraus
das du den schon kannst, zB durch die Inteldokumentation. Inteldokumentation
gibt es bei developer.intel.com. Die speziellen gcc Erweiterungen findest du
in allgemeiner Form in der Dokumentation oder in einer etwas
verstaendlicherer Form zB bei
http://sources.redhat.com/ml/cygwin/1999-08/msg00138.html
Es ist trotz allem nicht trivial zu benutzen.


-Andi

Felix von Leitner

unread,
May 12, 2001, 5:58:35 PM5/12/01
to
Thus spake Ingmar Friedrichsen (ingmar.fr...@firemail.de):

Wenn dir der Prozessor unbekannt ist, ist nicht die gas-Syntax dein
Problem. Beschäftige dich erstmal grundsätzlich mit Assembler.
Ansatzpunkt: Trivial-Routinen in C schreiben und "gcc -S" benutzen.

Felix

Ingmar Friedrichsen

unread,
May 13, 2001, 4:46:45 AM5/13/01
to
Thanx, die URL hab ich gesucht... :-)))

Ingmar Friedrichsen

unread,
May 13, 2001, 2:22:41 PM5/13/01
to
Ingmar Friedrichsen wrote:

> Thanx, die URL hab ich gesucht... :-)))
>
>

Ich hab noch mal ne kurze Frage...
Wie kann man einglich in GAS bzw. dem GCC Inline Assembler eine
Segment:Offset-Adresse (bzw. Selektor:Offset-Adresse) ansprichen...

In NASM geht das z.B. folgendermasen:

mov ax, 0B800h
mov es, ax
mov byte [es:00h], "X" ; Gibt ein "X" auf den Bildschrim aus...
mov byte [es:01h], 04h ; Färbt das "X" rot...

MfG
Ingmar

Felix von Leitner

unread,
May 13, 2001, 4:27:35 PM5/13/01
to
Thus spake Ingmar Friedrichsen (ingmar.fr...@firemail.de):
> Ich hab noch mal ne kurze Frage...
> Wie kann man einglich in GAS bzw. dem GCC Inline Assembler eine
> Segment:Offset-Adresse (bzw. Selektor:Offset-Adresse) ansprichen...

Meine Güte, bist du eigentlich blind oder so?
Wieso postest du hier Fragen, wenn du die Antworten nicht liest?

Vergiß deine "Kenntnisse" zum Thema Grafikprogrammierung unter DOS bei
Linux.

> In NASM geht das z.B. folgendermasen:

> mov ax, 0B800h
> mov es, ax
> mov byte [es:00h], "X" ; Gibt ein "X" auf den Bildschrim aus...
> mov byte [es:01h], 04h ; Färbt das "X" rot...

Unglaublich.

Felix

Ingmar Friedrichsen

unread,
May 13, 2001, 6:01:17 PM5/13/01
to
Danke für die netten Worte... *grr*
Mir ist sehr wohl klar das mein Beispiel unter Linux keines falls
funktionieren würde:

1. wegen dem sogannnten "Flat Protected Mode" (keine richtigen Selectoren
mehr; nur zwei dummy Selectoren (Code und Data) die von 0 bis 4GB gehen)

2. wegen Paging... wenn man versucht auf B8000h zuzugreifen ist es keines
falls sicher gestellt (bzw. ist unter Linux im Ring 3 unmöglich) das man
auf die physikalische Adresse B8000h zugreift, da die Adressen durch die
Pagetables im Paging-Verzeichnis umgeleitet werden.

3. da Linus nicht so doof ist, das er trotz den Sicherheitsmichernismen des
Protected Mode Ring 3-Anwendungen den Zugriff aufs Video-RAM gewehrt.
(damit nicht irgent ein Trojaner das tty des Benuzers ausspionieren kann)

Wie ich auch schon etwas weiter oben erwehn habe, soll mein Programm weder
unter Linux noch irgent einen andren Betriebsystem laufen, sondern schön
vom Bootsector einer Floppy Disk durch meinen kleinen Bootloader (den ich
übrigens mit dem NASM geschrieben habe, wessen Syntax ich für wehsentlich
gelungener halte) geladen werden...
Das eigentliche Programm soll in einer Mischung von C und Inline Assembler
geschrieben werden... Und da mein Bootloader in einen selector orientierten
Protected Mode schaltet (und ich es auch erstmal so lassen will), muss ich
jetzt irgentwie rausfinden, wie man Selektor:Offset-Adressirung mit dem GCC
macht...

Vieleicht wehr es auch besser gewesen solche Frage in einen Assember Forum
zu stellen, das kam aber daher, da ich zuerst die Sache mit FAR-Pointer in
purem C machen wollte... Also hatte ich die die Frage zuerst in einem C
Forum gestellt, wo man mich, da das vom Compiler zu Compier verschieden
ist, auf euer Forum verwiesen hatte... Und so gings halt weiter....

Ich hoffe, das jetzt alles geklärt ist...

Ingmar

Andi Kleen

unread,
May 14, 2001, 9:01:20 AM5/14/01
to
Ingmar Friedrichsen <ingmar.fr...@firemail.de> writes:

> Danke für die netten Worte... *grr*
> Mir ist sehr wohl klar das mein Beispiel unter Linux keines falls
> funktionieren würde:
>
> 1. wegen dem sogannnten "Flat Protected Mode" (keine richtigen Selectoren
> mehr; nur zwei dummy Selectoren (Code und Data) die von 0 bis 4GB gehen)

Du kannst im Prinzip eigene Segmente mit modify_ldt() aufsetzen und diese
dann in die Segmentregister laden, nur macht das normal wenig Sinn. glibc
benutzt es zB um ueber fs auf threadlokale Daten zuzugreifen.

> 3. da Linus nicht so doof ist, das er trotz den Sicherheitsmichernismen des
> Protected Mode Ring 3-Anwendungen den Zugriff aufs Video-RAM gewehrt.
> (damit nicht irgent ein Trojaner das tty des Benuzers ausspionieren kann)

Als root koennen sie sich diesen Zugriff schon verschaffen, sonst wuerde
der XServer nicht funktionieren. Macht aber auch normal wenig Sinn fuer normale
Programme.

>
> Wie ich auch schon etwas weiter oben erwehn habe, soll mein Programm weder
> unter Linux noch irgent einen andren Betriebsystem laufen, sondern schön
> vom Bootsector einer Floppy Disk durch meinen kleinen Bootloader (den ich
> übrigens mit dem NASM geschrieben habe, wessen Syntax ich für wehsentlich
> gelungener halte) geladen werden...
> Das eigentliche Programm soll in einer Mischung von C und Inline Assembler
> geschrieben werden... Und da mein Bootloader in einen selector orientierten
> Protected Mode schaltet (und ich es auch erstmal so lassen will), muss ich
> jetzt irgentwie rausfinden, wie man Selektor:Offset-Adressirung mit dem GCC
> macht...

%segmentregister:addresse

Es ist alles in der as info page dokumentiert (info as)

-Andi

Florian Weimer

unread,
May 14, 2001, 11:09:52 AM5/14/01
to
Andi Kleen <fre...@alancoxonachip.com> writes:

> Du kannst im Prinzip eigene Segmente mit modify_ldt() aufsetzen und diese
> dann in die Segmentregister laden, nur macht das normal wenig Sinn. glibc
> benutzt es zB um ueber fs auf threadlokale Daten zuzugreifen.

%gs. ;-)

War das eigentlich schon immer so?

Alexander Bartolich

unread,
May 15, 2001, 5:39:31 AM5/15/01
to
Ingmar Friedrichsen wrote:
> [...]

> Und da mein Bootloader in einen selector orientierten
> Protected Mode schaltet [...], muss ich jetzt irgentwie

> rausfinden, wie man Selektor:Offset-Adressirung
> mit dem GCC macht...

Wieso baust du dir keinen Segment-Descriptor der bei 0 anfängt?

#define MK_FP(seg, ofs) (void*)((seg) << 4 + (ofs))

char* video_ram = MK_FP(0xB800, 0);

--
Hi! I'm Clippy, your personal assistant for MS-Latrine 1.0
You look like you need a piss. May I give a helping hand?

0 new messages