Какая инструкция x86 имеет 10-байтовое немедленное выполнение?

В Intel® 64 and IA-32 Software Developer's Manual, Volume 2A, Section 3.1.1.1 упоминается нотация ct для обозначения 10-байтового значения, следующего за кодом операции. Однако я не могу найти никаких инструкций, снабженных этим комментарием. Я что-то упустил или нет инструкций, принимающих 10-байтовое немедленное значение?


person Trillian    schedule 24.07.2018    source источник
comment
Я не знаю ни одного. Не существует jmp ptr16:64 кодировки x86-64, только для 16- и 32-битного режима, например jmp ptr16:32. x86-64 имеет только косвенный дальний jmp с seg: offset из памяти.   -  person Peter Cordes    schedule 24.07.2018
comment
EA и 9A в 64-битном режиме даже не выходят из строя с 10-байтовым иммом (то есть они могут быть за 7 байтов до недоступной страницы и по-прежнему терпят неудачу с Illegal Instruction вместо Access Violation)   -  person harold    schedule 24.07.2018
comment
t - тип данных для 80-битных чисел с плавающей запятой. Может быть, это обозначение просто существует для полноты?   -  person fuz    schedule 24.07.2018
comment
@fuz: Я тоже думал о TBYTE, но здесь мы говорим не об обычных типах данных, с которыми ЦП работает как данные, а о необработанных последовательностях байтов, включенных в кодировку инструкций - например, есть даже cp, который 6-байтовое значение; немедленно использовать другую нотацию (ib, iw, id, io). Кстати, даже значение co (8-байтовая последовательность) кажется неиспользованным. Я согласен, однако, что это, вероятно, просто для полноты картины.   -  person Matteo Italia    schedule 24.07.2018
comment
@MatteoItalia co используется для mov r,i64, т.е. таких инструкций, как 48 b8 ef cd ab 89 67 45 23 01.   -  person fuz    schedule 24.07.2018
comment
@fuz: felixcloutier.com/x86/MOV.html использует io, а не co, для mov r64, imm64 .   -  person Peter Cordes    schedule 24.07.2018
comment
Глядя на мои старые руководства в формате PDF, можно заметить, что код операции ct был добавлен в руководство где-то между 2004 г. (редакция 14) и мартом 2006 г. (редакция 19), когда были добавлены 64-битные инструкции.   -  person Ross Ridge    schedule 24.07.2018
comment
@Matteo, хороший улов, co тоже не используется. Это делает более вероятным, что обозначения существуют только для полноты картины.   -  person Trillian    schedule 25.07.2018


Ответы (1)


Насколько я знаю, такой инструкции нет.

Нет инструкций, которые немедленно принимают значения с плавающей запятой, особенно 10-байтовых x87 long double, так что это определенно не операнд TBYTE FP.

32-разрядная версия имеет jmp ptr16:32 и call, абсолютный прямой дальний переход с 6-байтовое непосредственное назначение (cp). Но x86-64 не имеет кодировки для call или jmp ptr16:64. (Только косвенная память с 10-байтовым сегментом: смещение, загруженное из памяти).

@Harold говорит, что коды операций EA и 9A (прямой дальний jmp / call) в 64-битном режиме неисправны как недопустимая инструкция, даже если они находятся за 7 байтов до недоступной страницы, вместо того, чтобы пытаться немедленно прочитать 10-байтовый сбой с нарушение доступа)


@Matteo отмечает, что обычные немедленные действия используют ib / iw / id / io. (Например, mov r64, imm64 REX.W + B8 + rd io .) В руководстве Intel для moffs форм MOV перечислен только код операции, а не 8-байтовый формат непосредственного абсолютного адреса.

В любом случае cp - это 6-байтовая пара seg: ptr32, используемая для кодирования jmp / call. cd - это 4-байтовый seg:ptr16. x86 не имеет абсолютного прямого ближнего прыжка, поэтому мы не можем увидеть, будет ли co использоваться для этого.

Кажется вероятным, что ct был просто добавлен в руководство кем-то, кто забыл, что jmp ptr16:64 не существует, или на тот случай, если они когда-либо захотели описать что-то подобное вне формата инструкции. IDK, если он используется в описании данных в памяти в каком-либо другом разделе руководства Intel, но я не знаю инструкций, которые содержат 10 байтов непосредственных данных.

Максимальное значение - 8 для mov r64, imm64 или movabs [mem], al/ax/eax/rax (или формы загрузки). Также многие инструкции могут иметь imm32 и disp32, но это два разных значения.

person Peter Cordes    schedule 24.07.2018
comment
Но как это сделать? Одна из возможностей состоит в том, что существует недокументированная инструкция, которая немедленно занимает 10 байт. - person Hadi Brais; 24.07.2018
comment
@HadiBrais: перефразировано на то, что я хотел сказать. - person Peter Cordes; 24.07.2018
comment
Спасибо! Это тоже мой вывод. Возможно, мы никогда не узнаем, был ли он изначально предназначен для использования для инструкции, которая так и не попала в официальный набор инструкций. - person Trillian; 25.07.2018
comment
@Trillian: так случилось, что я снова смотрел этот вопрос и ответ. Помните, что AMD разработала AMD64. Когда Intel документировала IA-32e / Intel64 / как там еще они это называли, они в основном не придумывали новых инструкций. Intel, конечно, делает новые расширения для x86 ISA и могла бы добавить код операции jmp ptr16:64 для 64-битного режима или что-то еще, когда они реализовывали x86-64. Но, вероятно, он не получит никакого применения по сравнению с чем-то, что работает на всех процессорах x86-64, включая AMD. - person Peter Cordes; 26.10.2018