Post

jmp, call instruction 주소 계산

Intel x86 architecture에서 JMP, CALL 명령어는 5Byte로 opcode와 operand는 다음과 같다.

1
2
3
JMP  : E9 XX XX XX XX
CALL : E8 XX XX XX XX

이 때 operand는 절대주소 값이 아니라, 현 위치 기준 상대주소다.

따라서

1
2
XX XX XX XX = 목적지주소 - 현재명령어주소 - 5      ( Little Endian 정렬 )

-5(Byte)는 JMP, CALL 명령어의 크기 만큼 빼주는 것.

ex) 402000에서 401000으로 간다면

1
2
3
402000 - 401000 - 5 = FF FF EF FB
E9 FB EF FF FF

절대주소를 사용하고 싶은 경우
1
2
3
mov eax, 401000
jmp \*eax

call도 동일하게 사용하면 된다.

jmp == push, ret 이기 때문에 이렇게 사용해도 된다.

1
2
3
4
push 401000
ret

This post is licensed under CC BY 4.0 by the author.