Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обратная польская запись, машинный код, проблема с 
:(
    Опции темы
Elandar
Дата 18.4.2010, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 29.8.2008

Репутация: нет
Всего: нет



Доброго времени суток! 
Пишу программу, которая строит график функции от трех переменных в неявном виде. 
Перед вычислением множества значений забиваю все в машинный код. Выглядит это так:

Код

bool CFunction::BuildCode() 
{ 
  BYTE common_data[4096]; 
  int data_count(0);

  common_data[data_count++] = 0x8b; 
  common_data[data_count++] = 0x4d; 
  common_data[data_count++] = 0xf8;

  for(int i=0; i<m_count; i++) 
  { 
    CChar &c = m_data;

    if(c.m_type == 0) 
    { 
      common_data[data_count++] = 0x68;    
      common_data[data_count++] = c.m_byte[0]; 
      common_data[data_count++] = c.m_byte[1]; 
      common_data[data_count++] = c.m_byte[2]; 
      common_data[data_count++] = c.m_byte[3]; 
    } 
    else if(c.m_type > 0) 
    { 
      common_data[data_count++] = 0xff; 
      common_data[data_count++] = 0xb1;

      union my_union 
      { 
        int pointer; 
        BYTE bytes[4]; 
      };

      my_union mu; 
      mu.pointer=0;

      int pointer(0); 
      switch(c.m_type) 
      { 
      case OP_X: mu.pointer = (int)&m_x;    break; 
      case OP_Y: mu.pointer = (int)
Код


&m_y;    break; 
      case OP_Z: mu.pointer = (int)&m_z;    break; 
      case OP_E: mu.pointer = (int)&m_exp;          break; 
      case OP_PI:mu.pointer = (int)&m_pi;    break; 
      }; 
      mu.pointer -= (int)this;

      common_data[data_count++] = mu.bytes[0]; 
      common_data[data_count++] = mu.bytes[1]; 
      common_data[data_count++] = mu.bytes[2]; 
      common_data[data_count++] = mu.bytes[3]; 
    } 
    else if( c.m_type <= OP_ADD && c.m_type>= OP_STEP) 
    { 
      common_data[data_count++] = 0xd9;  
      common_data[data_count++] = 0x44; 
      common_data[data_count++] = 0x24; 
      common_data[data_count++] = 0x04;

      common_data[data_count++] = 0xd9;  
      common_data[data_count++] = 0x04; 
      common_data[data_count++] = 0x24;

      switch(c.m_type) 
      { 
      case OP_ADD: 
        common_data[data_count++] = 0xde;//222 
        common_data[data_count++] = 0xc1;//193 
        break;

      case OP_SUB: 
        common_data[data_count++] = 0xde; 
        common_data[data_count++] = 0xe9;//233 
        break;

      case OP_MUL: 
        common_data[data_count++] = 0xde; 
        common_data[data_count++] = 0xc9;//201 
        break;

      case OP_DIV: 
        common_data[data_count++] = 0xde; 
        common_data[data_count++] = 0xf9;//249 
        break; 
      };

      common_data[data_count++] = 0x83;  
      common_data[data_count++] = 0xc4; 
      common_data[data_count++] = 0x04;

      common_data[data_count++] = 0xd9; 
      common_data[data_count++] = 0x1c; 
      common_data[data_count++] = 0x24; 
    } 
    else  
    { 
      common_data[data_count++] = 0xd9;  
      common_data[data_count++] = 0x04; 
      common_data[data_count++] = 0x24;

      switch(c.m_type) 
      { 
      case OP_SIN: 
        common_data[data_count++] = 0xd9; 
        common_data[data_count++] = 0xfe;//254 
        break; 
      case OP_COS: 
        common_data[data_count++] = 0xd9; 
        common_data[data_count++] = 0xff;//255 
        break; 
      case OP_ABS: 
        common_data[data_count++] = 0xd9; 
        common_data[data_count++] = 0xe1;//225 
        break; 
      case OP_SQRT: 
        common_data[data_count++] = 0xd9; 
        common_data[data_count++] = 0xfa;//250 
        break; 
      };

      common_data[data_count++] = 0xd9; 
      common_data[data_count++] = 0x1c; 
      common_data[data_count++] = 0x24; 
    } 
  }

  common_data[data_count++] = 0x5B;  
  common_data[data_count++] = 0x58;  
  common_data[data_count++] = 0xFF;  
  common_data[data_count++] = 0xE0;

  DWORD ignore; 
  if(!VirtualProtect(my_pointer, m_size, PAGE_EXECUTE_READWRITE, &ignore)) 
    return false;

  memcpy(my_pointer, common_data, sizeof(BYTE)*data_count);

  if(!VirtualProtect(my_pointer, m_size, PAGE_EXECUTE, &ignore)) 
    return false; 
  
  return true; 
} 


Как это работает? Где мне найти значения для других тригонометрических функций и операции "^"? Могут ли быть проблемы с переносимостью программы? 
OP_ADD,OP_SUB... - константы

Уже в интернете третий день сижу сутками не смог ничего найти.

Буду очень признателен за помощь! Программу пишу в образовательный целях. VS 2008 C++.[code=cpp]

Прикрепил .cpp и .h

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Project.rar 2,88 Kb
PM MAIL   Вверх
RomanEEP
Дата 18.4.2010, 15:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: нет
Всего: 8



Работает так:
в массив common_data[4096]; забивается машинный код для вычисления функции
Затем у системы запрашивается сегмент памяти
VirtualProtect(my_pointer, m_size, PAGE_EXECUTE_READWRITE, &ignore))
который может исполняться процессором и копируем туда весь код
Теперь по адресу my_pointer находится функция, вычисляющая нужную нам формулу. 

Коды других функций смотри в любом справочнике по x86 процессорам ( а самое главное по сопроцессору). Или получить эксперементальным способом - напиши код, делающий то что тебе нужно и под отладчиком открой окно CPU там и увидишь коды нужных тебе операций. Но в дополнение лучше взять справочник - сэкономишь кучу времени, т.к код операции состоит из кода самой операции, адресов операндов и дополнительных флагов

ЗЫ: Переносимость у такого кода минимальная. На других процах работать не будет, могут быть проблемы с моделью вызова (она определяет куда помещаются входные переменные, откуда берутся выходные, и кто ответсвенен за стек). Да и антивирусы такой код могут посчитать за подозрительный.
PM MAIL   Вверх
Elandar
Дата 18.4.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 29.8.2008

Репутация: нет
Всего: нет



Спасибо, RomanEEP за ответ!
Действительно, у друзей ругается антивирусы.
Проблему с переносимостью как-то можно решить оптимально?
PM MAIL   Вверх
xvr
Дата 19.4.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Elandar @  18.4.2010,  14:44 Найти цитируемый пост)
Где мне найти значения для других тригонометрических функций и операции "^"?
У первоисточника смотреть не пробовали? ( http://www.intel.com/products/processor/manuals )

Intel® 64 and IA-32 Architectures Software Developer's Manual

Volume 1: Basic Architecture
Volume 2A: Instruction Set Reference, A-M
Volume 2B: Instruction Set Reference, N-Z
Volume 3A: System Programming Guide
Volume 3B: System Programming Guide


PM MAIL   Вверх
RomanEEP
Дата 20.4.2010, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: нет
Всего: 8



оптимально эта проблему уже решена в .NET и Java
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.