tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
20
ZUGRIFFE
1463
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    BassBox Tutorials.de Gastzugang
    Hallo.
    Ich möchte programme für mein eigenes os in c schreiben. Jetzt habe ich das problem wie übergebe ich parameter von c in assembler? Ich verwende den TC (Turbo C(++))
    BSP:

    kernel.c
    Code :
    1
    2
    3
    
    extern "C" void setpixel(int p1,int p2,int p3);
    ...
    setpixel(4,8,16);

    assembykernel.asm
    Code :
    1
    2
    3
    
    global setpixel
    setpixel:
     ?

    Wie übertrage ich die parameter p1, p2 und p3 in assemmbler universalregister?

    Vielen Dank im Voraus
    LG
    BassBox
     

  2. #2
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Hi

    die Parameter kannst du dir vom Stack holen.
    Wie genau, hängt von der Aufrufkonvention ab (cdecl, stdcall...).
    Die regelt auch, wohin der Returnwert gehört.

    Welche dein Compiler verwendet, kann man einstellen (bzw. dort nachschauen)

    Gruß
     

  3. #3
    BassBox Tutorials.de Gastzugang
    Danke! Kannst du mir die Typen erklären? Ich nimm dann den der am besten zu nutzen ist. Das coole am TC ist das der einen guten Inlineassembler hat so dass ich einfach C Befehle mit Assembler ohne externe Date definieren kann. Was ich auch noch gerne wissen wollte welchen linker ich nehmen sollte. Ich würde den TC + linker zu einem Paket zusammenschnüren und dann meinen Freunden geben die schon lange an meinem oder Programme für mein OS entwickeln wollen, da ich schon recht weit gekommen bin.
    vielen Dank
    LG
    Euer BassBox
     

  4. #4
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Bei Inline-Asm brauchst du dich normalerweise nicht um die Parameterübergabe kümmern, weil der Compiler das durch den C-Funktionskopf dazugeneriert.

    Jedenfalls hat die engl. Wikipedia einen schönen Artikel dazu, und die wichtigsten Aufrufkonv. gibts auch in Deutsch: http://de.wikipedia.org/wiki/Aufrufkonvention

    Für die verbreitesten (cdecl und stdcall) wäre das im Prinzip bei zB einer Funktion
    int funk(int a, int b, int c)

    cdecl: Ausserhalb der Funktion, wo sie aufgerufen wird:
    1)Mit push die Parameter in den Stack schieben.
    Hier liegt auch der auffälligste Unterschied zw. stdcall und cdecl: Die Reihenfolge.
    cdecl braucht die Parameter "verkehrt":
    Code :
    1
    2
    3
    
    push cwert
    push bwert
    push awert
    Bei stdcall ist die Reihenfolge a,b,c.

    2)Mit call die Funktion aufrufen

    3) Die Parameter wieder aufräumen.
    Bei 3 int (also 12 Byte) kann man das zB so machen:
    Code :
    1
    
    add esp, 12

    Der Rückgabewert kann jetzt auch aus eax abgeholt werden.

    cdecl: In der Funktion:
    Soll man generell nur eax, ecx und edx verwenden.
    ebx ... ist reserviert.

    1)Die Parameter muss man sich in Reihenfolge a,b,c mit pop vom Stack abholen.
    2)Irgendwann eax setzen und returnen.

    stdcall: Ausserhalb der Funktion, wo sie aufgerufen wird:
    1)Mit push die Parameter in den Stack schieben.
    Hier "normale" Reihenfolge
    Code :
    1
    2
    3
    
    push awert
    push bwert
    push cwert

    2)Mit call die Funktion aufrufen

    3) Die Parameter NICHT wieder aufräumen.
    Das muss hier die Funktion machen

    Returnwert gleich wie bei cdecl.

    stdcall: In der Funktion:
    Ziemlich gleich wie bei cdecl.
    1) Die Pop-Parameter sind aber in verkehrter Reihenfolge.
    2) Statt "add esp, 12" außerhalb der Funktion bei cdecl gibt man den 12er hier beim Befehl ret mit.
    Code :
    1
    
    ret 12

    Gruß
    BassBox bedankt sich. 

  5. #5
    BassBox Tutorials.de Gastzugang
    vielen Dank! Wie läuft das dann über den Inlineassembler? Kann ich dann einach die Parameter dann als Vartiable ansprechen? Und wie mache ich dann da die Rückgabe? Welche linker hälst du eigentlich für sowas geeignet? Ich danke dir vielmals wenn ich mal wieder mit dem Pc und nicht mit tutsmobile online bin danke ich dir für die Hilfe !!

    Lg
    BassBox

    Ps: Hast du ein eigenes Os? Wenn ja was kann es?
     

  6. #6
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Zitat Zitat von BassBox Beitrag anzeigen
    Wie läuft das dann über den Inlineassembler? Kann ich dann einach die Parameter dann als Vartiable ansprechen? Und wie mache ich dann da die Rückgabe?
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    #include<stdio.h>
     
    int _cdecl funk(int a,int b,int c)
    {
        int xx;
        _asm
        {
            mov eax, a
            add eax, b
            add eax, c
            mov xx, eax
        }
        return xx;
    }
     
    int main()
    {
        int x;
        x=funk(1,2,3);
        printf("%d",x);
        return 0;
    }

    Geht einfach so. Ist zwar Visual-Studio-Syntax, sollte sich aber nicht großartig unterscheiden.

    Zum _cdecl bei funk: So kann man auch unabhängig von den globalen Einstellungen die CallingConv. für einzelne Funktionen festlegen.
    Ist aber hier nicht nötig (bzw. funktioniert mit stdcall genauso), weil die Parameterübergabe/Rückgabe ja vom Compiler übernommen wird.

    Zitat Zitat von BassBox Beitrag anzeigen
    Welche linker hälst du eigentlich für sowas geeignet?
    Jeden...mein Zeug mach ich mit NASM bzw. inline mit Visual Studio, als Linker bei beiden den von Microsofts VS.

    Zitat Zitat von BassBox Beitrag anzeigen
    Ps: Hast du ein eigenes Os? Wenn ja was kann es?
    Ja/nicht viel.
    Hab es hauptsächlich zum Lernen bzw. Ausprobieren gemacht, und weniger damit es am Schluss funktioniert.
    Dadurch ist es an allen Ecken eine Baustelle, die vorläufig aus Zeitmangel eingefroren ist.

    Gruß
    BassBox bedankt sich. 

  7. #7
    BassBox Tutorials.de Gastzugang
    Mein Os ist mein Hobby. Ich entwickle mit 5 Freunden an dem Ding und ich schreibe immer Treiber, das Hauptsystem und den Editor und den Rest teilen wir auf. Es ist echt super und ich hoffe das dadraus noch was wird. Es kann Dateien von einer FAT16 Platte und von einer FAT12 Diskette lesen, unterstützt die Dateiformate .COM .bmp .txt .bin
     

  8. #8
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Das klingt ja schon ganz ordentlich...nur weiter so
     

  9. #9
    BassBox Tutorials.de Gastzugang
    sorry das ich die antwort nicht vertig schreiben konnte. Mein Akku war leer... Hier ist der Rest

    das Os hat einen Maus Treiber und den ANSI Zeichensatz implementiert und noch ein paar System eigene recurcen.
    Das Komplette os hat eine mit der Maus zu bedienende GUI, Ein Bild editor und ausgabeprogramm, einen Editor mit Drucker Funktionen (leider nur über den Paralelen Port), einen DOS Emulator welcher eine DOS 2.0 Umgebung emuliert un natürlich einen grafischen Filemanager. Also das ist denke ich mal nich schlecht.
    Vielen Dank für deine Hilfe
    BassBox
    Geändert von BassBox (14.03.11 um 16:29 Uhr)
     

  10. #10
    BassBox Tutorials.de Gastzugang
    Nochne frage: Funktioniert das ganze auch bei C++ ?
    (sorry für das doppelt posting aber ich kann die frage einfach nicht in die letzte antwort reinpacken)
     

  11. #11
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Das mit den Aufrufkonventionen?
    Ja, warum nicht?

    Etwas wichtiges muss man aber beachten: Klasseninterne Methoden haben eine eigene CC:
    thiscall
    Der Grund: Die Methoden werden zuerst unabhängig vom tatsächlichen Objekt kompiliert und bekommen dann beim Aufruf einen Pointer auf das betroffene Objekt als zusätzlichen "Parameter" mit.

    thiscall ist zu allem Überfluss auch noch je nach Compiler anders.

    Bei Visual Studio, wenn die Funktion eine fixe Parameteranzahl hat:
    Wie stdcall, die Objektadresse muss aber vor dem Aufruf in ECX rein.

    Bei Visual Studio, wenn die Funktion variable Parameterlistenlängen hat:
    Wie cdecl die Objektadresse muss auch hier vor dem Aufruf in ECX rein.

    Bei gcc:
    Wie cdecl, die Adresse wird aber wie ein normaler Parameter mit den anderen in den Stack geschoben.
    Und zwar als letztes push (bzw. im C++-Quelltext wäre das der erste Parameter).

    Gruß
    BassBox bedankt sich. 

  12. #12
    BassBox Tutorials.de Gastzugang
    und per Inlineassembler? Gleich wie mit c oder? Ich habe gehört das man um globale vartiablen setzten zu können irgendwas einstellen musst. Ich nutze übrigen auch in diesem Fall den Turbo C(++). Hat eigentlich jeder Hochsprachen Compiler einen Inline Assembler?
    Könnte ich dann auch rein theorethisch in Java weier schreiben? Ich habe nach geguckt: der Inlineassembler vom TC heist BASM
    vielen Dank für deine Hilfe
    Lg
    BassBox
    Geändert von BassBox (16.03.11 um 18:04 Uhr)
     

  13. #13
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Zitat Zitat von BassBox Beitrag anzeigen
    und per Inlineassembler? Gleich wie mit c oder?
    Ja.

    Zitat Zitat von BassBox Beitrag anzeigen
    Ich habe gehört das man um globale vartiablen setzten zu können irgendwas einstellen musst.
    Keine Ahnung. Bei Visual Studio gehts jedenfalls ohne zusätzliche Einstellungen.

    Zitat Zitat von BassBox Beitrag anzeigen
    Hat eigentlich jeder Hochsprachen Compiler einen Inline Assembler?
    Die mir bekannten C/C++-Compiler alle. Vielleicht schreibt es ja auch der Sprachstandard vor...
    Aber jede Hochsprache generell? Nein.
    zB Bei solchen Halb-Interpretersprachen wie C# und Java würde das überhaupt keinen Sinn machen.
    Die haben ja eigene Exe-Formate, in denen keine direkten Prozessorbefehle vorkommen.
    Wohin also mit dem übersetzten Assemblerteil?

    Zitat Zitat von BassBox Beitrag anzeigen
    Könnte ich dann auch rein theorethisch in Java weier schreiben?
    Du könntest Inline-Asm in einer C-DLL machen und diese per JNI/JNA in Java verwenden.

    Zitat Zitat von BassBox Beitrag anzeigen
    Ich habe nach geguckt: der Inlineassembler vom TC Geist BASM
    Das B steht wahrscheinlich für Borland.

    Gruß
    BassBox bedankt sich. 

  14. #14
    BassBox Tutorials.de Gastzugang
    Danke! Gut ich habe noch eine Frage. Um mir die mühe und dem Umweg mit dem Linker zu ersparen kann ich das zeugs nich einfach ganz normal zu exe machen und das programm dann mit einem Jump oder Call starten? Ich weis nicht genau ob exe gleich funktioniert wie binary oder noch einen header hat.
    Hast du Zufällig ahnung davon? Wäre nämlich besser das zeugs zu exe zu machen und dann zu starten als noch über umwege zu linken. Ich würde das starten nähmlich lieber dem OS überlassen (ist Praktischer und das programm wird unwesentlich kleiner).(hat leder nicht viel mit dem thema zu tun aber ich wills trotztdem wissen) Und Weist du ob die Dos interupts (realmode) auch unterwindows 32bit in der IDT eingetragen sind? Und ob es irgendwo im netzt eine tabelle mit den windows idt interrupts gibt? (ich versuche mein OS linux und Windows Kompartibel zu halten)
    LG
    BassBox
    Geändert von BassBox (16.03.11 um 18:10 Uhr)
     

  15. #15
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Zu Exe machen kannst du schon, aber auch ein ganz normales Hello-World-Programm unter Windows wird gelinkt.
    Hier die "normalen" Parameter, die VS unter 32bit-XP bei mir für ein Konsolenprogramm nimmt:
    Code :
    1
    
    kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"Release/prog.pdb" /machine:I386 /out:"Release/prog.exe"
    Also ziemlich viele Standardlibrarys von Windows mit drin.
    Alle werden vielleicht nicht gebraucht, aber wenn du eine Standard-Exe von Windows starten können willst, musst du die Funktionen alle zur Verfügung stellen.

    Und ja, eine Exe hat auch ihr eigenes Format. Wie das aufgebaut ist, kann man schnell im Internet finden.

    Gruß
    BassBox bedankt sich. 

Ähnliche Themen

  1. Internetfreigabe per Crossover
    Von snow99 im Forum Netzwerke
    Antworten: 1
    Letzter Beitrag: 28.12.06, 20:31
  2. Crossover Kabel bei 1000BaseT
    Von Sinac im Forum Netzwerke
    Antworten: 3
    Letzter Beitrag: 23.08.05, 20:38
  3. DCOM95 mit Crossover installieren
    Von lordofscotland im Forum Linux & Unix
    Antworten: 1
    Letzter Beitrag: 20.10.04, 20:55
  4. Crossover mit Mandrake?
    Von Gabi im Forum Linux & Unix
    Antworten: 1
    Letzter Beitrag: 12.01.04, 23:39
  5. Antworten: 1
    Letzter Beitrag: 07.07.03, 00:13