2012-06-14 6 views
2

방금 ​​조립을 시작한 이래로 좋았지 만 이해가되지 않는 것이 하나 있습니다. 조건부 점프는 어떻게 작동합니까?조립 조건부 점프

여기에 어셈블리 코드 샘플이 있습니다.

TEST EAX, EAX 
FCLEX 
JGE SHORT 004022B1 

어떤 조건이 더 크거나 같으면 004022B1으로 점프합니다.
하지만 그 조건은 무엇이며 어디에서 확인합니까?
조건이 TEST EAX, EAX 여야한다고 가정합니다. 그러나 나는 그것이 무엇을하는지 모른다.

조건부 점프가 작동하는 방식과 조건이 확인/저장되는 방식을 설명 할 수 있습니까?

답변

5

조건부 점프 (및 다른 명령어)는 플래그를 사용합니다. 이 플래그는 (E/R) FLAGS 레지스터의 비트입니다. test a, ba을 결과로 업데이트하지 않고 and a, b의 결과에 따라 플래그를 설정합니다. fclex은 정상적인 플래그를 변경하지 않습니다 (물론 FPU 플래그를 변경합니다).

jge * 부호 플래그의 값이 오버 플로우 플래그와 같은지 여부를 테스트합니다. test a, b은 오버플로 플래그를 0으로 설정하고 부호 플래그는 and a, b의 부호 비트에 설정합니다. 따라서 eax이 양수이면 점프가 수행됩니다.

* : "크거나 같음"에 대해서는 테스트하지 않습니다. 이 해석은 cmp (및 다른 지침) 후에 플래그를 검사 할 때 유효합니다. 그것은 정말로 단지 깃발을 본다.

+0

예를 들어 a가 1이고 b가 2이면 결과의 부호 비트는 0이됩니다. 그리고 a가 -1이고 b가 -2이면 부호 비트는 음수이므로 1이됩니다. 이것이 맞습니까? – Robin

+0

@CrispyGMR 예, 맞습니다. – harold