0

私はi386アーキテクチャでAT&T表記を使用してプログラミングしています。

1つの命令を使用して、キャリー、オーバーフロー、およびサインフラグを設定するために、2つの8ビット数を追加することは可能addですか?

この旗の組み合わせは無理だと思います。SフラグをOフラグと一緒に設定するには、両方の数値の最上位ビットが0であり、結果の最上位ビットが1である必要があります。最上位ビットの加算からキャリーを生成します。

このサイトで質問するのは初めてですので、何かおかしなことがあったらお詫び申し上げます。前もって感謝します。

編集:私は次の3つの指示しか使用できません:

movb $_, %ah
movb $_,%al 
addb %ah,%al

2つのアンダースコアを10進値で変更する必要があります。

編集:CF、OF、SF、およびZFのうち、CF、OF、およびSFのみを設定できます。キャリーフラグを設定できません。

(編集者注:その最後の文は意味がありません。それは、パリティまたはゼロフラグのタイプミスですか、それともCFをに設定できないことを意味しaddbますか?それaddは、ではなくadc、以前のフラグの状態に依存しません。回答が得られない可能性のある古い質問であるため、コメントで説明を要求するのではなく、これを編集として残します。「キャリーフラグを設定できません」に関する文を修正する場合は、このメモを編集してください。

4

2 に答える 2

4

でCF=SF=OF=1 を設定することはできませんadd ah, al。正式な証明はやや長くなりますが、単純な徹底的なテストにより、add命令の後のフラグ状態のそのような組み合わせが不可能であることが確認されます。


を使用POPF(D)して、算術フラグの任意の組み合わせを設定できます。この命令は、スタックから (d) ワードをポップし、それを に書き込みます(E)FLAGS

フラグレジスタには、算術演算とは関係のない他のフラグがあることに注意してください。通常は変更しないでください。したがって、通常は最初にレジスタの値を読み取り ( を使用PUSHF(D))、必要に応じて変更してから、上記のように書き戻します。

于 2013-03-11T02:39:33.617 に答える
0

編集:のみadd al,ahまたは他のものを使用するaddことは不可能です。

flags/eflagsをいくつかのレジスタにポップしてから、で必要なフラグを設定しor、レジスタをプッシュしてフラグにポップすることでそれを行うことができます。

16 ビット コード (NASM 構文) の場合:

pushf
pop ax
or ax,0x881
push ax
popf

32 ビット コードの場合:

pushfd
pop eax
or eax,0x881
push eax
popfd
于 2013-03-11T02:37:41.903 に答える