테스트 포인트 % 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 인 경우 (피연산자가 같으면) 영 플래그를 설정합니다.
TEST
ZF
AND 연산의 결과가 0 일 때 0 플래그를 설정합니다 . 두 피연산자가 같으면 둘 다 0 일 때 비트 AND가 0입니다. TEST
또한 SF
결과에 최상위 비트가 최고 경우 부호 플래그 PF
를 설정하고 비트 수가 짝수 이면 패리티 플래그 를 설정합니다.
JE
[같으면 점프]는 제로 플래그를 테스트하고 플래그가 설정되면 점프합니다. JE
는 JZ
[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
}
이 EAX
0 인지 확인합니다 . 명령어 test
는 AND
인수 사이에서 비트 단위로 수행 되며 EAX
0 이 포함 된 경우 결과는 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
'IT' 카테고리의 다른 글
경고 응답 본문의 내용 길이가 없습니다. (0) | 2020.07.16 |
---|---|
ERROR의 원인 : 참조 된 테이블에 대해 주어진 키와 일치하는 고유 제한 조건이 없습니까? (0) | 2020.07.16 |
부트 변형 유체 레이아웃에서 그리드 요소를 하단 정렬하는 방법 (0) | 2020.07.16 |
LINQ 란 무엇이며 어떤 역할을하고 있습니까? (0) | 2020.07.16 |
Eclipse에서 TODO / FIXME / XXX 작업 태그를 어떻게 활성화합니까? (0) | 2020.07.16 |