| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Обратная польская запись, машинный код, проблема с |
| Автор: Elandar 18.4.2010, 14:44 | ||||
| Доброго времени суток! Пишу программу, которая строит график функции от трех переменных в неявном виде. Перед вычислением множества значений забиваю все в машинный код. Выглядит это так:
Как это работает? Где мне найти значения для других тригонометрических функций и операции "^"? Могут ли быть проблемы с переносимостью программы? OP_ADD,OP_SUB... - константы Уже в интернете третий день сижу сутками не смог ничего найти. Буду очень признателен за помощь! Программу пишу в образовательный целях. VS 2008 C++.[code=cpp] Прикрепил .cpp и .h |
| Автор: RomanEEP 18.4.2010, 15:18 |
| Работает так: в массив common_data[4096]; забивается машинный код для вычисления функции Затем у системы запрашивается сегмент памяти VirtualProtect(my_pointer, m_size, PAGE_EXECUTE_READWRITE, &ignore)) который может исполняться процессором и копируем туда весь код Теперь по адресу my_pointer находится функция, вычисляющая нужную нам формулу. Коды других функций смотри в любом справочнике по x86 процессорам ( а самое главное по сопроцессору). Или получить эксперементальным способом - напиши код, делающий то что тебе нужно и под отладчиком открой окно CPU там и увидишь коды нужных тебе операций. Но в дополнение лучше взять справочник - сэкономишь кучу времени, т.к код операции состоит из кода самой операции, адресов операндов и дополнительных флагов ЗЫ: Переносимость у такого кода минимальная. На других процах работать не будет, могут быть проблемы с моделью вызова (она определяет куда помещаются входные переменные, откуда берутся выходные, и кто ответсвенен за стек). Да и антивирусы такой код могут посчитать за подозрительный. |
| Автор: Elandar 18.4.2010, 17:36 |
| Спасибо, RomanEEP за ответ! Действительно, у друзей ругается антивирусы. Проблему с переносимостью как-то можно решить оптимально? |
| Автор: RomanEEP 20.4.2010, 22:40 |
| оптимально эта проблему уже решена в .NET и Java |