2016-10-01 31 views
0
私はBXとCXを乗算したいと思いますが、私のように動作しますdoesntのそれは斧を使う

乗算BXとCX [ASM 8086]

mov ax,0AFh 
mov cx,0AFh 
mul cx 

についてBXとCX

mov bx,Ah 
mov cx,5h 
mul cx 
"???????" 

を乗算する私の試み乗算bxとcx私は一時レジスタを使用する必要がありますと思う。誰も私にそのことを教えてもらえますか?

+1

'mov bx、Ah'では、ソースはAHレジスタであり、即値の定数ではありません。おそらくあなたは '0Ah'を意味するのでしょうか?また、http://www.felixcloutier.com/x86/MUL.htmlのマニュアル、またはあなたが期待していないその他の指示を読んでください。 –

+0

@Shift_Left:質問には8086が記載されていますが、「imul r16、r/m16」は386で導入されました。結果は実際には符号付きでも符号なしでもなく、完全な結果の上位半分だけが異なります。 2オペランドIMULは署名されたものに基づいてフラグを設定しますが、そうでない場合は、結果の上半分を必要としない場合はMULの必要はありません。あなたが実際に古代のハードウェア(またはemu8086)をターゲットにする必要がなければ、IMULは正しい選択です。 –

+0

@PeterCordes完全に文脈から外れているので、コメントを削除しました。私が39年前に買った棚から8086本**を引っ張ってしまうとは思ってもいませんでした。 –

答えて

0

これを試してみる:

mov bx, 0Ah 
mov cx, 5h 
push ax 
mov ax, bx 
mul cx 
mov bx, ax 
pop ax 
;at this point, ax is unchanged, result is in bx. 

それとも、あなたは空想になりたい場合は、この方法を試してください。

mov bx, 0Ah 
mov cx, 5h 
xchg ax, bx 
mul cx 
xchg ax, bx 
;at this point, ax is unchanged, result is in bx. 

をただし、16ビットのレジスタによる乗算はdx:axにその結果を残します。あなたの例は小さな数値を乗算するので、全体の結果が16ビットのレジスタに収まるので、これは本当に重要ではありません。しかし、あなたのdx登録はこれらのコードフラグメントによってクリアされることに注意してください。また、今後大きな数字を掛ける場合は、結果をdx:bxで探してください。

+1

すべての形式のmul/imulが完全な結果をもたらします。 http://www.felixcloutier.com/x86/MUL.html。 'mul r/m8'はそれをAXに入れますが、残りの全ては[RE] DXに入れます:[RE] AX –

+0

@PeterCordesは説明のためにありがとう。したがって、8ビット以上を乗算すると、 'dx'は常にチームのために1つを取得します。 –

+0

@PeterCordes私はそれを修正しました。 –