Нужно в нейкед-функции инициализировать строку подскажите какой-нибудь макрос, чтобы можно было в асм-вставке сразу вписать инициализированную строку, например так _asm { ... ... ret mystr "blablablabla" } Юзать _emit(..) и побайтно инициализировать - не удобно можно ж как-то сразу макросом организовать?
zoool c __VA_ARGS финт не получился, но можно использовать бояный трик: Код (Text): #include <stdio.h> #define EMIT_STR(string) __asm _emit string; #define _ __asm _emit void main() { __asm { call over_string EMIT_STR('a' _ 'b' _ 'c' _ 'd' _ 0) over_string: // do something //call printf } exit(0); }
респект! чтоб не создавать отд. тему, спрошу в этой же Предположим, функция naked в ней юзается чуть более 100 переменных (большая функция =) ) Код (Text): #define total_vars_size 460; PVOID _declspec(naked) _stdcall FindARX (ULONG ChgNum) { CHAR CompressBuf[0x100]; ULONG a, b, c .... ; PVOID ...; _asm { push ebp mov ebp, esp sub esp, total_vars_size .... retn 4 }; }; Вопрос Можно как-то автоматизировать нахождение общего размера переменных? Сейчас пересчитываю размер вручную, что очень неудобно. Размер переменных постоянно меняется, т.к. по мере разработки и отладки что-то добавляется, что-то уменьшается. А "брать с запасом" - мне не нравится =\ Нужно точное значение...
censored думал об этом. Но тогда теряется наглядность кода. Или действительно я ламо. Как в асме обращаться к таким переменным по имени, а не по смещению в структуре?
zoool Код (Text): #include <stddef.h> typedef struct foo_t { int a, b, c, d; } foo_t; __declspec(naked) foo() { enum { _a = offsetof(struct foo_t, a) }; __asm { push ebp mov ebp, esp sub esp, size foo_t mov dword ptr [ebp-_a], 0 mov esp, ebp pop ebp retn } } void main() { foo(); } P.S. Вообще непонятно зачем так извращаться, сложностей что ли в жизни не хватает? Пиши что надо (это наверное код какой-нибудь для инжекта) на своем любимом ассемблере, остальной код на С, линкуй к С-проекту свой .obj.
MSDN: Код (Text): // the__local_size_symbol.cpp __declspec ( naked ) main() { int i; int j; __asm /* prolog */ { push ebp mov ebp, esp sub esp, __LOCAL_SIZE } /* Function body */ __asm /* epilog */ { mov esp, ebp pop ebp ret } }