web-dev-qa-db-ja.com

アセンブリのMUL関数

私はアセンブリで単純な乗算アクションを作成しようとしていますが、何らかの理由で、MUL関数がマークされているときにレジスタが変更されません。

mov bx, 5    
mov cx, 10

mul cx
6
James Clark

これらはinstructionsと呼ばれ、プロセッサによって実行されるoperationsを指定します。 movmov eのニーモニックで、mulmul tiplyのニーモニックです。他の一般的な命令には、addsub、およびdivが含まれます。これらがどのような操作を指定しているかを理解できると信じています!

ほとんどの命令は2つのパラメーターを取ります。技術用語では、これらはしばしばoperandsとして知られています。最初(左側)はdestinationで、2番目(右側)はsourceです。したがって、mov bx, 5の場合、これはリテラル値5をデスティネーションレジスタbxに移動します。もちろん、レジスターbxの内容をリテラル値5に移動できなかったため、これらのパラメーターの順序は重要です。

mul命令は、そのオペランドの一部が暗黙的であるため、少し奇妙です。つまり、パラメータとして明示的に指定されていません。 mul命令の場合、デスティネーションオペランドはaxレジスタとしてハードコードされています。ソースオペランドは、パラメータとして渡すものです。レジスタまたはメモリの場所のいずれかです。

したがって、mul cxmul ax, cxを意味すると想像できますが、axデスティネーションレジスタが暗黙的であるため、そのようには書きません。

現在、mul命令は、宛先オペランドにソースオペランドを乗算し、結果を宛先に格納するようにプロセッサに命令します。コードでは、mul cxax = ax * cxに変換されると想像できます。これで問題が表示されるはずです。axレジスタの内容を初期化していないため、cxに残っているゴミで10(axに配置した値)を掛けています。そのため、結果は無意味です!

実際に5 * 10を実行したい場合は、コード内の1文字を変更するだけです。

mov  ax, 5     ; ax = 5
mov  cx, 10    ; cx = 10
mul  cx        ; ax = ax * cx

結果は、axに保存されます。これは、暗黙的なデスティネーションレジスタです。技術的には、結果はdx:axに保存されます。これはレジスタペアであり、結果の上位部分はdxに格納され、結果の下位部分はaxに格納されます。なぜこの余分な合併症なのか? 2つの16ビット値を乗算すると、16ビットより大きい値になる可能性があるためです! 16ビットレジスタのpairで結果を返すと、mul命令が32ビットの結果を返すことができます。ただし、学習しているときは、これについて心配する必要はありません。オーバーフローの可能性を無視して、結果の下位部分をaxから抽出できます。

これは単なるおもちゃの例であると確信していますが、2つの定数を乗算するcodeを記述する理由は本当にありません。これは、ビルド時に、電卓を使用して値をハードコーディングするか、定数の乗算をシンボリックに書き出してアセンブラに計算を行わせることで、実行できます。つまり、mov ax, 50です。しかし、私が言ったように、あなたはすでにこれを知っていたと確信しています!

他のすべてが失敗した場合は、トラブルを引き起こしている指示についてドキュメントを参照してください。ほとんどの場合、命令の名前と「x86」をグーグルで検索してオンラインで見つけることができます。たとえば、mulのドキュメントは here 、および他のいくつかのサイトにあります。この情報はやや複雑かもしれませんが、少し手間をかけると、必要な情報を抽出できるはずです。 x86 タグwikiには、他にも多くのすばらしい情報とリンクがあります。

しかし、何らかの理由で、MUL関数がマークされているときにレジスタが変更されないことがわかります。

また、デバッガーを使用してコードをステップ実行する場合、現在マーク/強調表示されている行は、実行するaboutの行であることも指摘しておく必要があります。まだ実行されていないため、レジスタ、メモリなどへの影響はまだ表示されません。マーク/ハイライトがnext行にあるように、命令をステップオーバーする必要があります。その後、前の(実行された)命令の効果が表示されます。

上記の私の説明を理解した場合は、mul命令の後に、axおよびdxレジスタの内容が変更されていることがわかります。デバッガーがフラグのいずれかを表示している場合は、フラグと命令ポインターの変更も表示されます。他に何も変わらないはずです! (Intelの取扱説明書には、マシンのアーキテクチャ状態に対する他の影響は記載されていません。)

30
Cody Gray