я знаю, я некропостер)) искал в гугле схожую проблему, неизвестно откуда берущийся memset при отсутствии (по идее) CRT идея подсунуть линкеру свою memset фейлится с ошибкой наподобие "невозможно переопределить intrinsic функцию"
s0larian не прокатит minlexx вобще-то задача была заставить компилер заинлайнить функцию, в таком случае CRT не привязалась бы к проекту, такое спокойно проходит в MS VC++ 6.0, но не в MS VS .NET 2005 и это бага частично задача была решена подсовыванием свое функции memset, т.е. в бинарник попала моя функция, а не реализация из CRT
Asterix, так это ж другой случай совсем. Если ты паришься с тем что компилер втыкает extern _memset, то это может решится на стадии линкера.
Сегодня возился с этой же проблемой - как сделать intrinsic memset в VS2008. Решение - функции __stosb и __stosd было: memset (buf, 0, 1022); Код (Text): push 1022 ; 000003feH lea eax, DWORD PTR _buf$[esp+1036] push 0 push eax call _memset стало: __stosb (buf, 0, 1022); Код (Text): xor al, al lea edi, DWORD PTR _buf$[esp+1044] mov ecx, 1022 ; 000003feH rep stosb
неясно зачем парить мозг просит _memset/_memcpy_chkstk/_allmul/... - дайте ему это соберите lib файл с тем что вас просят и добавьте ее к проекту сколько уже раз можно поднимать эту тупую тему )?
можно, но intrinsic меньше и (возможно) быстрее => __stosd будет более эффективно, чем самописная функция memset PS. А если в CRT посмотреть функцию memset - это тихий ужас, мешанина условных переходов. Чем они думали - непонятно.
в топике было предложено нормальное решение, не работает разве? создаем файл memset.cpp Код (Text): #pragma function(memset) extern "C" void * __cdecl memset (void *dst, int val, size_t count) { void *start = dst; while (count--) { *(char *)dst = (char)val; dst = (char *)dst + 1; } return (start); } подключаем к проекту Код (Text): #if _MSC_VER == 1400 #include "memset.cpp" #endif /* _MSC_VER == 1400 */
Код (Text): #include "crt.h" __declspec(naked) void __cdecl _chkstk() { __asm { // // ecx = original esp // push ecx lea ecx,[esp+4] // // ecx = stack frame size // sub ecx,eax // // eax = align_down(esp, PAGE_SIZE) // mov eax,esp and eax,0FFFFF000h chk_esp_pos: cmp ecx,eax jb one_more_page mov eax,ecx pop ecx xchg eax,esp mov eax,dword ptr [eax] mov dword ptr [esp],eax ret one_more_page: // // eax = eax - PAGE_SIZE // sub eax,1000h // // touch page // test dword ptr [eax],eax // // step to the next one // jmp chk_esp_pos } } #pragma intrinsic(__emulu) __int64 __cdecl _allmul( __int64 a, __int64 b ) { return __emulu(LODWORD(a), LODWORD(b)) + MAKEQWORD( 0, LODWORD(HIDWORD(a)*LODWORD(b) + LODWORD(a)*HIDWORD(b)) ); } void * __cdecl memcpy( void* dest, const void* src, unsigned int count ) { int i = 0; for(i = 0; i < count; i++) { ((unsigned char* )dest)[i] = ((unsigned char* )src)[i]; } return dest; } void * __cdecl memset( void* dest, int c, unsigned int count ) { int i = 0; for(i = 0; i < count; i++) { ((unsigned char* )dest)[i] = (unsigned char)c; } return dest; } в lib файл и подключить к проекту
Помнится, нужно было мне как-то раз обойтись без RTL, и мешалась memset. При этом была включена link-time code generation, и на реализацию memset прямо в исходнике компилятор дико ругался. Метод со __stosd интересный, но, к сожалению, подходит только для замены явных вызовов memset, а компилятор студии имеет привычку вставлять memset и самостоятельно, в конструкциях типа Код (Text): some_struct t = {0}; и Код (Text): for (int i=0;i<n;i++) p[i]=1; - для таких вызовов всё же придётся реализовывать memset.
9х неподдерживаемая ось из эпохи динозавров. пора бы уже снести давно. облегченная XP на любой машине идет а по теме - нужно crt.lib свою собрать и жить дальше