1

私はmasm615アセンブラとテキストパッドをエディタとして使用しています。私は32ビットのアセンブリプログラムを書いています。mulプログラムでは、命令の結果としてゼロフラグを設定しようとしていますが、機能していません。eaxレジスタの結果がゼロであるのにゼロフラグがクリアされる理由を誰か教えてください。次のコードを試しています

    include irvine32.inc
    .data
    .code
    main proc
    xor eax,eax
    call dumpregs
    xor ebx,ebx
    call dumpregs
    mov eax,2
    call dumpregs
    mov ebx,3
    call dumpregs
    sub eax,2
    call dumpregs
    mul ebx
    call dumpregs
    exit
    main endp
    end main
4

1 に答える 1

2

プログラムでは、mul命令の結果としてゼロフラグを設定しようとしています

このmul命令は、ゼロフラグが設定、クリア、または変更されないままであるかどうか、またはその時期について何も定義していません。Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2 page 3-594、またはその HTML スクレイプを参照してください。

MUL - 符号なし乗算

...

影響を受けるフラグ

結果の上半分が 0 の場合、OF フラグと CF フラグは 0 に設定されます。それ以外の場合は 1 に設定されます。SF、ZF、AF、および PF フラグは未定義です。

疑問がある場合は、常に開発者マニュアルの説明文書を確認してください。すべての命令が、予想されるフラグや予想される方法に影響を与えるわけではありません。

未定義は、異なる CPU が異なる可能性があることを意味します。たとえば、いくつかのテスト ケースでは、Skylake は出力または以前の値に関係なく ZF=0 を設定します。その CPU が ZF=1 を設定する状況が発生する可能性はありますが、ほとんどありません。そしてもちろん、他のベンダー (またはエミュレーター) の他の CPU は、好きなことを何でもできます。

しかし、C の「未定義の動作」とは異なり、これは単なる未定義のです。まだ0か1です。

于 2014-09-18T06:32:09.967 に答える