레지스터 자체를 XOR하는 목적은 무엇입니까? [복제]
이 질문에는 이미 답변이 있습니다.
xor eax, eax
항상 eax
0으로 설정 됩니까? 그렇다면 왜 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, 0
2 바이트 보다 짧으며 프로세서는 특수한 경우를 인식하여에 mov eax, 0
대한 잘못된 읽기 종속성없이 처리 eax
하므로 실행 시간이 동일합니다.
또한 버퍼 오버플로 등을 악용하기 위해 쉘 코드에서 사용되는 것처럼 컴파일 될 때 0을 피하기 위해. 왜 0을 피합니까? 음, 0은 c / c ++에서 문자열의 끝을 나타내며, 악용 평균이 문자열 처리 함수 등이면 쉘 코드가 잘립니다.
Btw im은 "xor eax, eax"를해야하는 이유는? MSVC ++ 컴파일러의 기능이 아닙니다.
이것이 실제로 어떻게 적용되는지에 대한 의견에 대한 토론이 있기 때문에이 기사 와 위키 백과에 대한이 섹션을 참조하십시오 .
xor eax, eax
eax
0 으로 설정하는 가장 빠른 방법입니다 . 이것은 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
'program tip' 카테고리의 다른 글
Google 인증 API 액세스 토큰을 확인하려면 어떻게합니까? (0) | 2020.08.04 |
---|---|
Array_merge (0) | 2020.08.04 |
PHP에서 float과 double의 차이점은 무엇입니까? (0) | 2020.08.04 |
왜 scss / css에서 파일 이름“_”또는“_”앞에 두어야합니까? (0) | 2020.08.04 |
Facebook 로그인 메시지 : "URL 차단됨 : 리디렉션 URI가 앱의 클라이언트 OAuth 설정에 허용되지 않기 때문에이 리디렉션에 실패했습니다." (0) | 2020.08.04 |