-1

コマンドの後でステータス フラグを確認したいのですが、間違った値が表示されます。例: 126 と 127 ステータス フラグを追加した後、FFBA (初期 SF 値は FFFF) になりますが、... このコードを実行すると、7112 が返されます。

mov ax, 126
mov bx, 127
PUSHF
MOV dx, 0FFFFh
PUSH dx
POPF
add ax, bx
PUSHF
POP ax
POPF
4

2 に答える 2

3

それらのいくつかはシステムまたは予約されているため、フラグ (フラグレジスタ) に値をポップすることはできません!

ADD 命令の後に有効なフラグは、OF、SF、ZF、AF、PS、および CF です。

フラグレジスタビット:

    BIT  Flag   NAME
    0    CF     Carry flag  S
    1    1      Reserved     
    2    PF     Parity flag S
    3    0      Reserved     
    4    AF     Adjust flag S
    5    0      Reserved     
    6    ZF     Zero flag   S
    7    SF     Sign flag   S
    8    TF     Trap flag (single step) X
    9    IF     Interrupt enable flag   C
    10   DF     Direction flag  C
    11   OF     Overflow flag   S
    12,13 1,1   I/O privilege level (286+ only) always 1 on 8086 and 186
    14  1       Nested task flag (286+ only) always 1 on 8086 and 186
    15  1       on 8086 and 186, should be 0 above  Reserved
于 2011-12-12T16:44:34.933 に答える
2

エリマンタス、

GJ が回答したように、これらのフラグの一部は読み取り専用フラグであるため、レジスタ フラグに直接ポップ バックすることはできませんが、代わりにこれらのフラグの一部を個別に対象とする命令を使用します。

CLC - キャリー フラグのクリア

STC - キャリー フラグの設定

CLD - 方向フラグのクリア

STD - 方向フラグの設定

CLI - 割り込みフラグのクリア

STI - 割り込みフラグの設定

CMC - 補数のキャリー フラグ。CF の値を反転します。

LAHF - 下位 8 ビットのレジスタ フラグを使用して AH をロードします。

AH ビット: 7 6 5 4 3 2 1 0

    [SF] [ZF] [0] [AF] [0] [PF] [1] [CF]

SAHF - AH をレジスタ フラグの下位 8 ビットに格納します。

AH ビット: 7 6 5 4 3 2 1 0

    [SF] [ZF] [0] [AF] [0] [PF] [1] [CF]

フラグを確認し、これらのフラグのステータスに応じて適切なアクションを実行する場合は、次のように「条件付きジャンプ」を使用することをお勧めします。

JNZ, JZ, : ゼロフラグがそれぞれクリアまたはセットされている場合にジャンプします。

JNC、JC : キャリー フラグがそれぞれクリアまたはセットされている場合にジャンプします。

JNO, JO : オーバーフロー フラグがそれぞれ Clear または Set の場合にジャンプします。

JPE、JPO: パリティ フラグがそれぞれ偶数または奇数の場合にジャンプします。

その他の条件付きジャンプが存在する場合は、8086 命令リファレンスを確認してください。

もう 1 つ確認する必要があるのは、フラグ レジスタに影響を与える一連の命令です。ADD 命令だけでなく、このレジスタに影響を与える他の多くの命令も命令リファレンス マニュアルに記載されています。

最後に、フラグ レジスタから直接フラグを確認する場合は、次のようにします。

プッシュフ

ポップアックス; AX には、フラグ レジスタのステータスが含まれます。

これがお役に立てば幸いです。

カイロ - アルジェリア

于 2011-12-12T21:31:41.607 に答える