5

NASMソースをGASに「移植」していて、次のコード行が見つかりました。

push byte 0
push byte 37

GASは「pushbyte」または「pushb」を許可しません。

上記のコードをGAS構文に変換するにはどうすればよいですか?

ありがとう

4

2 に答える 2

4

pushbGASから削除されました。pushこのコマンドを使用して、同じ効果を得ることができるはずです。もう少し情報はここにあります。

于 2009-04-05T01:20:48.710 に答える
3

1) push byte NASM 2.11 では、64 ビットは単に と同じようにコンパイルさpushれますが、プッシュされたものが 1 バイトより大きい場合はコンパイルを拒否します。

push 0x0000
push 0x01
push 0x0001
push 0x10

以下と同じです:

push byte 0x0000
push byte 0x01
push byte 0x0001
push byte 0x10

しかし、以下は失敗します:

push byte 0x0100
push byte 0x1000
push byte 0x01000000
push byte 0x10000000

6a XXそれらはすべて命令の形式にコンパイルされます。

2) NASM と GAS は、オペランドのサイズに基づいて、使用する形式を自動的に決定します。

GAS 2.25:

push $0x0000
push $0x01
push $0x0001
push $0x10
push $0x0100
push $0x1000
push $0x01000000
push $0x10000000

NASM と同じようにコンパイルします。

push 0x0000
push 0x01
push 0x0001
push 0x10
push 0x0100
push 0x1000
push 0x01000000
push 0x10000000

オブジェクトダンプ:

   0:   6a 00                   pushq  $0x0
   2:   6a 01                   pushq  $0x1
   4:   6a 01                   pushq  $0x1
   6:   6a 10                   pushq  $0x10
   8:   68 00 01 00 00          pushq  $0x100
   d:   68 00 10 00 00          pushq  $0x1000
  12:   68 00 00 00 01          pushq  $0x1000000
  17:   68 00 00 00 10          pushq  $0x10000000

したがって、GAS だけでは NASMpushと同じですが、エラー チェックはありません。push byte

3) GAS に存在する修飾子w次のとおりです。

pushw $0

これは次のようにコンパイルされます:

0:   66 6a 00                pushw  $0x0

つまり、0x66プレフィックスを追加して 16 ビット操作をトグルします。

NASM に相当するものは次のとおりです。

push word 0

4)との違いmovは、任意のプッシュ サイズを制御できないことです。それらはすべて固定量をスタックにプッシュします。

命令エンコーディングで制御できる唯一のパラメーターは、0x66プレフィックスを含めるかどうかだけです。

残りは、セグメント記述子によって決定されます。Intel 64 and IA-32 Architectures Software Developer's Manual - Volume 2 Instruction Set Reference - 325383-056US September 2015 を参照してください。

于 2015-11-09T16:59:26.973 に答える