Меня немного смущает то, как gcc кодирует относительные переходы.У меня есть следующее:
int main(void)
{
__asm__ __volatile__(
"jmp label\n"
"label:\n"
"nop\n"
);
return 0;
}
Построение этого (gcc -c -o test.o test.c
) показывает следующее (objdump -M intel -d test.o
):
0000000000000000 <main>:
0: 55 push rbp
1: 48 89 e5 mov rbp,rsp
4: eb 00 jmp 6 <label>
0000000000000006 <label>:
6: 90 nop
...
rasm2 -d eb00
показывает jmp 2
, что означаетпереход выполняется со смещением 2. Теперь я понял, что смещения относительных переходов добавляются к текущему значению eip
, которое должно указывать на следующую инструкцию (то есть nop
).Эта кодировка заставляет меня думать, что смещение относительно адреса самого jmp
.Не следует ли кодировать jmp
как jmp 0
, поскольку nop
уже находится на label
?