Gibt es eine Möglichkeit, Assemblercode in C einzufügen?

Lesezeit: 4 Minuten

Nathans Benutzeravatar
Nathan

Ich erinnere mich an die Zeit mit dem alten Borland-DOS-Compiler, die Sie so machen konnten:

asm {
 mov ax,ex
 etc etc...
}

Gibt es jetzt eine semi-plattformunabhängige Möglichkeit, dies zu tun? Ich muss einen BIOS-Aufruf tätigen. Wenn es also eine Möglichkeit gäbe, dies ohne asm-Code zu tun, wäre das für mich gleichermaßen nützlich.

  • Sehen Sie sich auch die Links im Inline-Assembly-Tag-Wiki an, um zu erfahren, wie Sie dies richtig machen. Es ist schwer, und der beste Vorschlag ist gcc.gnu.org/wiki/DontUseInlineAsm. Optimieren Sie aus Leistungsgründen, wann immer möglich, Ihren Quellcode, um dem Compiler zu helfen, besseren Code zu erstellen, anstatt Inline-ASM zu verwenden. (z. B. indem Sie sich die asm-Ausgabe des Compilers ansehen, um zu sehen, was er nicht optimieren kann oder was er falsch macht.)

    – Peter Cordes

    27. Oktober 2017 um 8:49 Uhr

Verwenden GCC

__asm__("movl %edx, %eax\n\t"
        "addl $2, %eax\n\t");

Verwenden VC++

__asm {
  mov eax, edx
  add eax, 2
}

  • C++Builder von CodeGear unterstützt auch das Schlüsselwort __asm.

    – stukelly

    14. September 2008 um 14:20 Uhr

  • Der VS-Compiler unterstützt keine Inline-Assemblierung! Ich hatte mir vor ein paar Jahren den Finger verbrannt, als ich das versuchte!

    – Jay D

    2. Mai 2012 um 7:04 Uhr

  • @JayD: Der VS-Compiler unterstützt die Inline-Assemblierung je nach Ziel. Beispielsweise wird 32-Bit x86 unterstützt; 64-Bit x86-64 ist es nicht.

    – Michael Burr

    2. Mai 2012 um 7:11 Uhr

  • Ja, das ist eine legale gcc-Syntax, aber fehlerhaft, es sei denn, Sie fügen das in eine Funktion mit ein __attribute__((naked)) was beinhaltet nur Inline-Montage Wenn Sie Register ändern, müssen Sie muss Verwenden Sie GNU C Extended Asm Constraints / Clobbers, um den Compiler darüber zu informieren; Das Treten auf die Register des Compilers kann zu wirklich seltsamen Ergebnissen führen. (Das Testen eines Falls mit deaktivierter Optimierung beweist auch nicht, dass es sicher ist). Sehen gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html / stackoverflow.com/tags/inline-assembly/info / ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

    – Peter Cordes

    3. April 2019 um 14:10 Uhr


Benutzeravatar von Martin Del Vecchio
Martin Del Vecchio

In GCC steckt mehr dahinter. In der Anweisung müssen Sie dem Compiler mitteilen, was sich geändert hat, damit sein Optimierer keinen Fehler macht. Ich bin kein Experte, aber manchmal sieht es so aus:

    asm ("lock; xaddl %0,%2" : "=r" (result) : "0" (1), "m" (*atom) : "memory");

Es ist eine gute Idee, einen Beispielcode in C zu schreiben, dann GCC zu bitten, ein Assembler-Listing zu erstellen, und dann diesen Code zu ändern.

Ein guter Anfang wäre das Lesen dieses Artikels, der sich mit der Inline-Assemblierung in C/C++ befasst:

http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx

Beispiel aus dem Artikel:

#include <stdio.h>


int main() {
    /* Add 10 and 20 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                "movl $20, %ebx;"
                "addl %ebx, %eax;"
    );

    /* Subtract 20 from 10 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                    "movl $20, %ebx;"
                    "subl %ebx, %eax;"
    );

    /* Multiply 10 and 20 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                    "movl $20, %ebx;"
                    "imull %ebx, %eax;"
    );

    return 0 ;
}

  • Das alles ist unsicher: Sie modifizieren EAX und EBX, ohne den Compiler darüber zu informieren. Verwenden Sie niemals GNU C Basic Asm innerhalb einer Funktion (außer als Rumpf einer __attribute__((naked)) Funktion.) Immer nur GNU C Extended asm like asm("sub %1, %0" : "+r"(dst) : "ri"(20)); zum Beispiel. gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html und stackoverflow.com/tags/inline-assembly/info Der von Ihnen verlinkte Artikel behandelt Extended Asm, es fehlen jedoch einige temporäre Register in seinem größeren Beispiel asm volatile.

    – Peter Cordes

    28. März 2021 um 16:05 Uhr


  • Der Artikel folgt auch dem Anti-Pattern, die asm-Vorlage mit a zu starten mov %1, %%eax anstatt erst nach der Eingabe in ein Register zu fragen.

    – Peter Cordes

    28. März 2021 um 16:09 Uhr


Benutzeravatar von Mike Dimmick
Mike Dimmick

Für Microsoft-Compiler, in der Reihe Assembly wird nur für x86 unterstützt. Für andere Ziele müssen Sie die gesamte Funktion in einer separaten Assembly-Quelldatei definieren, an einen Assembler übergeben und das resultierende Objektmodul verknüpfen.

Es ist sehr unwahrscheinlich, dass Sie unter einem Protected-Mode-Betriebssystem auf das BIOS zugreifen können, und sollten alle auf diesem System verfügbaren Funktionen verwenden. Selbst wenn Sie sich im Kernel-Modus befinden, ist es wahrscheinlich unsicher – das BIOS wird möglicherweise nicht korrekt in Bezug auf den Betriebssystemstatus synchronisiert, wenn Sie dies tun.

Gebrauch von asm oder __asm__ Funktion (in Compilern haben Unterschiede)

Sie können auch Fortran-Codes mit schreiben fortran Funktion

asm("syscall");
fortran("Print *,"J");

1418390cookie-checkGibt es eine Möglichkeit, Assemblercode in C einzufügen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy