Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вставка машинного кода в C++

4.8K
23 ноября 2004 года
xm...
45 / / 20.11.2004
Кто знает, как можно вставить вот такую вот ерунду, которая в ассемблере выглядит так:

CPU_ID MACRO
db 0fh
db 0a2h
ENDM

в нормальный код Visual C++, а лучше в блок _asm {..}
Жду ответов...
301
23 ноября 2004 года
lord Kelvin
897 / / 08.11.2004
А visual случайно не работает ли с ASM'ом так же, как GCC?
Цитата:

Inline Assembler в GCC
... Он имеет формат AT&T (в противоположность обычному формату Intel). Это означает, что:

Порядок операндов изменяется на обратный
В конце команды добавляется суффикс размера: B (байт), W (слово), L (двойное слово - long). Если размер команды следует из размера операндов, то суффикс необязателен, но лучше все же его добавить
Все непосредственные значения (константы) имеют префикс '$', регистры - префикс '%'
Вот несколько примеров соответствия синтаксиса AT&T синтаксису Intel:

AT&T Intel

movl $0, %eax mov eax, 0

movl $variable, %ebx mov ebx, variable

movw variable, %ebx mov ebx, word [variable]

movb $0, (,%eax,) mov [eax], byte 0

movl %eax, $111(%ebx, %edx, 2)
mov [111 + eax + edx*2], eax


Код на ассемблере можно вставить в исходник Си с помощью команды asm(..):
asm("movw %ax, %bx");

Несколько инструкций можно разделить обычным символом новой строки ('\n'):
asm("xorl %eax, %eax \n incl %eax");

4.8K
23 ноября 2004 года
xm...
45 / / 20.11.2004
Нет, не то. Мне нужно вставить машинный код, т.е. прямо коды, а не инструкции ассемблера. Это должно работать как конструкция
inline(#..#.....)
в Паскале. Должен же быть какой-либо эквивалент?
3
23 ноября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by xm...
Нет, не то. Мне нужно вставить машинный код, т.е. прямо коды, а не инструкции ассемблера. Это должно работать как конструкция
inline(#..#.....)
в Паскале. Должен же быть какой-либо эквивалент?



Вариант 1. Смотри _emit

Вариант 2. Создаешь байтовый массив, преобразуешь указатель на него в указатель на void(*)() функцию, вызываешь функцию по указателю:

 
Код:
const char instr[] = {0xC3};
typedef void(*PF)();

void main()
{
    PF pf = (PF)(void*)instr;
    pf();
}
4.8K
23 ноября 2004 года
xm...
45 / / 20.11.2004
Спасибо за помощь!
4.8K
23 ноября 2004 года
xm...
45 / / 20.11.2004
Ещё один вопрос ;)
_emit (и что-то похожее на это) не declared в Visual C++ .NET, а вот в Borland C++ 3.1 существует __emit__. Но мне нужно именно в Visual C++. а по второму способу что-то не фурычит, сильно ругается...
3
23 ноября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by xm...
Ещё один вопрос ;)
_emit (и что-то похожее на это) не declared в Visual C++ .NET, а вот в Borland C++ 3.1 существует __emit__. Но мне нужно именно в Visual C++. а по второму способу что-то не фурычит, сильно ругается...



Это достаточное для тебя доказательство :) :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_core_The__emit_Pseudoinstruction.asp

По поводу второго способа. Это хакинг, к нему надо подходить с ясной головой и чистыми руками.
Покажи код и расскажи на что именно ругается.

4.8K
24 ноября 2004 года
xm...
45 / / 20.11.2004
Большое спасибо за информацию, я просто не так себе представлял использование _emit (подумал _emit(0xF, 0xA, ...) да ещё в код это вставил).
А код таков, что нужно определить тип процессора Intel, если он выше 80486, и там используется эти машинные коды 0xF и 0xA2.
что-то типа:
void is_intel()
{
char _producer[12];
_asm {
mov eax, 0
// сюда надо вставить эти байты 0xF и 0xA2
mov dword ptr _producer, ebx
mov dword ptr _producer[+4], edx
mov dword ptr _producer[+8], ecx
}
// в _producer должно получится "GeniumeIntel"
}
а во втором случае выдаёт сообщение при вызове pf(): "Unhandled exception at ....". Конечно, не исключено, что я опять что-то недопонял. Но для меня более приемлемо использование _emit. Спасибо.
9.0K
05 февраля 2006 года
ZhekkA
36 / / 28.10.2005
А как иcпользовать в АСМ-коде свои переменные?
Код типа

int count;
asm("movw $count, %ax");

не работает.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог