jump

less than 1 minute read

jump 명령에는 여러가지 종류가 있다.

near , far , short jump

near jump 는 세그먼트 내에서의 jump 이다.

우리가 기본적으로 사용하는 jump 가 이것이다.

jmp [eax]
jmp LABEL

far jump 는 다른 코드 세그먼트로의 점프이다.

jmp far LABEL

short jump 는 거리차가 127 byte ~ -128 byte 인 곳에서 사용한다.

NEXT: add ax, bx
      jmp short NEXT

무조건 분기인 jmp 와 달리 조건 분기도 있다.

점프할지말지는 1비트 짜리 EFLAGS - ZF, SF, CF, OF, PF 가 결정한다.

JZ 는 ZF 가 1이면 분기한다.

JNZ 는 ZF 가 0이면 분기한다.

JO 는 OF가 1이면 분기한다.

JNO 는 OF 가 0이면 분기한다.

같은 방식으로 JS, JNS, JC, JNC, JP, JNP 등등이 있다.

      SUB EBX, EAX
      JS  SIB
      ...

SIB:  MOV EAX, 2  
      ...

위의 예시는 EBX에서 EAX 를 뺀 결과가 Sign Flag 를 1로 만들 때

즉, 둘의 결과가 음수라면 SIB 이라는 Code Label 로 분기하게 되는 경우이다.

이를 통해서 반복문을 만드는 것도 가능하다. 아래의 예시를 보자.

      MOV ECX, 0
RPT:  ADD ECX, EAX
      SUB EBX, 1
      JNZ RPT

위 코드는 EAX 를 EBX 만큼 곱한 수를 ECX 에 저장하는 코드가 된다.

이때 EBX 가 반복자로 쓰인 것이다.

NASM 의 Loop 연산자에선 기본으론 ECX 가 쓰인다.