2011-11-02 2 views
4

어셈블리 코드를 연구하는 동안 아래 코드 세그먼트를 보았습니다. 나는 약간 혼란 스럽다.

mov $0x0, %ecx 
lea 0x3(%rdi), %eax 
cmp $0xffffffffffffffff, %edi ; ??? 
cmovle %eax, %rdi 

나는 행을 ???으로 표시했습니다. 그 라인이 어셈블리 코드에서 왜 사용되는지 이해하지 못합니다.

조립 : 86 64 비트

편집 : 내 코드되지 않은 비교를해야합니다. 이런 이유로, 나는 왜 생각해?

참고 : 해당 질문에 대한 관련 제목을 찾지 못했습니다. 도와 주시고 알려 주시기 바랍니다. 그래서,

+4

그것은'에 대한 비교처럼 보이는 -1'. – Mysticial

+0

이것을 생성하는 코드를 보여줄 수 있습니까? – Mysticial

+0

@ 신비로운, 나는 할 수 없다. 용서 해줘. 나는 코드가 아닌 집을 떠나기 전에 질문지 만 받았다. –

답변

3

가 실제로 상수 $0xffffffffffffffff와 레지스터 %edi 비교를 변경할 수 있습니다 상수 -1

+2

64 비트 2의 칭찬 값에 대해서만 -1이라는 점을 강조해야합니다. – Arafangion

+2

... 그리고 나서 다음 명령어 (CMOVLE)는 EDI가 -1보다 작거나 같은 조건에서 EAX의 내용을 RDI로 복사합니다 (CMP 명령어가 FLAGS 레지스터에서 비교 결과를 설정하기 때문에이를 확인할 수 있음)). Btw, 나는 약간의 피연산자 크기 불일치 (LEA에서는 RDI & EAX, CMP에서는 64 비트 -1 & EDI, CMOV에서는 EAX & RDI)를 보니 조금 놀랐습니다. 나는 그들 모두가 64 비트 또는 32 비트를 기대한다. 위 (dis) 어셈블리가 맞습니까? –

+0

네 줄의 세 가지 오류, @OP 텍스트를 복사 할 때 좀 더주의해야합니다. – hirschhornsalz

관련 문제