2016-06-09 18 views
1

Ich habe mit dem Inline-Assembler zuvor gearbeitet, aber ich bekomme einen Fehler, den ich vorher nicht gesehen habe und scheint nicht um die Interwebs zu finden. Der nächste, den ich bekommen habe, ist this oder this, aber keiner hat mir geholfen. Der Fehler tritt auf, wenn der Inhalt des EAX-Registers in eine Variable dx verschoben wird. Es scheint mir, soll es nur die unten sein, und in der Tat Demontage erzeugt den gleichen Code wie ich geschrieben habe, aber ich habe zwei Fehler:Fehler C2403 mit Inline-X86 C++ - Assemblierung Bewegungsregister Inhalt auf Variable

int main(int argc, char * argv[]){ 
     auto x1 = 10, x2 = 2, dx = 0; 
     __asm{ 
       MOV EAX, DWORD PTR [x1] 
       SUB EAX, DWORD PTR [x2] 
       MOV DWORD PTR [dx], EAX 
       ;error C2403: 'dx': register must be base/index in 'first operand' 
       ;error C2415: improper operand type 

       ;Disassembly generated the following 
       mov eax,dword ptr[x1] 
       sub eax,dword ptr[x2] 
       mov dword ptr[dx],eax 
     } 
    } 

Ich glaube nicht, dass ich ein anderes Register verwenden müssen und ich dachte, dass MOV den Inhalt eines Registers in eine Variable wie diese verschieben könnte. Seltsamerweise ist die folgende Zeile identisch mit y1, y2 und dy und erzeugt keinen Fehler. Ich habe versucht, nur [dx] zu dem gleichen Ergebnis zu verwenden, und jetzt kann ich nur an etwas wie MMX-Anweisungen denken, was unnötig erscheint. Danke im Vorraus für deine Hilfe!

Randbemerkung: Gibt es eine Vorliebe für Groß- und Kleinbuchstaben beim Schreiben in x86 (oder einer anderen) Assemblersprache?

[Bearbeiten] Jetzt bin ich neugierig, wie kann es Assembler-Code mit dword ptr [dx] generieren, wenn meine Verwendung der Compiler verwirrt?

Antwort

4

DX ist ein 16-Bit x86-Allzweckregister und der Assembler wird durch Ihre Syntax verwirrt (daher muss 'register muss base/index im ersten Operanden sein') - was beispielsweise dword ptr [ax] bedeuten würde ?). Wählen Sie einen anderen Namen für Ihre Variable.

+1

Oh, du hast Recht, ich habe das vergessen. Danke, dass du mich vor einer weiteren Stunde Kopfkratzen gerettet hast! –