Gnu As(sembler) - Einige Fragen



  • hallo,

    bin assembler-anfänger und ich hab einige fragen zum gnu assembler.

    1. zum inline-assembler
    folgender code (unter windows soll der laufen):

    #include <stdio.h>
    
    int main()
    {
         asm(
         "mov $0,%al \n"       
         "mov $0x4C,%ah \n"    
         "int $0x21 \n");
         return 1;
    }
    

    der inline-assemblercode oben sollte eigentlich das programm beenden, leider stürzt es ab.

    was ist der unterschied zwischen "asm()" und "__asm__()" ???

    2. der code oben läuft auch nicht unter "normalem" assembler (soll auch unter windows laufen):

    .section .text
    .globl _start
    _start:
        mov $0,%al
        mov $0x4C,%ah
        int $0x21
    

    könnte mir bitte jemand erklären, was da das problem ist?



  • 1. Es stürzt ab, weil du vermutlich ein eine 32Bit Programm erstellt - Interrupts werden hier nicht mehr verwendet (API->DLLs).
    2. Der Code wird unter folgenden Bedingung laufen: du erstellst eine 16Bit/DOS-Exe die auf einer 32 Bit Windows Plattform ausgeführt wird (64 Bit erfordert eine Emulator).



  • ja ich hab windows 7 64-bit.

    ich versteh nicht ganz, von welchen dlls redest du?

    aber linux 64-bit kann 16-bit dateien ausführen, oder?
    wer kommt eigentlich immer auf diese kontraproduktiven ideen, alles zu DEstandartisieren, also z.b. verschiedene dateientypen zu erfinden, die aber nicht auf jeder architektur laufen, dann hat man noch dieses little-big-endian zeugs, 32-bit und 64-bit computer... WARUM?



  • i++; schrieb:

    ja ich hab windows 7 64-bit.

    16 Bit Code wird von der Hardware nicht mehre unterstützt (zumindest im so genannten "long mode") -> Emulator wie z.B. DOSBox

    i++; schrieb:

    ich versteh nicht ganz, von welchen dlls redest du?

    Ich wollte damit verdeutlichen, dass die API über Funktionen in DLLs bereitgestellt wird.

    i++; schrieb:

    aber linux 64-bit kann 16-bit dateien ausführen, oder?

    Vieleicht?
    Es wäre mir im Übrigen neu, das es überhaupt jemals ein x86-16 Variante des Linux Kernels gegeben hätte.

    i++; schrieb:

    wer kommt eigentlich immer auf diese kontraproduktiven ideen, alles zu DEstandartisieren,

    Von welchen Standard redest du? Außerdem, wer kommt eigentlich immer auf die Idee, die API eine seit Jahrzehnten ausgestorbenen Betriebssystems zu verwenden?

    i++; schrieb:

    also z.b. verschiedene dateientypen zu erfinden, die aber nicht auf jeder architektur laufen, dann hat man noch dieses little-big-endian zeugs, 32-bit und 64-bit computer... WARUM?

    So ist das halt in der Technik!



  • Ja komisch, warum es so viele verschiedene Handys gibt. Warum? Ich brauche doch nur eins.



  • i++; schrieb:

    was ist der unterschied zwischen "asm()" und "__asm__()" ???

    asm ist nicht definiert, wenn der Compiler im ISO-C-Modus arbeitet. Ansonsten gibt es aber keinen Unterschied.

    Warum willst du denn unter Linux irgendwelches 16-Bit-Zeugs ausführen? Die korrekte 64-Bit-Variante deines Programms würde so aussehen:

    _start:
        movl $0, %edi // Rückgabewert 0
        movl $60, %eax // Syscallnummer 60 für exit()
        syscall
    

    Das ist doch nun auch nicht komplizierter und du musst dich nicht mit tonnenweise obsoletem Mist rumschlagen.


Anmelden zum Antworten