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