1

アセンブリコードは

mov eax, 0x3a14a5
jmp eax

GAS は次のオペコードを生成します。

0xB8, 0xA5, 0x14, 0x3A, 0x00 
0xFF, 0xE0

一方、NASM は次のオペコードを生成します

0x66, 0xB8, 0xA5, 0x14, 0x3A, 0x00 
0x66, 0xFF, 0xE0

したがって、NASM がコードの前に 0x66 を追加していることがわかります。私のプログラム (詳しくは説明しません) 内で、GAS オペコードは正しく機能し、NASM コードはこれら 2 つのオペコードが等しくないことを示すクラッシュを引き起こします。NASM が 0x66 をプリアペンドするのはなぜですか?どうすればそれを取り除くことができますか?

更新:bits 32ディレクティブは機能しました。迅速な返信、リンク、説明をありがとう!

4

2 に答える 2

3

http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html :

コード o16 および o32 は、指定された形式の命令をオペランド サイズ 16 または 32 ビットでアセンブルする必要があることを示します。つまり、o16 は BITS 32 状態では 66 プレフィックスを示しますが、BITS 16 状態ではコードを生成しません。o32 は BITS 16 状態の 66 プレフィックスを示しますが、BITS 32 では何も生成しません

MOV 命令のエンコード:

MOV reg32、imm32 ; o32 B8+r id

どうやらビット16モードになっているようです。ファイルの前にビットフラグを追加してみてください。

bits 32
于 2013-06-27T16:46:34.473 に答える