program tip

레지스터 자체를 XOR하는 목적은 무엇입니까?

radiobox 2020. 8. 4. 07:38
반응형

레지스터 자체를 XOR하는 목적은 무엇입니까? [복제]


xor eax, eax항상 eax0으로 설정 됩니까? 그렇다면 왜 MSVC ++가 때때로 그것을 실행 파일에 넣는가? 더 효율적 mov eax, 0입니까?

012B1002  in          al,dx 
012B1003  push        ecx  
    int i = 5;
012B1004  mov         dword ptr [i],5 
    return 0;
012B100B  xor         eax,eax 

또한, 무슨 뜻 in al, dx입니까?


예, 더 효율적입니다.

opcode는 mov eax, 02 바이트 보다 짧으며 프로세서는 특수한 경우를 인식하여에 mov eax, 0대한 잘못된 읽기 종속성없이 처리 eax하므로 실행 시간이 동일합니다.


또한 버퍼 오버플로 등을 악용하기 위해 쉘 코드에서 사용되는 것처럼 컴파일 될 때 0을 피하기 위해. 왜 0을 피합니까? 음, 0은 c / c ++에서 문자열의 끝을 나타내며, 악용 평균이 문자열 처리 함수 등이면 쉘 코드가 잘립니다.

Btw im은 "xor eax, eax"를해야하는 이유는? MSVC ++ 컴파일러의 기능이 아닙니다.

이것이 실제로 어떻게 적용되는지에 대한 의견에 대한 토론이 있기 때문에이 기사위키 백과에 대한이 섹션을 참조하십시오 .


xor eax, eaxeax0 으로 설정하는 가장 빠른 방법입니다 . 이것은 0을 반환하기 때문에 발생합니다.

in명령은 I / O 포트 물건을하고있다. 기본적으로 지정된 포트에서 데이터 단어를 읽고에 dx저장합니다 al. 왜 이런 일이 일어나고 있는지 명확하지 않습니다. 여기 에 자세히 설명 하는 참조 가 있습니다.


XOR 작업은 실제로 매우 빠릅니다. 결과가 레지스터를 0으로 설정하는 경우 컴파일러는 종종 가장 빠른 방법으로 레지스터를 수행합니다. XOR과 같은 비트 연산은 하나의 CPU 주기만 소요 할 수 있지만 한 레지스터에서 다른 레지스터로 복사하는 데 약간의 시간이 걸릴 수 있습니다.

종종 컴파일러 작성자는 대상 CPU 아키텍처가 다르면 동작이 다를 수 있습니다.


의존성 체인 을 사용 XOR reg, reg하거나 XORPS reg, reg중단해야하는 또 다른 이유 는 CPU가 어셈블리 명령의 병렬 실행을보다 효율적으로 최적화 할 수있게 해줍니다 (명령 처리량을 더 많이 추가하더라도).


OP> "xor eax, eax"를 수행해야하는 이유는 0을 반환합니다. 012B100B xor eax, eax ret <-OP에 표시되지 않음

XOR EAX, EAX는 단순히 EAX 레지스터에서 0이며 MOV EAX보다 빠르게 실행되며 $ 0이며 eax에로드하기 위해 0의 즉각적인 데이터를 가져올 필요가 없습니다.

MSVC가 EAX를 최적화하고 있다는 것이 "반환 0"이라는 것은 매우 분명합니다. EAX는 MSVC의 함수에서 값을 반환하는 데 사용되는 레지스터입니다.


xor는 종종 예를 들어 코드를 암호화하는 데 사용됩니다

      mov eax,[ecx+ValueHere]
      xor eax,[ecx+ValueHere]
      mov [ebx+ValueHere],esi
      xor esi,[esp+ValueHere]
      pop edi
      mov [ebx+ValueHere],esi

XOR 명령어는 논리 배타적을 사용하여 두 값을 연결하거나 OR을 포함하거나 OR을 사용합니다

      1001010110
      0101001101

OR로 처리하면 결과는 1100011011입니다. 서로 위에있는 두 비트가 같으면 결과 비트는 0입니다. 그렇지 않으면 결과 비트는 1입니다. calc.exe를 사용하여 XOR을 계산할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/1396527/what-is-the-purpose-of-xoring-a-register-with-itself

반응형