2016-05-04 17 views
2

Der Code unten ist nur ein kleiner Bruchteil des Programms, das ich gerade schreibe, aber keine anderen Teile des Programms sind relevant, also habe ich nur das eingefügt, was nötig war. Wie auch immer, was ich versuche ist, den in inputLoopCounter gespeicherten Wert in ecx zu verschieben, um zu bestimmen, wie oft eine Schleife ausgeführt werden soll. Wenn ich jedoch versuche, dieses Programm zusammenzustellen, erhalte ich den Fehler, der im Titel der Frage erwähnt wird. Kann jemand den Grund dafür erklären?x86 Assembly extreme Anfänger Anfrage: "ungültige Befehlsoperanden"?

.data 
inputLoopCounter BYTE -1 

.code 
mov ecx,inputLoopCounter 
+0

Kein x86-Experte, aber vielleicht ist das Problem, ein "BYTE" in ein Register zu setzen, das einen 32-Bit-Wert erwartet? Vielleicht laden Sie stattdessen 'cl'. Möglicherweise müssen Sie auch Klammern [] verwenden, da Sie auch aus dem Speicher laden. Ich überlasse es den echten Experten, die in Kürze hier sein werden :) –

+1

Oder 'movsx ecx, Byte ptr [inputLoopCounter]' wenn Sie wirklich wollen, dass Ihre Variable ein Byte ist, aber immer noch in ein Dword-Register laden will. – Michael

+0

@Michael Wenn es nicht absolut notwendig ist, dass es ein Byte ist, ist es mir möglich, BYTE zu DWORD zu ändern, damit es funktioniert? EDIT: Danke, Jose Manuel Abarca Rodriguez, Sie haben meine Frage beantwortet. Das war ein extremer Amateurfehler. – Proto

Antwort

3

Eine mögliche Lösung wäre inputLoopCounter BYTE -1 durch inputLoopCounter DWORD -1 zu ersetzen.

0

MASM merkt sich Sachen über Symbole, so foo BYTE -1 impliziert eine Operandengröße für Anweisungen, die von ihm laden.

Der andere große Geschmack der Intel-Syntax Assemblersprache (NASM), wird gerne eine Anweisung, die 4B von [inputLoopCounter] lädt, unabhängig davon, was ist ein Etikett für.

In NASM ist mov [inputLoopCounter], 0 ein Syntaxfehler, da keine Operand-Größe von jedem Operanden implizit ist. (Und in MASM wäre das ein mov byte ptr [inputLoopCounter], 0.)