Возьмите следующую программу сборки:
_start:
mov myvar, %rax
mov myvar(%rip), %rax
mov myvar(%rip), %rax
mov myvar(%rip), %rax
mov myvar(%rip), %rax
При запуске в gdb
выдает следующее:
!0x00000000004000b0 ? mov 0x600107,%rax
0x00000000004000b8 ? mov 0x200048(%rip),%rax # 0x600107
0x00000000004000bf ? mov 0x200041(%rip),%rax # 0x600107
0x00000000004000c6 ? mov 0x20003a(%rip),%rax # 0x600107
0x00000000004000cd ? mov 0x200033(%rip),%rax # 0x600107
Конечно, неудивительно, что все ссылки myvar
разрешаются в 0x600107
. Где (или, возможно, когда лучше) относительные %rip
элементы разрешаются в фактический адрес? Как этот процесс работает на высоком уровне?
По теме: Почему эта инструкция MOVSS использовать относительную адресацию RIP?.
[disp32]
(с / без SIB); более короткий (без SIB) означает[rip+rel32]
вместо[disp32]
. ЦП знает адрес конца инструкции, поэтому он может производить вычисления. - person Peter Cordes   schedule 25.08.2020