сборка x86 - кодирование относительного jmp - PullRequest
0 голосов
/ 17 февраля 2019

Меня немного смущает то, как 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?

1 Ответ

0 голосов
/ 17 февраля 2019

Кодируется со смещением 0:

eb 00

Однако принято отвлекаться от таких деталей кодирования в сборке (и, следовательно, выводить дизассемблер) и обозначать относительные переходы со смещением относительноначало инструкции (например, $+2) или абсолютно (как в jmp 6 <label>).

...