1

私は現在のマシンで古いプロジェクトをコンパイルしようとしています。この古いプロジェクトが古い(2.x)バージョンのGCC / GASを使用していたことを知っているので、現在のバージョンでコンパイルできるようにクリーンアップする必要があります。

問題のコード:

__get_flags:
    pushfl
    popl %eax
    ret

gaspushflそれは指示ではないと文句を言います。私が読んだところによると、これは古い非推奨のGNUニーモニックですが、x86_64に相当するものがあるはずです。

pushflこのコードをx86_64ガスに変換する方法に答えるだけでなく、ニーモニックがどこでどのようにpushfq定義され、文書化されているかを誰かが説明できれば素晴らしいと思います。それがGASの作品だと確信しています...

注:これをgcc4.6.1とgas2.21でコンパイルしたい

4

2 に答える 2

2

以下:

static inline u16 __get_flags(void) {
    u16 flags;
    asm ("pushf\n\t"
         "pop %0" : : "+r"(flags) : "cc");
    return flags;
}

実際には、64/32 ビット、x64/x86 の両方で移植可能である必要があります。ただし、状態レジスタの上位部分ではなく、条件コードのみを取得します。64 ビット (ロング) モードで実行しているときにフラグ レジスタの内容全体が必要な場合は、PUSHFQ命令名とu64(またはその他の 64 ビット量の) オペランドを使用します。

于 2011-07-26T16:07:05.383 に答える
0

評判が50に達していないため、回答にコメントを追加できません。ともかく:

答えでは:

"pop %0" : : "+r"(flags) : "cc");

読むべき:

"pop %0" : "=r"(flags) : : "cc");

構文がasm( code : outputs : inputs : clobbers )あり、必要なのは、フラグが asm ブロックからの出力であり、入力として使用されないレジスタであるためです。(これをテストしたところ、うまくいきました。64ビットintも使用しました)

于 2014-11-27T04:43:36.873 に答える