Как выглядит настоящий машинный код в разных точках?
Кажется, есть много мнений о том, что такое машинный код на самом деле. Я слышал, что некоторые говорят, что это сборка, или двоичная, или шестнадцатеричная.
Правильно ли говорить, что машинный код - это, по сути, набор инструкций для конкретного процессора? Если это так, я представляю, что они могут быть представлены в двоичной или шестнадцатеричной записи или сборке. Но как выглядит непереведенный "фактический" машинный код? Это основано на размере слова архитектуры? Или шестнадцатеричное для всех намерений и целей представление по умолчанию?
Как это выглядит, сидя на жестком диске? Как это выглядит, сидя в реестре? Как насчет того, когда он обрабатывается, это просто набор изменений напряжения в этой точке?
3 ответа
Машинный код - это просто двоичные данные, которые соответствуют инструкциям процессора для конкретной архитектуры процессора.
Я не буду вдаваться в то, как он хранится слишком много, потому что это зависит от того, где он хранится. Например, на диске он обычно хранится в виде последовательности намагниченных областей. Машинный код ничем не отличается от других двоичных данных в аспекте хранения. Если ваш вопрос больше касается того, как данные хранятся на компьютере, вам следует исследовать различные устройства хранения данных на компьютере, такие как жесткий диск, оперативная память и регистры, чтобы назвать несколько.
Самый простой способ визуализировать, как хранится машинный код, - взглянуть на него в шестнадцатеричном редакторе. Это показывает вам двоичные данные, представленные шестнадцатеричными числами. Например, возьмите инструкцию:
0xEB 0xFE
Это может быть легко написано 1110101111111110 или 60414. Это зависит от того, как вы хотите преобразовать двоичный файл в удобочитаемую форму.
Эта инструкция представляет бесконечный цикл. (Предполагается, что он выполняется на процессоре x86. Другие процессоры могут интерпретировать его так, как они хотят.) Он может быть закодирован в сборке следующим образом:
j:
jmp j
Когда вы запускаете ассемблер, он берет приведенный выше код и превращает его в двоичный машинный код выше.
Инструкция действительно состоит из двух частей. Первый, который известен как код операции, и является 0xEB
, Когда этот код попадает в ЦП, это означает: прочитать байт из программы и пропустить столько байтов данных. Затем процессор читает байт 0xFE
, Поскольку он ожидает целое число со знаком, он интерпретирует двоичные данные как число -2. Затем инструкция считается прочитанной, и указатель инструкции перемещается на 2 байта вперед. Затем инструкция выполняется, в результате чего указатель инструкции перемещается вперед на 2 (0xFE) байта, что фактически устанавливает указатель инструкции на то же значение, которое было при запуске инструкции.
Надеюсь, это ответит на ваш вопрос. Если вас интересует внутренняя работа процессоров, ознакомьтесь с микрокодом и электронными логическими элементами. По сути, это куча разностей напряжений, таких как 1 бит - 5-вольтовый заряд, а 0 бит - 0-битный.
Как и я, вам, кажется, любопытно, как компьютеры работают под капотом. Я не знаю достаточно, чтобы ответить на ваши вопросы хорошо (и в любом случае это большая тема), но я настоятельно рекомендую серию подкастов Стива Гибсона "Давайте создадим компьютер". Вот выдержка из стенограммы "Машинного языка", чтобы дать вам представление об этом.,,
И все средства пропуска - вместо того, чтобы добавлять один к счетчику программ, мы добавляем два, или мы добавляем один дважды, что на самом деле работало тогда на этих машинах. И это просто заставляет нас пропустить прыжок. По сути, это означает, что мы можем переходить в любое место в памяти или продолжать свой путь, что дает нам, хотя это очень просто, дает нам достаточно мощности, чтобы машины могли принимать решения. И у нас есть вход / выход; у нас есть математика; у нас есть возможность передавать данные из одного места в памяти в другое. Это все основные принципы работы машины. Это машинный язык.
Теперь, один слой человечества, который находится на вершине этого, это то, что называется "ассемблером", и это не что иное, как называние вещей. Например, вы создаете своего рода так называемую мнемонику для различных инструкций. Так, например, нагрузка на аккумулятор будет LDA. Храните аккумулятор, СТА. Вы хотите, чтобы они были короткими, потому что вы будете часто их печатать. Помните, что в конечном итоге вы используете множество маленьких инструкций, чтобы что-то сделать. И потом, единственное, что действительно делает ассемблер, это то, что вы можете называть места в памяти.
Так, например, вы могли бы сказать LDA, для аккумулятора нагрузки, текущий счет. А текущая оценка будет просто означать, по сути, переменную, место в памяти, которое вы назвали "текущая оценка". И затем, если вы сделали STA, сохранили аккумулятор, новый счет, ну, он сначала загрузит текущий счет в аккумулятор, а затем сохранит его в другом месте, называемом новым счетом. Так что на самом деле это все, о чем мы говорим, это несколько простых сокращений, которые помогают запоминать и использовать эти отдельные инструкции и удобные метки для мест в памяти, так что вам не нужно запоминать, о, это место 329627. Я имею в виду, кто может это сделать? Таким образом, вместо этого вы просто помечаете это местоположение английской буквенно-цифровой фразой, а затем ссылаетесь на это место по фразе, а не по ее фактическому номеру.
И на самом деле вам все равно, что это за номер. Это одна из вещей, которую ассемблер сделает для вас, вы просто говорите, что мне нужна память, называемая этими вещами. И это беспокоит то, куда они идут, потому что для вас это не имеет значения, если их постоянно называют. И это весь процесс. Это машинный язык и язык ассемблера. И так было 50 лет назад, и более-менее так оно и есть сейчас.
,, но он отступает еще дальше и начинает с транзисторов и логических вентилей. Из того, что я могу сказать, вот полная серия (и слушатели предоставили полезные диаграммы в вики):
- Давайте создадим компьютер: транзисторы, логические вентили (Security Now 233, 42:00) http://www.grc.com/sn/sn-233.htm и http://wiki.twit.tv/wiki/Security_Now_233
- Машинный язык (Security Now 235, 46:00) http://www.grc.com/sn/sn-235.htm и http://wiki.twit.tv/wiki/Security_Now_235
- Отзывы слушателей (Security Now 236, 51:43) http://www.grc.com/sn/sn-236.htm и http://wiki.twit.tv/wiki/Security_Now_236
- Направленность: сила указателей (Security Now 237, 27:45) http://www.grc.com/sn/sn-237.htm и http://wiki.twit.tv/wiki/Security_Now_237
- Отзывы слушателей (Security Now 238, 40:28) http://www.grc.com/sn/sn-238.htm и http://wiki.twit.tv/wiki/Security_Now_238
- Стеки, регистры и рекурсия (Security Now 239, 1:01:00) http://www.grc.com/sn/sn-239.htm и http://wiki.twit.tv/wiki/Security_Now_239
- Отзывы слушателей (Security Now 240 48:16, 1:01:21) http://www.grc.com/sn/sn-240.htm и http://wiki.twit.tv/wiki/Security_Now_240
- Аппаратные прерывания (Security Now 241, 42:25) http://www.grc.com/sn/sn-241.htm и http://wiki.twit.tv/wiki/Security_Now_241
- Отзывы слушателей (Security Now 242, 59:27) http://www.grc.com/sn/sn-242.htm и http://wiki.twit.tv/wiki/Security_Now_242
- Multiverse: многопоточность, многозадачность, многозадачность, многоядерность (Security Now 247, 47:15) http://www.grc.com/sn/sn-247.htm и http://wiki.twit.tv/wiki/Security_Now_247
- Отзывы слушателей (Security Now 249, 1:30:21) http://www.grc.com/sn/sn-249.htm и http://wiki.twit.tv/wiki/Security_Now_249
- Операционные системы (Security Now 250, 43:22) http://www.grc.com/sn/sn-250.htm и http://wiki.twit.tv/wiki/Security_Now_250
- Отзывы слушателей (Security Now 251, 1:00:22) http://www.grc.com/sn/sn-251.htm и http://wiki.twit.tv/wiki/Security_Now_251
- RISC и CISC (Security Now 252, 53:31) http://www.grc.com/sn/sn-252.htm и http://wiki.twit.tv/wiki/Security_Now_252
- Отзывы слушателей (Security Now 253, 50:38) http://www.grc.com/sn/sn-253.htm и http://wiki.twit.tv/wiki/Security_Now_253
- Что мы сделаем для скорости: конвейеризация, предсказание ветвлений (Security Now 254, 29:30) http://www.grc.com/sn/sn-254.htm и http://wiki.twit.tv/wiki/Security_Now_254
Если кто-то не согласен с тем, что Стив говорит в этих эпизодах, лучшие места для обратной связи: http://www.grc.com/feedback.htm или http://www.grc.com/discussions.htm или https://twitter.com/SGgrc
Объяснил для начинающих
С нуля компьютер имеет много "переключателей". Например, светодиодный свет может быть выключен
или включено, есть только 2 варианта (1= включено или 0= выключено). Если у вас есть 2 светодиода, вы можете выключить светодиод 1 и
2 и наоборот, или вы можете включить или выключить их оба. Теперь есть больше возможностей.
Вы можете рассчитать, сколько существует различных возможностей.
1 лампа = 2 ^1 = 2 возможности
2 лампы = 2 ^2 = 4 возможности
8 ламп = 2 ^8 = 256 возможностей
Таким образом, компьютер читает только нули и единицы. Компьютер имеет много переключателей в зависимости от мощности процессора. Чтобы указать компьютеру активировать лампу, вам нужно добавить 0 и 1 в систему, и это будет очень трудной задачей. Чтобы избежать этого, они конвертировали возможности в шестнадцатеричные числа. Сборка - это всего лишь компьютерный язык, который преобразует введенные вами буквы в 0 и 1 (двоичный код) и следует инструкциям.