アセンブリコードを書いている時に、ときどきmulとdivがどういう使い方をするのかを忘れてしまうことがあるので、実際にコードを書いて挙動を調べてみました。
mulの場合(掛け算・乗算)
1 2 3 4 5 6 7 |
popq %r10 // 5が入ってる前提 popq %rax // 2が入ってる前提 mulq %r10 pushq %rax // 後から表示すると10になる |
この場合だと、raxが10になります。
これから、r10とraxかけた結果がraxに入っているということが分かります。
1 2 3 4 5 6 7 |
popq %r10 // 5が入ってる前提 popq %rax // 2が入ってる前提 mulq %r10 pushq %r10 // 後から表示すると5になる |
これから、r10とraxをかけた結果はraxに入りr10はそのままだということが分かります。
1 2 3 4 5 6 7 |
popq %r10 // 5が入ってる前提 popq %rax // 2が入ってる前提 mulq %rax pushq %rax // 後から表示すると4になる |
これから、raxとraxをかけた結果がraxに入っているということが分かります。
divの場合(割り算・乗算)
1 2 3 4 5 6 |
popq %r10 // 2が入っている popq %rax // 9が入っている前提 divq %r10 pushq %rax // 4が出力 |
これから、raxが割られる数でr10が割る数だということが分かります。
また、raxに割り算の商が入っていることが分かります。
1 2 3 4 5 6 |
popq %r10 // 2が入っている popq %rax // 9が入っている前提 divq %r10 pushq %r10 // 2が出力 |
これから、r10は割り算で使用された後でも値が保存されていることが分かります。