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で除算する方法を教えてください。
小学校から
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による除算があるためです。
もちろん、減算ループを行うことができます。それ以外の場合は、実際にはコーディングが非常に簡単な長い除算です。