Ассемблерный код Код (Text): LL db "LoadLibraryA",0 GP db "GetProcAddress",0 EP db "ExitProcess",0 U32 db "user32",0 MB db "MessageBoxA",0 Как его записать в MSVSC в виде ассембленой вставки? Знаю что используется _emit, но не нашел как использовать.
JCronuz разбивать на буквы: Код (Text): #define DB __asm _emit __asm{ DB 'L' DB 'o' DB 'a' .... можно сделать DD и писать сразу по 4: 'Load' 'Libr' ...
GoldFinch Спасибо, а есть варианты написать макрос, что бы писать строчкой, а не по отдельности символы? Что то типа такого: Код (Text): APIs: DB "LoadLibraryA" DB 0
Ассемблерные вставки Visual C++ не предназначены для этого. Выносите в отдельный модуль .asm, компилируйте ассемблером (точнее сказать, ассемблируйте ассемблером) и линкуйте вместе с другими сишными модулями.
Имелось в виду Код (Text): // IN: x - строка которая будет представлятся по-символьно #define DB(x) int i = strlen(x);\ for (int j=0; j<i; j++){\ char ch=x[i];\ _asm _emit ch\ }\ _asm _emit 0 [...] DB ("LoadLibraryA")
foo(){ char* str = "некая строка"; __asm { mov eax,str ... } если планируется менять строку прямо по месту, то в С коде непохо хоть одну запись в нее произвести. на всякий
Да так наверное нельзя делать, потому что мой код базонезависимый, думаю что просто строку всталять в стуб не правильно.
Не могу понять, что происходит? что там во псевдокоде вас удивляет? я как получше объяснить пытаюсь изобрел. Сам принцип я думаю уловили. На счет выноса асмового модуля и линковки, так сейчас пробую. По символьно отдельно можно значит через Код (Text): _emit 'L' _emit 'o' _emit 'a' _emit 'd' _emit 'L' _emit 'i' _emit 'b' _emit 'r' _emit 'a' _emit 'r' _emit 'y' _emit 'A' А к строке через массив нельзя? Код (Text): // IN: x - строка которая будет представлятся по-символьно #define DB(x) int i = strlen(x);\ for (int j=0; j<i; j++){\ char ch=x[i];\ _asm _emit ch\ }\ _asm _emit 0 [...] DB ("LoadLibraryA") Почему?
JCronuz есть мысль, которую где-то слышал, что может не db а тип из цэ/це плус плус подобрать типа стринг что-ли который эквивалентен db EvilsInterrupt под стол - я еще понимаю, но под стул - я там просто не помещусь )))
а ся знает, что код включающий вашу асм вставку базонезависимый? ну, напишите foo(){ char str[] = "строка"; по идее, оно должно массив создать в стеке и в стеке же его и залить строкой. вы б дизасм посмотрели вместо гадать на пальцах, что наверно можно, а что нет
qqwe Не обязательно. Массив-то в стеке, а вот строка-инициализатор может быть и в глобальных данных. что-то типа такого: Код (Text): .data str db "строка", 0 foo: sub esp, 8 lea esi, [str] lea edi, [esp] mov ecx, 7 rep movsb ... На коротких строках такое вряд ли будет, насколько я знаю MSVC, скорее MOV'ом константы накидает, а вот на длинных - вполне. Тогда базонезависимости не будет