乗算と除算


乗算命令

乗算と除算は、シフトと加減さんを用いて表現することもできるため
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レジスタの内容を初期化することを忘れないでください




前のページへ戻る次のページへ