1

3 つの数値を乗算するプログラムがあり、理解しようとしています。いくつか質問がありますが、誰かがプログラムで何が起こっているのかを説明し、私が正しい方向に進んでいるかどうか教えてくれることを願っています. 複数の質問があることは理解しています。申し訳ありません。

.data?
  num1 dd ?
  num2 dd ?
  num3 dd ?

.data
sum dd 0
prod dd 0

.code

start:



main proc


mov EAX, sval(input("Enter a number: "))
mov num1, EAX
mov EAX, sval(input("Enter a number: "))
mov num2, EAX
mov EAX, sval(input("Enter a number: "))
mov num3, EAX





mov EAX, num1
mov EBX, num2
mul BL                 

mov EBX, num3
mul BX              

mov prod, EDX

これは私を混乱させました...

mov EBX, num3
mul BX

では、num3 を BL に格納していますか? しかし、num1 と num2 の結果は 16 ビットであり、AX に格納されるため、BX を mul しますか? BLの代わり?BLでnum3じゃないの?

申し訳ありませんが、特定の質問はありません。私の論理が間違っているか近い場合は、何が起こっているのか、その理由を説明できますか?

ありがとうございました

4

1 に答える 1

3

のような 8 ビットの乗算を行う場合mul bl、 を取りal、それを指定された入力で乗算し、結果を に入れaxます。

のような 16 ビットの乗算を行う場合mul bx、 を取りax、それを指定された入力で乗算し、結果を に入れますdx:ax(つまり、結果の最上位 16 ビットを に、結果のdx最下位 16 ビットを にax)。

(完全を期すために): のような 32 ビットの乗算を行うとmul ebx、 を乗算eaxebx、結果を に入れedx:eaxます (はっきりとは覚えていませんが、64 ビットの乗算もほぼ同じように機能すると思います)。 .

BLvs.に関する限りBX(またはAL/ AH/AXなど)、実際には個別のレジスタではなく、実際ALには の最下位 8 ビットですAXAHAX の最上位 8 ビットです。BL は BX の最下位 8 ビット、BH は BX の最上位 8 ビットです (CL/CH/DL/DH についても同様)。

たとえば、次のようなコードを実行するとします。

xor bx, bx
mov bl, 1

BH は 0 ( によってゼロに設定xor bx, bx) になり、BL は 1 (mov によって設定) になり、bx も 1 になります (ビットパターン 00000000 00000001 が含まれるため)。

于 2012-07-15T00:25:06.730 に答える