乗算と除算
乗算命令
乗算と除算は、シフトと加減さんを用いて表現することもできるため
CPUによっては、このような命令をサポートしていない場合もありますが
Intel 8086系CPUは、乗除算命令をサポートしています
乗除算は、加減算のように一筋縄にはいきません
まず、乗算命令MULから説明しましょう
乗算命令は、第一オペランドで指定したレジスタ、またはメモリで
計算、及び結果を格納するレジスタが決定されます
ディスティネーションオペランドは、ソースオペランドによって暗黙的に決定されます
ソースオペランドが8ビットの場合、ALレジスタとソースオペランドが乗算され
その結果は、AX16ビットレジスタに格納されます
ソースオペランドが16ビットの場合、AXレジスタとソースオペランドが乗算され
その結果は、上位DX、下位AXとして、それぞれのレジスタに格納されます
この結果は、すなわち32ビットであることがわかると思います
-A 100
15F2:0100 MOV AL , 50
15F2:0102 MOV DL , 2
15F2:0104 MUL DL
15F2:0106 MOV WORD PTR [0200] , AX
15F2:0109 MOV AX , F0F0
15F2:010C MOV DX , 2
15F2:010F MUL DX
15F2:0111
-G =100 111
AX=E1E0 BX=0000 CX=0000 DX=0001 SP=FFEE BP=0200 SI=0000 DI=0000
DS=15F2 ES=15F2 SS=15F2 CS=15F2 IP=0111 OV UP EI PL NZ NA PE CY
-D 200 201
15F2:0200 A0 00 ..
このプログラムでは、8ビットの乗算 MUL DL を
オフセットアドレス 0200 へストアし
さらに32ビットの乗算 MUL DX を演算しています
8ビット乗算では、ALレジスタが使用されます
ALレジスタには50、DLレジスタには2がロードされているので
結果は A0 となります、メモリダンプした結果が正しいことがわかりますね
16ビット乗算では、AXレジスタが演算対象になりますね
AXレジスタは F0F0 、DXレジスタは2なので F0F0 × 2 が演算され
その結果は、 1E1E0 となるので16ビットでは表現できません。すると上位16ビットはDXに保存されます
レジスタの値を見ると、DXが1、AXがE1E0なので正しく演算されています
この時、たとえ演算結果が16ビットで表現できたとしてもDXレジスタは0になります
除算命令
次は、除算による演算処理を行ってみましょう
これは、乗算とは逆のレジスタの関係になります
除算命令にはDIVを用います
乗算と同様に、ディスティネーションオペランドは暗黙のうちに決定されます
そして、除算は演算結果が商と余りに分かれるのです
ソースオペランドが、8ビットであればディスティネーションはAXレジスタになり
商はALレジスタ、余りはAHレジスタに格納され
16ビットであれば、上位16ビットがDX、下位16ビットがAXの32ビットと演算され
商はAXに、余りはDXレジスタに格納されます
15F2:0100 MOV AX , A
15F2:0103 MOV DL , 3
15F2:0105 DIV DL
15F2:0107
-G =100 107
AX=0103 BX=0000 CX=0000 DX=0003 SP=FFEE BP=0000 SI=0000 DI=0000
DS=15F2 ES=15F2 SS=15F2 CS=15F2 IP=0107 NV UP EI PL NZ AC PO NC
このプログラムでは、8ビットレジスタで A ÷ 3 を行っています
これは、10進数で 10 ÷ 3 ですね
答えは、当然商が3、余りが1となります
実行後、AXレジスタの下位8ビット AL に 3 という数値が入っているのが確認できます
また、その余りはAXレジスタの上位8ビット AH に1という数値が入っていますね
15F2:0100 MOV AX , FFFF
15F2:0103 MOV DX , 0001
15F2:0106 MOV WORD PTR [0200] , 100
15F2:010C DIV WORD PTR [0200]
15F2:0110
-G =100 110
AX=01FF BX=0000 CX=0000 DX=00FF SP=FFEE BP=0000 SI=0000 DI=0000
DS=15F2 ES=15F2 SS=15F2 CS=15F2 IP=0110 NV UP EI PL NZ AC PO NC
今度は16ビットの除算です
AXレジスタとDXレジスタが対象となるので、下位16ビットしか使わない場合でも
DXレジスタの内容を初期化することを忘れないでください