Подтвердить что ты не робот

X86_64 ASM - максимальные байты для команды?

Какое максимальное количество байтов требуется для полной инструкции в коде as64 x64?

Что-то вроде перехода на адрес может занимать до 9 байтов, я полагаю: FF 00 00 00 00 11 12 3F 1F, но я не знаю, будет ли максимальное количество байтов инструкцией x64 может использовать

4b9b3361

Ответ 1

Набор инструкций x86 (16, 32 или 64 бит, все варианты/режимы) гарантирует/требует, чтобы инструкции составляли не более 15 байт. Все, что выходит за рамки этого, даст "недействительный код операции". Вы не можете достичь этого, не используя избыточные префиксы (например, несколько префиксов 0x66 или 0x67, например).

Единственной инструкцией, которая фактически принимает 64-битные данные в качестве элемента данных, является константа нагрузки для регистрации (синтаксис Intel: mov reg, 12345678ABCDEF00h, at & t syntax: movabs $12345678ABCDEF00, %reg) - так что если вы хотите перескакивать более 31 бит вперед/назад, это будет перемещение целевого местоположения в регистр, а затем вызов/переход к регистру. Использование 32-разрядных непосредственных и смещенных (в относительных переходах и режимах адресации) экономит четыре байта по многим инструкциям в 64-битном режиме.

Ответ 2

Вопросы, какая самая длинная инструкция в наборе команд x86?

Ответ: вы можете сформировать действительную инструкцию x86 с бесконечным числом байтов!

Правильно, вы можете заполнить всего 64 КБ-изображение с помощью одной действительной инструкции. Чтобы быть более конкретным, нет предела длине инструкций 8086. Круто! К сожалению, современные i386-ые варианты времени бросают общую ошибку защиты при попытке декодирования инструкций длиной более 15 байт.

Итак, как выглядит бесконечно длинная, но действительная инструкция 8086? На самом деле это скучно. Вы можете сформировать бесконечно длинную инструкцию, используя избыточные префиксы спереди по кодам операций. Префиксы инструкций - это байты, предварительно отложенные до начала инструкции, которые могут изменять размер адреса по умолчанию, размер данных или регистры сегментов, используемые инструкцией.

Например, вы можете принять безобидную инструкцию:

89 E5              mov %sp,%bp

И превратите его в очень длинную инструкцию:

66 66 66 66 … 66 66 89 E5                mov %sp,%bp

Теперь это просто зло.

https://web.archive.org/web/20131109063453/https://www.onlinedisassembler.com/blog/?p=23


Другая длинная инструкция без повторений префиксов

В некоторых случаях можно кодировать действительные инструкции, которые превышают традиционное ограничение длины в 15 байт. Например:

  ; 16-bit mode
  F2 F0 36 66 67 81 84 24 disp32 imm32 =  xaquire lock add [ss:esp*1+disp32],imm32
  F3 F0 36 66 67 81 84 24 disp32 imm32 = xrelease lock add [ss:esp*1+disp32],imm32

  ; 16-bit mode
  36 67 8F EA 78 12 84 24 disp32 imm32 = lwpins eax,[ss:esp*1+disp32],imm32
  36 67 8F EA 78 12 8C 24 disp32 imm32 = lwpval eax,[ss:esp*1+disp32],imm32
  36 67 8F EA 78 10 84 24 disp32 imm32 =  bextr eax,[ss:esp*1+disp32],imm32

  ; 64-bit mode
  64 67 8F EA F8 12 84 18 disp32 imm32 = lwpins rax,[fs:eax+ebx+disp32],imm32
  64 67 8F EA F8 12 8C 18 disp32 imm32 = lwpval rax,[fs:eax+ebx+disp32],imm32
  64 67 8F EA F8 10 84 18 disp32 imm32 =  bextr rax,[fs:eax+ebx+disp32],imm32

http://www.sandpile.org/x86/opc_enc.htm

Ответ 3

В Руководстве разработчиков программного обеспечения Intel® 64 и IA-32:

2.3.11 Длина инструкции AVX

Максимальная длина инструкций Intel 64 и IA-32 остается 15 байтов.

Вы можете построить инструкции, которые будут кодироваться более чем на 15 байтов, но такие инструкции будут незаконными и, вероятно, не будут выполняться.