Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Programm Noob am 28. October 2009, 19:34
-
Hallo
Ich habe ein Problem, ich würde gerne diese ASM Funktion in meinem C Kernel aufrufen.
rebootasm:
db 0EAh
dw 0000h
dw 0FFFFh
Kann ich die in eine C Funktion einbinden? Wenn Ja, wie?
Programm Noob
-
Wenn du immer noch den GCC (oder irgendeinen anderen 32-Bit-Compiler) nutzt, dann lautet die Antwort nein.
-
Moin
ja ich nutze gcc, kann ich denn trotzdem irgenwir aus meinem c kernel heraus diese oder andere ASM Funktionen aufrufen?
Programm Noob
-
Ja, Assemblerfunktionen kannst du aufrufen. (Diese Funktion aus dem ersten Post wird nicht funktionieren, weil das Code für den Real Mode ist.)
In die C-Datei schreibst du dazu:
// eine Funktion ohne Rückgabewert und ohne Parameter
// das extern bedeutet, dass die Funktion in einer anderen Datei steht
extern void beispiel();
void test()
{
// die Assembler-Funktion aufrufen
beispiel();
}
Und in die Assembler-Datei
// NASM Syntax
section .text
// die Funktion für Code in anderen Dateien sichtbar machen
global beispiel
beispiel:
// code der assemblerfunktion
ret
-
Da ich annehme, dass du den Computer neu starten willst, bin ich mal so frei, dir Code zu geben, der wohl immer funktionieren sollte:
rebootasm:
mov al,0xFE
out 0x64,al
Deine Funktion springt nämlich afaik in den BIOS-Einsprungspunkt nach einem CPU-Reset und simuliert so einen Reset. Das funktioniert aber nicht, wenn die CPU sich im 32-Bit-Modus befindet, da das BIOS davon ausgeht, im Real Mode ausgeführt zu werden. :wink:
-
Moin
@ PorkChicken
Muss ich dann die asm datei zu einer .obj machen und die dann wie eine c datei linken? :?
@ XanClic
Danke der Code funzt.
Programm Noob
-
@ PorkChicken
Muss ich dann die asm datei zu einer .obj machen und die dann wie eine c datei linken? :?
Jop.