2017-01-31 8 views
0

cmoveを私が望むように動作させることができないようです。私はこのコードのビットがありますcmovのオペランドタイプの不一致

cmove $1, %eax 

をそして私は、コンパイルでこのエラーを取得する:

Error: operand type mismatch for `cmove' 

しかし、完璧に動作mov、と言う、とcmoveを交換し、

mov $1, %ecx 
cmove %ecx, %eax 

作品あまりにも。私もcmovelを使ってみましたが、うまくいきません。何か不足していますか?

+0

は、必然的にあなたがスクラッチ・レジスタを壊しする必要がありますことを意味します。 2番目のスニペットは、ecxをスクラッチレジスタとして使用して、これを行う方法です。 'mov'命令がフラグに影響を与えたことがないので、これはどのように動作するかよく注意してください、あなたは常に(フラグを設定する)テストと条件付き移動の間に、それを挿入することができます。 –

答えて

2

何か不足していますか?引数の組み合わせとしてr32,imm(またはr/m32,immを)受け入れるcmoveの形があることがあるだろうに動作するcmove $1,%eaxについては

。しかしIntel's manualに記載されているcmoveの唯一の有効な形式は以下のとおりです。CMOVccの説明で

CMOVE r16, r/m16 
CMOVE r32, r/m32 
CMOVE r64, r/m64 

彼らはこれを綴る:

をこれらの命令は、16ビット、32ビットまたは64ビットを移動することができます値をメモリから汎用レジスタに、または1つの汎用レジスタから別の汎用レジスタに転送します。効果的に `cmov`命令を使用して

+0

それは私が間違っていることではない、ちょうどそのように動作しない...ああ。 – Akiiino

関連する問題