NASMソースをGASに「移植」していて、次のコード行が見つかりました。
push byte 0
push byte 37
GASは「pushbyte」または「pushb」を許可しません。
上記のコードをGAS構文に変換するにはどうすればよいですか?
ありがとう
NASMソースをGASに「移植」していて、次のコード行が見つかりました。
push byte 0
push byte 37
GASは「pushbyte」または「pushb」を許可しません。
上記のコードをGAS構文に変換するにはどうすればよいですか?
ありがとう
pushb
GASから削除されました。push
このコマンドを使用して、同じ効果を得ることができるはずです。もう少し情報はここにあります。
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 を参照してください。