Чем отличается процессор между кодами операций и данными?

Я пытаюсь написать дизассемблер, и мне было интересно, как процессор отличает OpCodes от Data-Bytes.

Например, это байтовое представление «Hello World»: 0x48 0x65 0x6c 0x6c 0x6f 0x20 0x57 0x6f 0x72 0x6c 0x64 0x00

Но как процессор «узнает», что он говорит «Hello World», а не на самом деле это: _ _ INS INS OUTS AND _ OUTS JB INS _ ADD

Разъяснение очень приветствуется.


person Ian Rehwinkel    schedule 14.08.2018    source источник
comment
Не знает. Если указатель инструкции когда-либо указывает на эти байты, программа выйдет из строя. На практике этого не произойдет, но вы не знаете практики, если не можете имитировать выполнение программы. В общем, возможность отличить код от данных в дизассемблере очень сложно и никогда не будет полностью надежным, если вы недостаточно знаете о компиляторе, который сгенерировал код.   -  person Hans Passant    schedule 14.08.2018
comment
Он даже не знает, является ли код 16, 32 или 64-битным, и просто загружает любые байты в текущий указатель инструкции и декодирует их как инструкции в текущем режиме. Почему дизассемблированные данные становятся инструкциями?. Примечание: инструкции x86 часто длиннее 1 байта, с байтом modrm после байта кода операции. Например, с приведенной выше последовательностью вы получите 3-байтовое И вместо AND _ OUTS, как вы думаете.   -  person phuclv    schedule 14.08.2018
comment
Была карта расширения Apple] [, у которой было так мало места для кода (я думаю, 256 байт), что кодировщик попытался сэкономить место, перейдя в середину инструкции, чтобы использовать ее как другое инструкцию и выжимаем из нее SEC; RTS;. Дизассемблер мог перепутать веткой.   -  person Weather Vane    schedule 14.08.2018


Ответы (2)


Процессор знает, потому что известны точки входа. Процессор выполняет декодирование в порядке выполнения, что и нужно для дизассемблирования для набора команд переменной длины. Фиксированной длины вы можете просто пройти через память от точки входа линейно, но переменную длину вам нужно идти в порядке выполнения. Это, конечно, не является надежным, довольно легко запутать дизассемблер, поэтому имейте в виду, что это возможно, и я рекомендую вам отслеживать. Обычно я делаю таблицу с точкой входа в инструкцию (код операции в некоторых ISA) и байтами, не входящими в состав, так что если я перейду в середину инструкции, я смогу остановить там этот путь дизассемблера (естественно, у вас есть чтобы пройти все возможные пути).

Что касается кодов операций и данных, до тех пор, пока инструментальная цепочка и программист выполняли правильную работу, одна инструкция будет передаваться другой, перепрыгивая через области данных по мере необходимости.

Процессоры очень тупые, у них мало реальных функций, кое-что alu, чтение и запись с адресов, перемещение данных в регистры и из них. Половина работы - кормить их программами, которые следуют правилам.

person old_timer    schedule 14.08.2018

Это не может. В архитектуре Гарварда явное разделение данных и кода предотвратит эту проблему, в архитектуре фон Неймана код есть данные.

Программист должен не заставлять ЦП выполнять нежелательный код / ​​данные.

person Margaret Bloom    schedule 14.08.2018