Инструкция jmp в ассемблере

Извиняюсь за возможно тупой вопрос, но мне непонятно как это работает. Допустим у нас есть x86 процессор и мы выполняем jmp на какой либо адрес. Насколько я знаю эта инструкция занимает в памяти 5 байт. jmp (1 байт) + адрес(4 байта). Только мне не понятно как процессор считывает эту самую инструкцию, ведь размер регистров для x86 - 4 байта, а размер нашей инструкции - 5 байт. Получается, чтобы прочитать эту инструкцию процессору требуется 2 такта, так как она полностью не помещается в регистр. Я знаю что скорее всего это не так, но мне не понятно как это работает. Не могли бы вы мне объяснить что к чему. Заранее спасибо :)


Ответы (2 шт):

Автор решения: Илья К
  1. Ширина входа в процессор Skylake 16 байт за один такт, то есть за один так процессор может прочитать три таких команды.

  2. Данные содержащиеся непосредственно "внутри" команд попадают в регистры только если так прямо указанно в самой команде, при этом "командная" часть будет отброшена на аппаратном уровне.

→ Ссылка
Автор решения: PRODIGY

При запуске программы, процессор передаёт контролёру памяти MMU адрес точки-входа в код, после чего чтением из ОЗУ занимается уже контролёр. Размер шины памяти DDR = 64-бита (8 байт), и контролёр читает из неё в пакетном режиме "Burst-Length" сразу по 64-байта данных, т.е. один раз ставит указатель на начало блока памяти, и повторяет операцию чтения 8-раз (8х8=64). Эти 64-байта прямиком попадают в одну линейку кэш-памяти L3 (cache-line), и на каждом такте продвигаются дальше к исполнительному ядру процессора Executive.

В исполнительном ядре инструкции анализируются (расщепляются на микро-инструкции Mops), и только если эта инструкция подразумевает какой-нибудь расчёт, то они попадают в регистры процессора, иначе их исполняет само ядро. В случае-же с инструкцией JMР, опкод её поглощается ядром, а 4-байтный адрес записывается в регистр EIP (Instruction Pointer). Это приводит к тому, что процессор прыгает на указанный в JMP адрес.

→ Ссылка