Привет вем. Хоту вот узнать: "А каким образом процессор, когда начинет обратывать код программы в памяти распознает, что очередные 'данные' являются командой процесса ли данными (т.е. значениями которыми оперирует программа? Ведь в принципе память преставляет из себя набор 16-х чисел, если смотреть в каком нибудь отладчике. И вообще можно ли сделать так что бы процессор посчитал команду за данные, а данные за команду?"
Своими словами и "на пальцах": А он ниче распознать и неможет. Начинает исполнять код куда регистры пошлют. посылают обычно на корректную команду (...хотя ) а за ней если нада всегда порция данных к ней. Ты же не ходиш два раза правой патом один раз левой, а надеюсь поочереди?.. Так и он команда... если треба данные... итд... Поменять местами мона и иногда нуна, самомодифицирующийся код хотябы, или Shell - строки, да малоли чего ышо? Конкретных ссылок непомну про все это в сети многа всего...
Guintter Процессор может выполнять только команды, но некоторые "данные" при этом тоже могут "выполниться".
crypto Особенно если руки кривые . Ну или наоборот слишком прямые. Видел как-то на сайте о дельфи компилятор математических выражений текстовую строку типа "sin(x)*2 +cos(2*x)" он компилировал ввиде виртуальной функции и передавал ей управление и она вычислялась со скоростью натив программ Я хочу попробовать на асме сделать нечто подобное
murtix Ну да, я бы тоже сделал рекурсивный анализатор, пихал-бы пи-коды в стек, а потом полученную конструкцию проинтерпретировал. Очень хороший и шустрый анализатор выражений есть в Компиляторе Паскаля, который написан практически на ассемблере. Если нужно, могу порыться в своих архивах, где-то у меня была разIDAванная версия.
murtix Когда я писал свой компилятор паскаля, мне как раз и требовалось такое =) Транслировал в обратную польскую нотацию, благо транслировать её в асм-код очень удобно. upd: Посмотрел модуль по ссылке выше, грамотно всё реализовано =) Хотя ИМХО разделение проверки и трансляции зря сделал.
murtix Вот тебе файл TPC.IDB (под IDA 4.8), там много разобрано, но не все. Смотри процедуры Evaluate*, там как-раз разбор выражений. Код очень хороший - в то время Борланд писал отличные программы. Не прикрепился, хотя кто-то мне сказал про 500К... Попробую на slil.ru: http://slil.ru/23564023