Autor Thema: [gelöst] ASM in C  (Gelesen 5982 mal)

Programm Noob

  • Gast
Gespeichert
« 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
« Letzte Änderung: 11. November 2009, 00:14 von Programm Noob »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 28. October 2009, 19:58 »
Wenn du immer noch den GCC (oder irgendeinen anderen 32-Bit-Compiler) nutzt, dann lautet die Antwort nein.
Dieser Text wird unter jedem Beitrag angezeigt.

Programm Noob

  • Gast
Gespeichert
« Antwort #2 am: 28. October 2009, 20:02 »
Moin

ja ich nutze gcc, kann ich denn trotzdem irgenwir aus meinem c kernel heraus diese oder andere ASM Funktionen aufrufen?

Programm Noob

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 28. October 2009, 20:48 »
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
Dieser Text wird unter jedem Beitrag angezeigt.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #4 am: 28. October 2009, 21:25 »
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:

Programm Noob

  • Gast
Gespeichert
« Antwort #5 am: 29. October 2009, 13:20 »
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

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 29. October 2009, 13:21 »
@ PorkChicken
Muss ich dann die asm datei zu einer .obj machen und die dann wie eine c datei linken?  :?
Jop.
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen