IT

테스트 포인트 % eax % eax

lottoking 2020. 7. 16. 07:53
반응형

테스트 포인트 % eax % eax [중복]


가능한 연장 :
x86 어셈블리 -eax에 대한 'testl'eax?

저는 어셈블리 언어 프로그래밍을 처음 접하고 현재 바이너리에서 생성 된 어셈블리 언어를 개발하려고합니다. 나는 가로 질러

 test   %eax,%eax

또는 test %rdi, %rdi등등. 나는 이것이하는 일에 매우 혼란 스럽습니다. %eax, %eax이 같지 보장 보장? 테스트 란 무엇입니까? 나는 그것이 AND작업을 읽었습니다 .... ...하지만 그들이 그런 값이기 때문에 반환되는 %eax곳이 있습니까?

다음은이 사용법을 하나의 인스턴스입니다.

   400e6e:       85 c0                   test   %eax,%eax
   400e70:       74 05                   je     400e77 <phase_1+0x23>

je비교되는 두 값이 같으면 점프 생각했습니다. %eax, 그 자체로드 어떤 상황에서 우리는 점프하지 않습니까?

나는 일반적으로 프로그래밍됩니다. 그래서 누군가에게 감사하겠습니다. 감사합니다!


CMP피 연산 튼 빼고 플래그를 설정합니다. 즉, 차이가 0 인 경우 (피연산자가 같으면) 영 플래그를 설정합니다.

TESTZFAND 연산의 결과가 0 일 때 0 플래그를 설정합니다 . 두 피연산자가 같으면 둘 다 0 일 때 비트 AND가 0입니다. TEST또한 SF결과에 최상위 비트가 최고 경우 부호 플래그 PF를 설정하고 비트 수가 짝수 이면 패리티 플래그 를 설정합니다.

JE[같으면 점프]는 제로 플래그를 테스트하고 플래그가 설정되면 점프합니다. JEJZ[Jump if Zero] 자동 디스어셈블러가 opcode에 따라 하나를 선택할 수 없습니다. JE인수 CMP가 같으면 플래그 가 설정 이름 이 동일합니다.

그래서,

TEST %eax, %eax
JE   400e77 <phase_1+0x23>

%eax가 0 이면 점프합니다 .


일부 x86에서는 피연산자 (레지스터)의 내용을 그대로두고 제로 플래그 (ZF)와 같은 특정 내부 CPU 플래그를 설정 / 설정 해제하도록 설계되었습니다. ZF를 CPU 내부에있는 참 / 거짓 부울 플래그로 생각할 수 있습니다.

이 경우 TEST에서는 비트 단위 논리 AND를 수행하고 실제 결과를 버리고 논리 결과에 따라 ZF를 설정 / 설정 해제합니다. 결과가 0이면 ZF = 1로 설정되고, ZF = 0으로 설정됩니다.

JE와 같은 조건부 점프 명령은 점프 / 노 점핑을 위해 ZF를 보도록 설계되어 TEST와 JE를 함께 사용하면 특정 데이터의 값을 기반으로 조건부 점프를 수행하고 있습니다.

예 :

TEST EAX, EAX
JE some_address

CPU는 ZF = 1 인 경우에만 "some_address"로 점프합니다. 즉, AND (EAX, EAX) = 0 인 경우에만 EAX == 0 인 경우에만

해당 C 코드가 :

if(eax == 0)
{
    goto some_address
}

EAX0 인지 확인합니다 . 명령어 testAND인수 사이에서 비트 단위로 수행 되며 EAX0 포함 된 경우 결과는 ZF 또는 ZeroFlag를 설정합니다.


당신은 옳습니다 test. 그 두 피연산자입니다. 그러나 결과는 버려지고, 유일하게 남아있는 유일한 것은 플래그입니다. 이것이 설정되고 그것이 test사용되는 이유 입니다.

JE같을 때 점프하지 않고 (이전 명령이 비교했을 때 의미가 있음) 실제로 수행하는 것은 플래그 ZF가 설정 되면 점프합니다 . 그리고에 의해 집합 플래그 중 하나 test, 이급 시퀀스 (test x, x; je ...)는 x가 0 일 때 점프 의미를 갖습니다.

이와 같은 질문에 대한 자세한 내용은 x86 명령에 대한 책을 추천 할 수 있습니다. 예를 들어 실제로 큰 경우 인텔 설명서는 매우 만족하고 있습니다.


test비파괴 적 and이며 연산 결과를 반환하지 않지만 그에 따라 일정을 설정합니다. 실제로 테스트 대상을 결정해야합니다. 0에 대해 우리는 종종 검사하는 데 사용되며 jz조건부 점프 와 결합 될 수 있습니다 .

참고 URL : https://stackoverflow.com/questions/13064809/the-point-of-test-eax-eax

반응형