2017-01-31 9 views
0

cmove을 원하는 방식대로 작동시키지 못했습니다. 나는 코드의이 비트가 :cmov에 대한 피연산자 유형 불일치

cmove $1, %eax 

을 그리고 편집에서이 오류가 발생합니다 : mov 완벽하게 작동, 말과 cmove 교체, 그러나

Error: operand type mismatch for `cmove' 

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

작품 너무. cmovel도 사용하려고했지만 작동하지 않습니다. 내가 놓친 게 있니?

+0

'cmov' 명령어를 사용하는 것은 필연적으로 스크래치 레지스터를 clobber해야한다는 것을 의미합니다. 두 번째 발췌 문장은'ecx'를 스크래치 레지스터로 사용하여이 작업을 수행하는 방법입니다. 'mov' 명령어가 플래그에 영향을 미치지 않기 때문에이 함수가 얼마나 잘 작동하는지주의하십시오. 그래서 당신은 언제든지 (플래그를 설정하는) 테스트와 조건부 - 이동 사이에 삽입 할 수 있습니다. –

답변

2

내가 누락 된 항목이 있습니까? cmove $1,%eax를 들어

는 인수 조합으로 r32,imm (또는 r/m32,imm)를 받아 cmove의 형태가있을 거라고 작동합니다. 그러나 Intel's manual에 나와 cmove의 유일한 유효 형태는 다음과 같습니다 CMOVcc에 대한 설명에서

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

들이이 밖으로 철자 :

이 지침은 16 비트, 32 비트 또는 64 비트를 이동할 수 있습니다 값을 메모리에서 범용 레지스터 또는 하나의범용 레지스터에서 다른 레지스터로 옮깁니다.

+0

그래서 내가 잘못한 게 아니라 그냥 그런 식으로 작동하지 않습니다. 오. – Akiiino