2016-10-24 3 views
1

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)?この他に、この問題の原因は何ですか?ありがとう!

+0

は&t構文では通常は 'movzx'を使用しませんが、いくつかのアセンブラバージョンではそれを受け入れることができます。それを 'movzbl 240(%r10)、%eax'に変更してみてください(バイトソースと仮定して)。 – Jester

+0

おそらく 'movzbq 240(%r10)、%rax'です。 – fuz

+2

@FUZxxlは自動ゼロ拡張のために過剰ですが、うまくいくはずです。レコードのために、私のアセンブラ(_GNUアセンブラ2.22_)も元の 'movzx'を受け入れます。 OSXのバージョンはそうではないかもしれません。 – Jester

答えて

2

&では、シンタックスでは通常movzxが使用されませんが、アセンブラのバージョンによってはそれを受け入れることができます。私のGNUアセンブラ2.22のコピーはありますが、おそらくOSXのバージョンはそうではありません。いずれの場合でも、アセンブラはバイトソース用のコードを生成します。もしあなたが実際にそれを持っていれば、&の構文での適切なものはmovzbq 240(%r10), %raxであるか、自動ゼロ拡張、movzbl 240(%r10), %eaxを利用するでしょう。

ソースが4バイトの場合、そのオペランドタイプには存在しないため、movzxはまったく使用できません。この場合に必要なのは自動ゼロ拡張だけなので、簡単にmovl 240(%r10), %eaxを実行できます。

関連する問題