jump
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 가 쓰인다.