jmp, call instruction 주소 계산
Intel x86 architecture에서 JMP, CALL 명령어는 5Byte로 opcode와 operand는 다음과 같다.
1
2
JMP : E9 XX XX XX XX
CALL : E8 XX XX XX XX
이 때 operand는 절대주소 값이 아니라, 현 위치 기준 상대주소다.
따라서
1
XX XX XX XX = 목적지주소 - 현재명령어주소 - 5 ( Little Endian 정렬 )
-5(Byte)는 JMP, CALL 명령어의 크기 만큼 빼주는 것.
ex) 402000에서 401000으로 간다면
1
2
402000 - 401000 - 5 = FF FF EF FB
E9 FB EF FF FF
절대주소를 사용하고 싶은 경우
1
2
mov eax, 401000
jmp \*eax
call도 동일하게 사용하면 된다.
jmp == push, ret
이기 때문에 이렇게 사용해도 된다.
1
2
3
push 401000
ret
This post is licensed under CC BY 4.0 by the author.