|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
11.10.2017, 15:52 | #11 | |
Новичок
Джуниор
Регистрация: 11.10.2017
Сообщений: 8
|
Цитата:
Но кажется я немного понял, особенно опираясь на блокнот с адресами и цифрами, а это как раз те самые нули и единицы. Т.е. процессору не важно, что именно стоит перед ним, просто исходя из данных в строке он делает то, что, что записано в памяти. Тут не очень понятно, что число 199 на скрине записано в одной строке, а число 555 записано в двух разных строках причем не последовательно, а сначала его вторая половина 2B, а в следующей строке - первая половина - 02. Если я правильно понял, получается, что процессор как бы разделяет последовательность цифр на "блоки", что-то типа первый блок - адрес, второй блок информация, третий блок команда. И исходя из своей архитектуры просто оперирует этими блоками. И если ему поступила информация, то исходя из этой последовательности и будет выполнено то или иное действие. И получается что все что в первом блоке - адрес, во втором - то с чем надо проводить операцию, в третьем - операция. Но по такой логике каждый идентичный "блок" должен быть одинаковым по размеру. В блокноте этого вроде бы не наблюдается. В общем какое-то осознание начинает потихоньку приходить, но пока немного каша в голове. Спасибо за ответы! |
|
11.10.2017, 15:56 | #12 |
Цифровой кот
Старожил
Регистрация: 29.08.2014
Сообщений: 7,629
|
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
Последний раз редактировалось min@y™; 11.10.2017 в 16:01. |
11.10.2017, 18:19 | #13 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
Loengreen, программа - это не тупое сборище нулей и единиц. Каждая программа имеет т.н. точку входа - "Entry Point". Исполнение программы начинается именно с этой точки (байта), а не от куда-попало. Там должны располагаться байты, которые 'понимает' процессор, иначе программа рухнет. Точка входа никогда не указывает на секцию-данных, а только на секцию-кода.
Чтобы понять принципы декодирования инструкций процессором, удобно воспользоваться отладчиком. - например виндовым DEBUG.COM. Компиляторы всех уровней переводят код на ассемблер. Команда сложения в ассемблере называется [ADD] = Adding, команда пересылки данных - [MOV] = Move. Теперь запускаешь DEBUG [Win+R-->debug] и вводишь такие команды: Код:
Команда(R) - это "Registers" - показывает состояния регистров процессора. Команда(T) - это "Trace" - трассировка - исполнение заданного кода. В режиме трассировки, слева от команды, отладчик показывает опкоды этих команд. Например, данное сложение начинается с инструкции [MOV AX,0199], опкодом которой являются 3-байта со значением B89901h. Это и есть твои нули и единички, только в HEX. Весь исходник в машинном коде процессора будет выглядеть так: B8 99 01 05 55 05 Процессор берёт первый байт, в данном случае(B8h), и декодирует его по схеме, как показано на рисунке. Он знает, что B8h - это [mov ax], B9h - [mov cx], BAh - [mov dx], и т.д. Если ЦП не сможет декодировать байт, то остановится с ошибкой - "Неизвестная инструкция!". Декодирование инструкций - муторное дело, и там не всё так-просто. Взяв в руки первый байт и декодировав его, он узнает, сколько байтов нужно пропустить после первого. - т.е. вычислит длинну этой инструкции. Она может быть до от одного, до 12-байт. Если интересна эта тема, можешь почитать маны Intel'a (IA32-64 Vol.2), или статью К.Касперски "Техника дизассемблирования в уме". Узнаешь много нового..
Нашедшего выход - затаптывают первым..
|
11.10.2017, 19:32 | #14 |
Новичок
Джуниор
Регистрация: 11.10.2017
Сообщений: 8
|
R71MT
Огромное спасибо! Вот ответ на мой вопрос, который я не мог точно сформулировать! Все дело в первом байте, который и определяет что делать дальше и задает размер команды и, соответсвтенно, чисел, учавствующих в операциях! Это именно то, чего я не мог понять, как именно считаются эти нули и единицы! Грубо говоря первый байт задает правильный счет того, что следует за ним и в итоге нет путаницы что из цифр есть команды, а что есть числа! Еще раз спасибо, а то всю голову сломал! Теперь стало все на свои места! |
11.10.2017, 19:44 | #15 |
Новичок
Джуниор
Регистрация: 11.10.2017
Сообщений: 8
|
Kris Kaspersky "ТОНКОСТИ ДИЗАССЕМБЛИРОВАНИЯ" - замечательная статья. В ней есть ответы на некоторые мои другие не заданные вопросы.
Благодарю! |
11.10.2017, 19:58 | #16 |
Новичок
Джуниор
Регистрация: 11.10.2017
Сообщений: 8
|
R71MT
Если утрировать, то первый байт является не просто командой, а эдаким "указателем", который и говорит что следует за ним и в каком размере до следующего "указателя", который тоже говорит что следует за ним и в каком размере! Т.е. первый байт определяет сколько нулей и единиц, следующих за ним надо считать числами, сколько командами и так далее по цепочке! Теперь даже не верится, как можно было не понимать этого раньше! Странно, что в институте такого не объясняли совсем. Вам надо идти работать преподавателем! Последний раз редактировалось Loengreen; 11.10.2017 в 20:09. Причина: опечатка |
11.10.2017, 22:31 | #17 | |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
Цитата:
ЦП достаточно интелектуальный перец, чтобы понять - где инструкция, а где мусор (просто числа). почему? ..потому, что опкоды - это те-же числа, и может получиться так, что из-за ошибки программиста проц нарвётся на поток данных (не кода), где первый байт совпадёт с каким-нить опкодом. ЦП может выполнить его., и пропустив длину инструкции взять сл.байт, ..но рано или поздно этому беспределу придёт конец! Процессору по-барабану, что и в какой последовательности выполнять. Он тупо работает и всё.. Вся ответственность на программисте. Исполнение данных может привести к непредсказуемым последствиям, и хорошо если ОС отреагирует на это обычным исключением, а не бсодом. Первый байт бывает опкодом только в реальном\16-битном режиме работы процессора (MS-DOS). В защищённом-же (Win.32\64-бит) - это префикс команды, о чём свидетельствует скрин выше. Например, если поместить одно и то-же значение в АХ и ЕАХ, то опкоды будут разные - к 32-битному(ЕАХ) добавиться префикс(66h) и инструкция станет на 3-байта длиннее. Вот окно 32-битного отладчика 'GRDB': Код:
А вот пример на ассемблере с потоком 'правильных' данных вместо кода.. Код:
и проц выполнит этот поток чисел без всяких возражений: Код:
..а К.Касперски дело глаголил (земля ему пухом!).. у него около 500-статей и все толковые: https://www.evilfingers.com/publicat...esearch_RU.php
Нашедшего выход - затаптывают первым..
Последний раз редактировалось R71MT; 11.10.2017 в 22:37. |
|
12.10.2017, 10:19 | #18 | ||
Новичок
Джуниор
Регистрация: 11.10.2017
Сообщений: 8
|
Цитата:
Цитата:
Меня интересовал именно принцип работы процессора, не важно какого, хоть для программируемого калькулятора. R71MT, Вы, можно сказать, спасли меня, все встало на свои места Последний раз редактировалось Loengreen; 12.10.2017 в 10:22. |
||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поиск вызова библиотечной функции в двоичном коде | Alex071 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 8 | 07.05.2013 17:44 |
Обратный порядок битов в двоичном коде. (Си) | ivan1492 | Помощь студентам | 4 | 18.03.2013 21:44 |
представить картинку в двоичном коде | Dimarik | Общие вопросы C/C++ | 22 | 16.04.2011 22:52 |
Хранение текста в двоичном файле | Nitrino | Общие вопросы C/C++ | 63 | 04.06.2009 02:46 |