2016-07-20 3 views
1

В x86 я понимаю, что многобайтные объекты хранятся в памяти немного в стиле endian.Linux x86 Платформа команд процессора Confusion

Теперь, вообще говоря, когда дело доходит до инструкций CPU, OPCODE определяет назначение инструкций, а адреса данных и памяти могут следовать за кодом операции в кодированном формате. Мое понимание состоит в том, что часть кода Opcode должна быть самым значимым байтом и, таким образом, отображаться на самом высоком адресе любого представления кодировки инструкций.

Может кто-нибудь объяснить расположение памяти на этом примере x86 linux gdb? Я бы предположил, что код операции 0xb8 появится на более высоком адресе из-за того, что он является самым значительным байтом.

(gdb) disassemble _start 

Dump of assembler code for function _start: 
0x08048080 <+0>: mov eax,0x11223344 

(gdb) x/1xb _start+0 
0x8048080 <_start>:  0xb8 
(gdb) x/1xb _start+1 
0x8048081 <_start+1>: 0x44 
(gdb) x/1xb _start+2 
0x8048082 <_start+2>: 0x33 
(gdb) x/1xb _start+3 
0x8048083 <_start+3>: 0x22 
(gdb) x/1xb _start+4 
0x8048084 <_start+4>: 0x11 

Он появляется инструкция MOV EAX, 0x11223344 является кодирование, как 0x11 0x22 0x33 0x44 0xb8.

Вопросы.

1.) Как ЦП знает, сколько байтов займет инструкция, если первый байт, который он видит, не является кодом операции?

2.) Мне интересно, возможно ли, что инструкции x86 cpu даже не имеют endian-ness и рассматривают какой-то тип строки? (возможно, здесь)

+1

# 2 правильный.Инструкции не имеют указаний, хотя в них встроены константы. Как вы можете видеть в дампе gdb, код операции ** - это первый байт (но ему могут предшествовать префиксные байты). См. Также _Intel® 64 и IA-32. Руководство разработчика программного обеспечения. Том 2: Справочник по набору инструкций, AZ, ГЛАВА 2 ИНСТРУКЦИЯ FORMAT_ – Jester

+0

Я могу сбивать с толку многобайтовые целые числа с инструкцией CPU, содержащей более одного байта, когда дело доходит до памяти Представление – htederson

+0

Спасибо Jester за указание, что код операции * - это первый байт закодированной инструкции, которую я пропустил. – htederson

ответ

5

x86 - это набор инструкций переменной длины, вы начинаете с одного байта, который не имеет никакой сущности, он везде, где он есть.

Тогда, в зависимости от кода операции, может быть больше байтов, и это может быть, например, 32-битное мгновенное, и (если эта группа байтов является немедленной или какой-либо адреса какого-либо типа), то эти байты будут немногочисленными. Скажем, у вас есть пять байтов ABCDE (нет энсианс, мозговой массив или строка). Байт A - это код операции, тогда байт B будет нижними 8 бит ближайшего, а E - верхними 8 бит ближайшего.

Opcode - трудный термин, в этих старых 8/16 бит процессорах CISC, таких как x86, весь байт был кодом операции, который вы в основном искали в таблице, чтобы увидеть, что это значит (и внутри процессора, который они использовали таблицу, чтобы выяснить, как ее выполнить). Когда вы смотрите на MIPS или ARM или другие (конечно, RISC) наборы команд, подобные этим, только часть из 32 бит является «кодом операции», и ни в одном из этих случаев это тот же набор бит от одной инструкции к другой, вы должны смотреть на различные места в инструкции (да, есть перекрытие, чтобы сделать декодирование нормальным), MIPS намного более последователен, у вас есть один blob в одном месте, на который вы смотрите, но один из этих шаблонов требует, чтобы вы смотрели на другой кадр бит для полного декодирования. ARM вы начинаете с общего бита, и по мере того, как вы прокладываете себе путь через вас, вы расшифровываете инструкцию, тогда вам, возможно, придется захватить некоторые случайные точки для полного декодирования. Остальные биты - это операнды, то, что нужно использовать для регистрации или немедленно или независимо от того, что в CISC вам нужна таблица поиска (подразумевается кодом операции, но не определяется битами в коде операции).

1) следующий байт после предыдущей инструкции будет интерпретироваться как код операции, даже если он не предназначен для одного (если выполнение продолжается до этого байта и не ветвится). Я не помню свою таблицу x86, чтобы узнать, есть ли какие-либо неопределенные инструкции или нет, если она не определена, то она попадет в обработчик, в противном случае она расшифрует то, что она найдет в качестве машинного кода, и если это неправильно сформированные инструкции, скорее всего, иногда вам повезло, и это просто что-то путает и продолжает идти, или даже больше повезло, и вы не можете сказать, что он почти разбился.

2) вы правы для этих 8/16 бит CISC или подобных наборов команд, их обрабатывают больше как строки, которые вы анализируете линейно.

+0

Да, я хорошо знаю, что ARM и MIPS имеют 16 бит альтернативных наборов команд в некоторых своих ядрах и ARM еще хуже с набором 16-разрядных команд переменной длины (расширения большого пальца2). Плюс все вещи с плавающей запятой, возможно, JAVA и т. Д. Для объяснения целей выше просто говорить о фиксированной 32-разрядной инструкции в порядке. Если вы делаете какой-то поиск в Интернете, вы должны найти кодировки для mips and arm, и, возможно, вы сможете «увидеть», как они декодируются, у них есть разные подходы к их дизайну. –

+0

Спасибо вам, я ценю ваше понимание. – htederson

+0

Я думаю, я, возможно, не ответил на вопрос 1). Как знает процессор, это код операции, который он читает, и говорит об этом. он знает из кода операции и/или дополнительных байтов, которые следуют за количеством байтов, которые ему понадобятся для этой команды. Это переменная длина, поэтому некоторые инструкции имеют кратность одного байта, а другие могут быть относительно длинными. Я думаю, что вопрос о том, что является самой длинной инструкцией по интеллекту, задавался несколько раз, а не интересная ИМО, но некоторые люди играли вместе. –

 Смежные вопросы

  • Нет связанных вопросов^_^