2017-02-25 137 views
-3

我必須寫程序(用於SIC和SIC/XE機)乘法兩個數的不使用MUL指令

我嘗試通過使用執行相同的操作,指定的操作數相乘的SHL運算到寫兩個。向左移兩位,將操作數乘以四。左移三位將操作數乘以八。一般來說,將一個操作數轉換到左邊的n位乘以2n。任何值可以乘以一些常數,使用一系列的移位和相加或移位和減法。例如,要將ax寄存器乘以十,只需要乘以八,然後再加兩倍原始值。也就是說,10 * ax = 8 * ax + 2 * ax。做到這一點的代碼是

  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 

現在我怎麼能寫一個程序(SIC和SIC/EX機)? 你能請別人幫我嗎?

+0

這是x86代碼,但邏輯是有效的。那麼,你卡在哪裏? – Jester

+2

有人可能會回答你,但這不是真正的問題。要獲得實際幫助,您應該嘗試自己寫,然後在遇到問題時發帖。這不是一個語言教學網站,也不是「爲我寫這個代碼」網站。 –

回答

1

您的理解/算法是正確的。記住小學學校,除了2號基地以外更容易。

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

這也是

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

所以取一個號碼走了一通,如果該位被設置添加其他號碼轉移相同數量的蓄電池。

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

所以只要用任何指令來實現它即可。

+0

耶f次TWO到0,等等謝謝。 –