GNU의 다음과 같은 동작을 이해하고 싶습니다.GNU가 jmp에 대한 이상한 언어로 글로벌 레이블
(2.22로서 GNU) 리눅스로 인코딩 GNU하면서 OS X에 다음 테스트 프로그램 (1.38 애플 cctools-822/GNU).globl foo
jmp foo
foo:
ret
는
00000000 e900000000 jmp 0x00000005
foo:
00000005 c3 ret
로 부호화
.global foo
0000 E9FCFFFF jmp 0x35 # foo
FF
foo:
0005 C3 ret
왜 후자는 이상한 점프를합니까?
또한, 분명히이 마법 0xfcffffff
주소는 글로벌 라벨에 대한 모든 점프에 사용되는 : (2.22 같은 GNU)
test2.s
.globl foo
jmp foo
.globl bar
jmp bar
.globl baz
jmp baz
foo:
push $1
ret
bar:
push $2
ret
baz:
push $3
ret
리눅스에로 GNU와 생산
.globl foo
0000 E9FCFFFF jmp foo
FF
.globl bar
0005 E9FCFFFF jmp bar
FF
.globl baz
000a E9FCFFFF jmp baz
FF
foo:
000f 6A01 push $1
0011 C3 ret
bar:
0012 6A02 push $2
0014 C3 ret
baz:
0015 6A03 push $3
0017 C3 ret
누구나 이런 종류의 행동을 설명 할 수 있습니까?
고마워요, 그게 사실입니다. 어떤 종류의 문서가 있습니까? – Tobias
[System V ABI, Intel386 Architecture Processor Supplement] 참조 (http://www.sco.com/developers/devspecs/abi386-4.pdf) – starblue
좋습니다. 고맙습니다. – Tobias