2010-03-01 8 views

답변

4

J(E)CXZ 일반적으로 루프의 반복을 제한하는 데 사용하는 CX 레지스터에 카운트 값이있는 경우에 사용됩니다.

JMP

Conditional jumps

이전 계산의 조건에 따라 실행 스레드를 변경하는 데 사용되는 점프 테이블을 구축, 루프를 종료 비 CALL 기반 인터페이스에서 API를 입력하는 데 사용 무조건 점프 등이다. 많은 동의어가 있습니다 (방금 제공 한 링크에 문서화되어 있습니다). 동의어는 대개 분명한 이유가 있습니다. 예를 들어, JAE는 "위 또는 동등한 경우 건너 뛰기"를 의미합니다. 이것은 JNC의 동의어로, "없는 경우 건너 뛰기"와 "JNB가 아닌 경우 건너 뛰기"를 의미하는 JNB를 의미합니다. 어떤 사용은 순수 독자 코드를 이해하기의 문제이다, 당신은 단지 산술 연산을 수행 한 경우

  • , 당신은 캐리 플래그의 상태에 관심이있을 가능성이있어 '왜 이렇게 그것을 JNC로 코드화하십시오.
  • 방금 ​​비교 (CMP 연산)를 수행했다면 JAE 또는 JNB에 더 관심이있을 것입니다. 당신이 사용하는 것은 논리를 기술 할 때 어느 것이 가장 합리적인지에 달려 있습니다.

실제로 이것은 언어 디자인의 고전적인 문제입니다. 많은 별칭을 만들거나, 구문을 더 명확하게 의미를 명확하게 만들거나, 비용으로 "키워드"(여기에서 opcode 니모닉)를 제한합니까? 의미를 읽는 것이 더 어려워?

4

일부 니모닉은 단지 같은 명령을 나타냅니다. 비교 결과에 jG JGE 등을 사용하는 경우 관심이 있다면 CPU 플래그에 관심이 있다면 JC, JZ 등을 사용하십시오. 코드의 가독성을 높일 것입니다

5

언급 한 점프는 모두 조건 코드 값 .

JG와 JNLE은 동일합니다. 동일한 연산 코드를 가지며 동일한 작업을 수행합니다. 하나는 "보다 큰 경우"이고 다른 하나는 "작거나 같지 않은 경우 점프"입니다. 그것에 대해 생각해보십시오. 이들은 서명 된 분기입니다. 즉 분기 할 것인지 결정할 때 서명 플래그를 고려해야합니다.

JNC는 "캐리가없는 경우 점프"를 의미합니다. 캐리 플래그가 설정되어 있지 않으면 점프합니다. Carry는 산술 오버플로를 감지하는 데 자주 사용됩니다 (예 : 2 개의 부호없는 정수를 추가 할 때).