2016-06-30 10 views
-2

Ich habe eine Assembler-Datei mit diesem Code:Seltsam NASM Fehler: ungültige Kombination von Opcode und Operanden

global _start 
_start: 
mov eax, -2 

imul eax, c 

mov ebx, eax 

mov eax, 82 

imul eax, d 

sub ebx, eax 

div 4 

mov eax, 1 
mov ebx, 0 
int 0x80 

section .data 

a: db 10 
c: db 3 
d: db 2 

ich kompilieren mit:

nasm -f elf c1.asm 

ich einen Fehler:

c1.asm:15: error: invalid combination of opcode and operands

Was ist das Problem mit meinem Code, und wie kann ich es beheben?

+7

Zeile 15 sieht wie 'div 4' aus, und gemäß einer Befehlssatzreferenz [_DIV_] (http://www.felixcloutier.com/x86/DIV.html) wird kein unmittelbarer Operand verwendet. Es benötigt einen Speicheroperanden oder ein Register. –

+4

Um eine vorzeichenlose Integer-Division um 4 zu machen, brauchst du überhaupt kein "div". Machen Sie eine logische Verschiebung um 2 Bits nach rechts: 'shr eax, 2' – Michael

+1

Wenn Sie das nächste Mal nach einem Fehler in einer bestimmten Zeile fragen, können Sie uns Zeilennummern in der Quelle bereitstellen. Oder einen Kommentar eingeben, um die Linie zu identifizieren. –

Antwort

1
mov eax, -2 
imul eax, c 
mov ebx, eax 
mov eax, 82 
imul eax, d 
sub ebx, eax 
    *** Here's something amiss    
div 4 

Diese ersten 6 Zeilen platzieren ein Ergebnis in EBX, aber die div Anweisung immer die EAX-Register verwenden, und schon gar nicht das EBX registrieren! Sie müssen das Ergebnis von EBX nach EAX mit mov eax, ebx verschieben, bevor Sie die Division ausführen.


div 4 

Die div Anweisung erfolgt nicht sofort für einen Operanden! Selbst wenn dies der Fall wäre, müssten Sie noch einige Informationen über die Größe der Operation angeben.

Diese Lösung hält die Division:

xor edx, edx 
div dword [four] ;divide EDX:EAX by 4 -> quotient in EAX 

four dd 4 

Eine viel bessere Lösung ist überhaupt nicht zu teilen und nur EAX nach rechts 2 mal verschieben:

shr eax, 2 

imul eax, c 
... 
imul eax, d 

Diese imul 's kompiliert, aber tatsächlich mit den definierten Werten zu multiplizieren, verwenden Sie die folgenden:

Verwandte Themen