9

MULいくつかのチュートリアルと例を読みましたが、命令がどのように機能するかについて頭を悩ませることはできません。使っていて問題ADDありませんSUB。したがって、明らかに、この命令はオペランドにレジスタの値を乗算します。

第 1 オペランドで乗算されるレジスタ (eax、ebp、esp など) は何ですか? 結果はどのレジスタに格納されるので、スタックに移動できますか? 申し訳ありませんが、私はちょうど x86 アセンブリを学んでいます。

この行をコンパイルしようとすると...

mul     9

わかりましたError: suffix or operands invalid for 'mul'。誰でも私を助けることができますか?

    global  main
    main:
    push    ebp
    movl    ebp, esp
    sub     esp, byte +8
    mov     eax, 7
    mul     9
    mov     [esp], eax
    call    _putchar
    xor     eax, eax
    leave
    ret
4

6 に答える 6

13

MUL は、即値を引数として使用できません。たとえば、「9」をレジスタにロードする必要があります。

 movl    $7, %eax
 movl    $9, %ecx
 mull    %ecx

これにより、eax に ecx が乗算され、64 ビットの積が edx:eax に格納されます。

Intel の Web サイトには、x86 のアセンブリ手順に関する優れた包括的なリファレンスがあります。ここを参照してください。

http://www.intel.com/Assets/PDF/manual/253666.pdf

http://www.intel.com/Assets/PDF/manual/253667.pdf

しかし、それはおそらくあなたが今必要としているよりもはるかに多くの情報です.

于 2010-12-25T05:50:36.970 に答える
3

私は専門家ではありませんが、あなたの問題はmul、あなたの場合、10進定数9の直接オペランドを受け入れないことだと思いますので、9を入れてみてください。

mov bx, 9
mul bx

mul一般的な質問に答えるには、次のようになります。

mul     reg/memory

そしてそれをします:

dx:ax := ax*reg/mem

したがって、単語では、レジスタまたはメモリの場所(乗算する値を格納するため、本質的に変数)のいずれかである単一のオペランドを期待し、それをaxで乗算し、レジスタ/メモリの長さに応じて(オペランドは与えられた) ax または dx:ax または edx:eax のいずれかに格納されました

お役に立てば幸いです!

于 2011-05-19T20:59:01.210 に答える
3

http://siyobik.info/index.php?module=x86&id=210

デスティネーション オペランドは、レジスタ AL、AX、または EAX にある暗黙のオペランドです (オペランドのサイズによって異なります)。ソースオペランドが汎用レジスタまたはメモリ位置にある

結果はレジスタ AX、レジスタ ペア DX:AX、またはレジスタ ペア EDX:EAX (オペランド サイズに応じて) に格納され、積の上位ビットはそれぞれレジスタ AH、DX、または EDX に格納されます。積の上位ビットが 0 の場合、CF フラグと OF フラグはクリアされます。それ以外の場合、フラグが設定されます。

ソースでは、mul代わりにmull

于 2010-12-25T04:12:36.583 に答える
1

私のお気に入りの読みやすいが完全な x86 のリファレンスへのリンクを提供します: http://www.ousob.com/ng/iapx86/ng1840d.php

于 2010-12-25T06:04:09.040 に答える
0

それが不可能であることを確認するためにインテルのマニュアルを読む方法

まずインテルのマニュアルをダウンロードします。現在のダウンロード ページは次のとおりです

私たちが必要としているのは、すべての命令を含む結合ボリューム 2 命令セット リファレンス AZ です。

そのマニュアルで、 のドキュメントを見つけますDIV命令DIVの下に次の形式があることがわかります。

  • DIV r/m8
  • DIV r/m16
  • DIV r/m32
  • DIV r/m64

r/mXサイズ X のレジスタまたはメモリ位置を使用できることを意味します。

したがって、immX即値またはリテラルである を取る形式はありません。

そのため、その命令をプロセッサにエンコードすることはできず、レジスタまたはメモリを通過するしか方法がないことがわかりました。

レジスターの方が速いので、可能であればもちろん使用します。

于 2015-09-20T21:21:13.137 に答える