4

32ビットおよび64ビットのアセンブリ言語ファイルをgasからMASM形式に変換していますが、コード内で完全に問題があると思われる命令に遭遇しました。つまり、命令が比較を実行するためにメモリから8、16、32、または64ビットをフェッチするかどうかにかかわらず、アセンブラがオペランドのサイズを知る方法がわかりません。手順は次のとおりです。

  • cmp $ 0、8(%rsp)

命令が次のいずれかであった場合、アセンブラは、レジスタに基づいてフェッチおよび比較するメモリオペランドのサイズを把握できたはずです。

  • cmp%rax、8(%rsp)
  • cmp%eax、8(%rsp)
  • cmp%ax、8(%rsp)

命令はcmpb、cmpw、cmpl、cmpqである必要があると思っていたでしょう...しかし、いいえ、私のプログラムはcmp命令だけでそれをうまく組み立てます。残念ながら、私はこのコードが何をしているのか覚えていません、そしてそれは非常に明白ではありません...したがって、これを解決するより簡単な方法は、命令が何をしているのかを知ることです。

誰か知ってる?この構文(オペランドのサイズ/タイプが指定されていない)がイミディエートオペランドでも許可される理由を誰もが理解していますか?

4

1 に答える 1

3

なんらかのデフォルトが必要です。私は自分のマシンで試してみましたas

Apple Inc version cctools-836, GNU assembler version 1.38

そして、私はこれらの結果を得ます:

$ cat example.s 
    cmp $0, 8(%rsp)
$ make example.o
as   -o example.o example.s
$ otool -tV example.o
example.o:
(__TEXT,__text) section
0000000000000000    cmpl    $0x00,0x08(%rsp)

だから私のマシンでは、それは選んだcmpl。使用するのgccではなく使用asすると同じ結果が得られましたが、使用clangすると予想されるエラーが発生しました。

$ clang -c example.s 
example.s:1:2: error: ambiguous instructions require an explicit suffix (could be 'cmpb', 'cmpw', 'cmpl', or 'cmpq')
 cmp $0, 8(%rsp)
 ^
于 2013-01-14T23:51:24.587 に答える