2014-06-15 4 views
1

저는 방대한 어셈블리 세계에서 완벽한 초보자입니다. 배우는 동안 나는 이상한 일이 발생했습니다.어셈블리의 차이점이 0과 같음

조건부 점프는 특정 연산자를 비교하는 방법을 확인하기 위해 플래그 검사의 기초에서 수행됩니다. 그러나 검사를 수행하는 데는 두 가지 다른 방법이있는 것 같습니다. 거의 모든 조건부 점프 명령을 사용하면 똑같은 일을하는 카운터 파트가 다른 표기법을 사용하는 것처럼 보입니다. 예를 들어 jejz과 같습니다. 필자가 아는 한, 명령 이전에 두 피연산자의 비교가 제로 플래그를 설정하면이 두 명령 모두가 점프합니다. 여기에 나온 지침의 차이점은 무엇입니까? 하나가 다른 것보다 효율적입니까? 하나는 더 많은 오버 헤드가 발생합니까? 차별화는 단지 가독성을위한 것입니까?

도 같은 것 같다 다른 몇 가지 지침이 있습니다 차이가 없다

  • loopz/loope
  • jb/jc
  • jnz/jne
+1

http://stackoverflow.com/questions/14267081/difference-between-je-jne-and-jz-jnz – apangin

+3

'assembly' 태그를 사용할 때 적절한 아키텍처 태그도 사용해야합니다. "어셈블리"는 일반적인 아치 독립 프로그래밍 언어가 아닙니다. – OJFord

답변

5

. 그것들은 정확하게 똑같은 두 가지 이름입니다. 인코딩 된 방식을 살펴보십시오. 정확히 동일한 바이트 시퀀스이므로 CPU (또는 디스어셈블러)는 쓴 코드를 알 수 없으므로 사용 된 코드에 따라 다르게 작동 할 수 없습니다.

그것은 당신이 두 가지를 비교하면 당신은 당신이 실제로 (아마도 test과)는 0을 검사하면 z 변형하지만 e 변형을 사용하여 예를 들어, 동료 프로그래머에게 좀 더 명백한 의도를 만들 수 있습니다 너무입니다 .

1

서로 뺄셈하면 두 개의 동일한 숫자가 0이됩니다. 비교는 결과적으로 차이를 유지하지 않고 하나의 피연산자를 다른 피연산자에서 빼는 것 외에는 아무것도 아닙니다. 따라서 연산 결과가 0인지 또는 두 개의 피연산자가 같은 값을 갖고 있는지를 "비교"를 사용하여 테스트하는 것은 사실 동일한 작업입니다.