Konvertierhilfe: __asm__ __volatile__

8

Ich möchte C outb Funktion auf D portieren.

%Vor%

Dies ist die D-Version.

%Vor%

Dies sind einige Links zum Thema.

D Inline-Assembler

Ссылка

GCC-Inline-Assembly-HOWTO

Ссылка

Aber ich kenne die Assemblersprache nicht, also brauche ich etwas Hilfe. Jede Hilfe wäre willkommen. Danke.

    
Erdem 23.12.2011, 10:08
quelle

2 Antworten

8

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:

%Vor%

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.

%Vor%     
kennytm 23.12.2011, 10:45
quelle
4

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:

%Vor%

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.

    
Adam Maras 23.12.2011 10:53
quelle

Tags und Links