我想了解GNU的以下行爲爲。GNU作爲與全球標籤jmp的奇怪
在OS X下面的試驗程序(蘋果cctools-822/GNU爲1.38)
.globl foo
jmp foo
foo:
ret
被編碼以
00000000 e900000000 jmp 0x00000005
foo:
00000005 c3 ret
而GNU爲在Linux(GNU爲2.22)編碼到
.global foo
0000 E9FCFFFF jmp 0x35 # foo
FF
foo:
0005 C3 ret
爲什麼後者對我來說會造成奇怪的跳躍?
而且,顯然這神奇0xfcffffff
地址用於 每次跳轉到一個全球性的標籤:
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產生如在Linux(GNU爲2.22)
.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體系結構處理器補充說明](http://www.sco.com/developers/devspecs/abi386-4.pdf) – starblue
好的,這真的很重要。謝謝。 – Tobias