x86 어셈블리에서 상대 점프를 시도하고 있지만 작동하지 않습니다. 웬일인지 나의 점프가 절대 점프 또는 무엇인가 다시 쓰여지고있는 것처럼 보인다. JMP 명령은 4 바이트이며, 상대 점프 점프 + 1의 주소로부터의 오프셋 (offset)되어 있기 때문에이,GCC/X86, 상대 점프 관련 문제
.global main
main:
jmp 0x4
ret
:
에 대한 간단한 예제 프로그램은 난 할 노력하고있어 이것이다 공상 노노 야. 그러나이 코드를 컴파일하고 실행하면 세그먼트 화 오류가 발생합니다.
나를위한 진짜 수수께끼는 오브젝트 레벨로 컴파일 한 다음 오브젝트 파일을 어셈블하는 것이 어셈블러가 상대 점프를 제대로하고있는 것처럼 보이지만 파일이 컴파일되면 링커가 다른 것으로 변경하는 것입니다 점프의 종류. 위의 코드라는 파일 asmtest.s 예를 들어
인 경우 : 어셈블러가 제대로 상대 점프를 만든 것처럼이 JMP 명령이 0으로 가득 것으로 의심 비록$gcc -c asmtest.s
$objdump -D asmtest.o
... Some info from objdump
00000000 <main>:
0: e9 00 00 00 00 jmp 5 <main+0x5>
5: c3 ret
이 보인다.
나는 다음을 분해 한 다음 링크 GCC를 사용하고이 가지고 : 링커가 JMP 문을 재 작성하거나 다른 주소에서 5를 대체처럼 보이는 나에게$gcc -o asmtest asmtest.o
$objdump -d asmtest
...Extra info and other disassembled functions
08048394 <main>:
8048394: e9 6b 7c fb f7 jmp 4 <_init-0x8048274>
8048399: c3 ret
이 있습니다.
제 질문은 무엇이 잘못 되었습니까?
오프셋을 잘못 지정 했습니까? 상대 점프가 어떻게 작동하는지 오해하고 있습니까? gcc가 코드에서 위험한 일을하지 않도록 노력하고 있습니까?
:
는 조립 가져옵니다 점프는 일반적으로 어셈블리에서 수행됩니다. 이것은 매우 기본입니다. 나는 OP가 이미 그 사실을 알고 있고 일부 불특정 이유 때문에 상대 점프를 직접 코딩하길 바란다고 가정합니다. –
나는 그 의견이 나의 답변이라고 생각한다. 내가 대답을 내 대답으로 옮겨서 삭제했습니다. –
도움을 주셔서 감사합니다, 이것은 내가 필요로하는 정확하게 똑같이 작동한다. 또한 너무 멀리 점프하는 문제를 지적 해 주셔서 감사합니다, 나는 지시가 계산되는 곳을 정확히 알지 못했습니다. –