Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Another Stupid Coder am 22. March 2005, 13:57
-
Hallo :)
Ich bin soeben dabei, mal meine Exceptions zu schreiben und da ich nicht extra ein Asm-Modul dazulinken will wollte ich dies ganz in Inline-ASM machen, so:
asm volatile
(
"pusha \n"
"push %%gs \n"
"push %%fs \n"
"push %%ds \n"
"push es"
);
/* Isr-Code. */
asm volatile
(
"pop %%es \n"
"pop %%ds \n"
"pop %%fs \n"
"pop %%gs \n"
"popa"
);
}
Tja, doch wenn ich das Compillieren will, sagt gcc:
/tmp/ccPfBEsA.s:619: Error: bad register name `%%gs'
(logischerweise für jedes Auftregen eines registernamens, nicht nur für "gs".)
Doch soweit ich weiß, ist das die korrekte Schreibweise für GCC-Inline-Asm oder etwa nicht?
Vielen Dank für die Antworten im vorraus :)
-
IIRC musst du statt "push" und "pop" "pushw" bzw "popw" schreiben.
-
Dann kommt immer noch die gleiche Nachricht, hat irgendjemand noch eine Idee?
EDIT: strange...wenn ich jeweils nur 1 % nehme klappt es soweit, nur beschwert ich dann der Compiler über etwas das VIEL weiter unten ist:
asm volatile
(
"movw %cs, %0 "
: "=g" (Selector)
);
mit
gcc -ffreestanding -c kernel/Idt.c -o Idt.o -I ./kernel
kernel/Idt.c: In Funktion »NewInterrupt«:
kernel/Idt.c:524: error: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
make: *** [idt] Fehler 1
strawberry:/home/pah/Documents/Software/osdev/helios#
Hat vielleicht jemand ein gutes Inline-ASM tut? Ich habe es gerade noch geschafft, dieses Bisschen Code zusammen zu bekommen, ansonsten kann ich zwar ASM aber von Inline-ASM habe ich keine Ahnung.
-
mov cs, irgendwas gibt es nicht. da musst du schon einen jmp, call, ret, etc. nehmen
Hat vielleicht jemand ein gutes Inline-ASM tut?
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
-
ausserdem statt %0 $0 falls du 0 ins cs haben willst (warum eignetlich?)
-
0 sollte die Parameter# sein.
@PorkChicken das hat aber schon gefunzt, glaub ich O_O