2016-06-10 21 views
-1

Wie zu verwenden IMUL und MUL in emu8086? .. movzx in emu8086Wie verwendet man IMUL und MUL Anweisungen in emu8086?

nicht erlaubt ist

wie zum Beispiel movzx in emu8086 nicht erlaubt ist, würde diese Alternative mir erlauben, den Befehl zu verwenden, tut emu8086 so etwas wie diese Alternative hat, so kann ich Befehle verwenden IMUL/MUL?

1 movzx bx,centerBot ;not allowed in emu8086 
2 
3 mov bh,00   ;alternative of line 1 
4 mov bl,centerBot ;to move centerBot to bx 
         ;in emu8086 

ist es so etwas wie dies mit den IMUL/MUL in emu8086 so kann ich diese Anweisungen?

+4

Ihr Code enthält keine MUL oder IMUL und Sie fragen nach einer völlig anderen Anweisung. Was versuchst du eigentlich? –

+0

Mögliches Duplikat von [Problem beim Verständnis von mul & imul-Anweisungen der Assemblersprache] (http://stackoverflow.com/questions/1948058/problem-in-understanding-mul-imul-instructions-of-assembly-language) –

+1

Sie don brauche keine Alternative zu "imul" oder "mul"; Die Ein-Operanden-Form war Teil von 8086, später nicht hinzugefügt. (Siehe [das x86-Tag-Wiki] (http://stackoverflow.com/tags/x86/info) für einen Link, der anzeigt, wann jedes Formular jeder Anweisung hinzugefügt wurde). Um mit kleinen Assemble-Zeitkonstanten zu multiplizieren, lohnt es sich oft, eine Verschiebung zu verwenden und zu addieren oder zu subtrahieren anstatt zu multiplizieren ... Oder zumindest wäre es, wenn "shl r, imm8" verfügbar wäre. Natürlich haben moderne Intel-CPUs eine sehr schnelle Multiplikation (3-Zyklus-Latenzzeit für "imul r64, r64, imm32".) –

Antwort

4

Wie Sie schaut auf einen Leitfaden für die x86-Befehlssatz (here oder here), die mul und imul Anweisungen unterstützt wurden sehen können, da die 8086. Deshalb, wenn Emu8086 emuliert tatsächlich den Intel 8086, dann sollte es emulieren diese beiden Anweisungen auch. Sie sollten kein Problem haben, sie zu benutzen.

MUL ist für unsigned Multiplikation und kommt in zwei Formen auf die 8086: die 16-Bit-Version und die 8-Bit-Version:

  • MUL r16|m16       ⇔       dx: ax = ax

  • MUL r8|m8       ⇔       ax = al * r8|m8

IMUL kommt in den gleichen zwei Versionen, sondern behandelt die Werte wie unterzeichnet.


In Bezug auf Ihre Problemumgehung/Emulation von movzx, wäre es besser, zu verwenden:

xor bx, bx   ; clear BX (upper and lower bits) 
mov bl, centerBot ; copy centerBot to the lower bits of BX 

Oder Sie können einfach für centerBot arrangieren ein Wort-Größe variabel/Speicher zu sein, was eine machen würde direkte Bewegung möglich:

mov bx, centerBot