AESのアセンブラベースの実装をコンパイルしようとしています。表示可能なのはhereです。私のアセンブラは、私に次のエラーを与えています。同じエラーのインスタンスに見えるものよりも何度か繰り返しました。正確なソースの場所はhereですが、これによるファイルで使用されるプリプロセッサ間接大量に、私は、コンパイラによって見られるような正確なコードを与え、私のビルド出力から、正確なエラーをコピーした:MOVXZをレジスタに - "無効な命令のオペランド"
/Volumes/Sources/Andromeda/Kernel/libkern/crypto/aes/EncryptDecrypt.s:297:19: error: invalid operand for instruction
movzx 240(%r10), %rax
^~~~
私はこの問題を引き起こしている可能性があることをよく理解していません。私が正しく理解していれば、この命令はRAXレジスタに1バイト(またはそれ以上、これは不明確で実際には問題の原因かもしれません)を移動し、ソースが64ビット未満の場合はゼロ拡張します。 movxz
命令にタグを追加して明示的にサイズを指定する必要がありますか(例:movzxb
)?この他に、この問題の原因は何ですか?ありがとう!
は&t構文では通常は 'movzx'を使用しませんが、いくつかのアセンブラバージョンではそれを受け入れることができます。それを 'movzbl 240(%r10)、%eax'に変更してみてください(バイトソースと仮定して)。 – Jester
おそらく 'movzbq 240(%r10)、%rax'です。 – fuz
@FUZxxlは自動ゼロ拡張のために過剰ですが、うまくいくはずです。レコードのために、私のアセンブラ(_GNUアセンブラ2.22_)も元の 'movzx'を受け入れます。 OSXのバージョンはそうではないかもしれません。 – Jester