2017-05-09 4 views
-3

Wie schreiben wir einen Code, um nur zwei 32-Bit-Integer mit Shift und Add zu multiplizieren. Ich weiß, wie man es mit 16-Bit-Ganzzahlen macht, aber wie können wir das für 32-Bit-Ganzzahlen machen, brauchen wir zwei Register, um die obere Hälfte und die untere Hälfte zu halten?x86 Assembly add and shift

+0

Es wäre nett, wenn Sie weitere Details angeben. Ob Sie auf MIPS, x86, i386 oder arm sind. Ob Sie mit der Arbeit in Ordnung sind. – Taeyun

Antwort

0

Angenommen, Sie sind auf i386 oder höher, verwenden Sie einfach eax, ebx, ecx, edx anstelle von ax, bx, cx, dx registrieren. Sie können eax auch verwenden, wenn Sie im Real-Modus sind (16 Bit).

Wenn Sie etwas Code wollen, hier ist es. Es verwendet andere Anweisungen wie mov, und rol zu hart. (ich es nicht getestet habe.)

Multiply eax, ebx und 32-Bit-Ergebnis speichern zu edx:

mov ecx, 32 
xor edx, edx 
next_binary_digit: 
shl edx, 1 
rol ebx, 1 
text ebx, 1 
jz add_done 
add edx, eax 
add_done: 
loop next_binary_digit 

Wenn Sie Speicher verwenden möchten, würde es komplizierter sein, weil Sie laden können müssen Wert in Register und Verschiebung, Check Übertrag, Speichern zurück in den Speicher.

Oder .. möchten Sie bei der Registergröße X bleiben, wollen aber die ganze Zahl größer als X multiplizieren?