2014-12-13 13 views
1

"xchg rax, rax"(xchg.xorpd.net)의 수수께끼를 풀고 있습니다. 이것들은 x86_64 어셈블리에 대한 수수께끼입니다. 여기서 코드 조각이 무엇인지 이해해야합니다. 이 수수께끼 번호 0x15입니다 :이상한 상수를 가진 작은 asm 코드 이해

이 코드는 내가 완전히 이해가 안 돼요하지만, 어떤 방법으로 RAX 내부의 가치를 향상하기위한 것입니다 것 같다
mov  rdx,0xffffffff80000000 
add  rax,rdx 
xor  rax,rdx 

. 일부 입출력을 시도했지만 아직이 코드의 기능을 이해하지 못했습니다. 이 0xffffffff80000000 번호는 무엇입니까? 누군가가 솔루션의 올바른 방향으로 나를 가리킬 수 있습니까? 나는 이것에 대해 정말로 궁금해.

+0

(xorpd가 제공하지 않는) 컨텍스트가 없으면 말하기 어렵습니다. 32 비트 숫자를 가져다가 가장 중요한 비트를 설정하면 -2,147,483,648이됩니다. 이 값을 64 비트 숫자로 나타내면 FFFFFFFF80000000이됩니다. 그게 무슨 의미가 있을까요? 던노. 유일한 사용은 64 비트 숫자 (양수와 음수)를 32 비트 숫자로 변환하는 정말 이상한 방법입니다. FWIW. –

답변

1

"개선"이 의미하는 바가 무엇인지 확실하지 않지만, rax의 상반부를 0으로 가정하면 eax의 부호가 rax으로 부호 확장됩니다.

먼저 0x80000000을 추가 한 다음 0x80000000을 xoring하면 eax에 아무런 영향을주지 않습니다. 둘 다 가장 높은 비트를 반전시키고 짝수 개의 반전은 취소됩니다.

하지만 64 비트이므로 뭔가가 발생합니다. 추가는 상반부의 최하위 비트까지 수행 할 수 있습니다.

지금
mov edx, 0x80000000 
add rax, rdx 
xor rax, rdx 
mov rdx, 0xffffffff00000000 
add rax, rdx 
xor rax, rdx 

처음 두 지침은 상반신의 최하위 비트에 eax의 부호의 사본을 가하고, 33 비트에 로그인 확장 :

은의 그들이 쓴 척하자, 그것을 간단하게하려면 rax입니다. 따라서 상반부는 eax의 부호에 따라 0 또는 1 중 하나입니다.

마지막 두 줄은 보통 -x = ~(x - 1)처럼 보이지만 위쪽 절반에만 적용되어 1을 모든 것으로 바꿉니다.

이 단계들을 결합하여 원본 코드를 얻을 수 있습니다.

또는 반절로 잘라 내기가 아니라 "반 이하"로 잘라 내기 때문에 부정적인 처리가 eax의 가장 높은 비트부터 시작하는 33 비트 숫자에 적용됩니다.

+0

쿨, 로그인 확장! 이것은 CDQE가하는 것입니다. 고마워요 :) – dedthecool

+0

@ cdece 여전히 잘게 이상한 결과를 만드는 동안 상반기가 0이 아닌 경우 서명 확장합니다. – harold