Die Anweisung outb
sollte nur als outb %al, %dx
aufgerufen werden, wobei %al
der Wert und %dx
der Port ist.
D verwendet die Intel-Syntax für x86, im Gegensatz zum GNU-Assembler, der standardmäßig die AT & amp; T-Syntax verwendet. Die entsprechende Intel-Syntax wäre out dx, al
und der entsprechende Code in D würde wie folgt aussehen:
Beachten Sie, dass Sie die Assembly überhaupt nicht schreiben müssen, da Druntime die core.bitop.outp
enthält Funktion, die die gleiche Anweisung ausführen.
Das erste, was Sie wahrscheinlich stört, ist, dass die vom D-Compiler unterstützte Liste von Opcodes outb
nicht enthält, wie von der von Ihnen bereitgestellten C-Funktion angegeben. Nach einigem Graben habe ich herausgefunden, dass outb
ein spezifischerer Name für den allgemeinen Opcode out
ist. outb
gibt an, dass das erste Argument des Opcodes in einem Byte-Register enthalten sein wird (im Gegensatz zu outw
und outl
, die eine erste Argumentgröße von einem Wort bzw. einem Doppelwort anzeigen). Der D-Compiler verwendet den Opcode out
für alle Operationen und bestimmt anhand der Größe des von Ihnen angegebenen Arguments, welcher spezifische Opcode geschrieben werden soll.
Danach müssen Sie als nächstes die GCC-Syntax in die D-Syntax konvertieren. Laut dem GCC-Inline-Assembly-HOWTO verwendet der von Ihnen bereitgestellte Code die erweiterte Assembly-Syntax:
%Vor% Wenn Sie Ihre Vorlage betrachten, gibt die Funktion eine Assembly-Anweisung ( outb
) mit zwei Argumenten an, wobei das erste ein Byte ( %b0
) und das zweite ein Wort oder eine kurze ganze Zahl ( %w0
) ist.
Das heikle Bit in der Liste der Eingabeargumente ist die Zeichenfolge, die jedem Ihrer Funktionsparameter vorangestellt ist. Diese werden nach dem HOWTO Constraints genannt. Sie sind im Wesentlichen Regeln, denen GCC bei der Verwendung der Parameter als Argumente für die bereitgestellten Montageanweisungen folgen muss. Die auf den Parameter "a"
angewendete Einschränkung value
gibt an, dass der Inhalt der Variablen in Abhängigkeit von der Größe der Variablen entweder in Register eax
, ax
oder al
platziert werden muss. Die Einschränkung für die Variable port
, "Nd"
, gibt zuerst an, dass der Wert im Bereich von 0-255 liegt, und zweitens, dass der Wert in einem der Register edx
, dx
oder% co_de platziert werden muss %, wiederum basierend auf der Größe der Variablen.
Der D-Compiler bietet nicht so viel Hilfe bei Variablen in Assembly-Blöcken wie GCC; In D'Inline Assembler müssen Sie die Werte der Parameter gezielt in die richtigen Register verschieben. Für dl
sind diese Register outb
und dx
. Nach der Inline-Assembler-Syntax von D können Sie die Variablen verschieben und den al
-Opcode wie folgt aufrufen:
Beachten Sie, dass, da GCC die AT & amp; T Assembler-Syntax verwendet und D die Intel-Assembler-Syntax verwendet, die Reihenfolge der für out
angegebenen Argumente umgekehrt ist.
Tags und Links c assembly inline-assembly d