2012-03-20 41 views
9

多分、乗算と除算の動作がx86アセンブリでどのように機能するのか混乱しています。たとえば、以下のコードは8ビットの扱いが難しいとは思われません。x86アセンブリの乗算命令と除算命令のオペランド、16ビット以上

8ビット乗算:

; User Input: 
; [num1], 20 
; [num2] , 15 

mov ax, [num1] ; moves the 8 bits into AL 
mov bx, [num2] ; moves the 8 bits into BL 

mul bl   ; product stored in AX 

print ax 

しかし、あなたは、2つの16ビット数を乗算したいときに何が起こりますか?どのようにして2つの16ビットの数値に8ビットの数値をかけたのと同じ方法をかけることができますか?

値が格納されるレジスタについては混乱します。それらはALとAHに格納されるのでしょうか、または単にAXに16ビットの数値を格納するだけでしょうか。私が何を意味するのかを示す:

誰かが乗算と除算の仕組みをちょっと説明できますか? (具体的には、16ビットと32ビットの数で?私は値が低いALとAHに格納されている場合のビットを回転させる必要がありますか?

またはaxbxにできるもの単にmov num1num2それぞれとは、それらを乗算?eax

+2

あなたは読んでみてくださいました[documenta (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)? –

答えて

14

documentationで一目で製品を入手することがMULための4つの可能なオペランドのサイズがあることを示し、入力と出力が便利な表にまとめています。

------------------------------------------------------ 
| Operand Size | Source 1 | Source 2 | Destination | 
------------------------------------------------------ 
| Byte   | AL  | r/m8  | AX   | 
| Word   | AX  | r/m16  | DX:AX  | 
| Doubleword | EAX  | r/m32  | EDX:EAX  | 
| Quadword  | RAX  | r/m64  | RDX:RAX  | 
------------------------------------------------------ 
+0

私はそれを見て、値がどこに格納されているのかを知っていました。私は、もしそれが上位ビット(AX)ではなく下位ビット(ALとAH)に格納されているならば、値を 'eax'(前の' mul')に格納するのかどうか疑問に思っています。それが下位ビットに格納されていれば、それらをAXに回転させて、AXとBXを掛け合わせて答えを出力することができますか(私はEAXにあると思います)? – StartingGroovy

+0

'eax'に値を格納すると' eax'の* all *に値が格納されます。私は上手く理解できていない気がします。私はあなたが 'eax 'のどの部分が'ああ '' '' '' '' '' '' '' ''でもあるのを混乱させるかもしれないと思います。同じ文書の第1巻のグラフを見ることができます。特に、 'ax'は' eh'の "上位" 16ビットではなく、 'ah:al'と同じ16ビットを指します。 –

+0

ああ、あなたは正しい、それは私が混乱していたものです。だから本質的に私がしたいことは 'AX 'に' BX'を乗じて、私の製品は 'EAX'に入れるべきですか? – StartingGroovy

関連する問題