2017-02-25 3 views
-3

Ich habe Programm zu schreiben (für beide SIC und SIC/XE Maschine)Multiplikation von zwei Zahlen ohne Verwendung MUL-Befehl

Ich versuche es geschrieben, indem eine SHL Operation verwenden, die als die Multiplikation der angegebenen Operanden die gleiche Operation durchführt, um zwei. Das Verschieben nach links um zwei Bitpositionen multipliziert den Operanden mit vier. Das Verschieben nach links um drei Bitpositionen multipliziert den Operanden mit acht. Im Allgemeinen wird ein Operand um n Bits nach links mit 2n multipliziert. Jeder Wert kann mit einer Reihe von Verschiebungen und Additionen oder Verschiebungen und Subtraktionen mit einer bestimmten Konstante multipliziert werden. Um beispielsweise das Achsenregister mit zehn zu multiplizieren, müssen Sie es nur mit acht multiplizieren und dann den ursprünglichen Wert zweimal addieren. Das heißt, 10 * ax = 8 * ax + 2 * ax. Der Code, dies zu erreichen ist

  shl  ax, 1   ;Multiply AX by two 
      mov  bx, ax   ;Save 2*AX for later 
      shl  ax, 1   ;Multiply AX by four 
      shl  ax, 1   ;Multiply AX by eight 
      add  ax, bx   ;Add in 2*AX to get 10*AX 

Nun, wie kann ich ein Programm (SIC und SIC/EX-Maschine) schreiben? Könntest du bitte jemand mir helfen?

+0

Das ist x86-Code, aber die Logik ist gültig. Also, wo bist du stecken geblieben? – Jester

+2

Jemand könnte Ihnen antworten, aber das ist es nicht, worum SO eigentlich geht. Um wirkliche Unterstützung zu erhalten, sollten Sie versuchen, es selbst zu schreiben und dann zu posten, wenn Sie in Schwierigkeiten geraten. Dies ist keine Sprachlehrseite, noch ist es eine Website "schreibe diesen Code für mich". –

Antwort

1

Ihr Verständnis/Algorithmus ist auf dem richtigen Weg. Denken Sie daran, Grundschule, außer Base 2 ist so viel einfacher.

 abcd 
    * 1101 
    ========= 
     abcd 
     0000 
     abcd 
+ abcd 
============= 

die auch

abcd * ghef = (abcd*(f*(2^0)))+(abcd*(e*(2^1)))+(abcd*(h*(2^2)))+(abcd*(g*(2^3))) 

so nehmen Sie eine der Zahlen ist zu Fuß eine Eins durch wenn das Bit gesetzt ist, die andere Zahl fügen Sie den gleichen Betrag zu Ihrem Akkumulator verschoben.

//a = op1 * op2 in binary 
a=0; 
b=op1; 
for(x=1;x;x<<=1) 
{ 
    if(x&op2) a+=b; 
    b<<=1; 
} 

so einfach implementieren, egal in welcher Sprache mit welchen Anweisungen.

+0

ja f mal ZWEI an die Macht 0, und so weiter danke. –

Verwandte Themen