webdevqa.jp.net

divなしのASM 8086分割

Asm 8086にb = a/6のようなプログラムを書き込む必要がありますが、DIV命令は必要ありません。私はSARでそれを行う方法を知っていますが、2、4、8、16 ...

mov ax,a
sar ax,1 ;//div a by 2
mov b,ax

私の質問は、6で除算する方法を教えてください。

3
Roberto Meneses

小学校から

x/6 = x * 1/6;

Cコンパイラーに実行させるとどうなるか見てください。

unsigned short fun ( unsigned short x )
{
    return(x/6);
}

32ビットx86

0000000000000000 <fun>:
   0:   0f b7 c7                movzwl %di,%eax
   3:   69 c0 ab aa 00 00       imul   $0xaaab,%eax,%eax
   9:   c1 e8 12                shr    $0x12,%eax
   c:   c3                      retq 

32ビットアーム

00000000 <fun>:
   0:   e59f3008    ldr r3, [pc, #8]    ; 10 <fun+0x10>
   4:   e0802093    umull   r2, r0, r3, r0
   8:   e1a00120    lsr r0, r0, #2
   c:   e12fff1e    bx  lr
  10:   aaaaaaab

同じ話。これを8086に翻訳します。

6 = 3 * 2なので、3で割る必要があります。

unsigned short fun ( unsigned short x )
{
    return(x/3);
}

00000000 <fun>:
   0:   e59f3008    ldr r3, [pc, #8]    ; 10 <fun+0x10>
   4:   e0802093    umull   r2, r0, r3, r0
   8:   e1a000a0    lsr r0, r0, #1
   c:   e12fff1e    bx  lr
  10:   aaaaaaab

シフトが1ビット少なくなります。シフトの1つは精度を上げることであり、もう1つはそこに2による除算があるためです。

もちろん、減算ループを行うことができます。それ以外の場合は、実際にはコーディングが非常に簡単な長い除算です。

0
old_timer