ну порядок должен быть другой во-первых. ты же в пеб записываешь, а не читаешь из него. а насчет обращения к переменной хз
Код (Text): __asm__ ( "movl %fs:0x18,%eax\n" //Getting self TIB "movl 0x30(%eax),%eax\n" //Getting PEB "movl %0,%eax" //вот эта часть не воспринимается :: "Undefined reference to 'Peb' " : : "r" (&Peb));
UTeX Что генерит компилятор для Код (Text): PPEB GetCurrentPEB() { PPEB Peb; asm ("movl %%eax, %0\n" :"=r"(Peb)); return Peb; }
UTeX Продолжим. Что генерит компилятор для Код (Text): PPEB GetCurrentPEB() { PPEB Peb; asm( "movl %fs:0x18,%eax\n" "movl 0x30(%eax),%eax\n" ); asm ("movl %%eax, %0\n" :"=r"(Peb)); return Peb; } но чего с тем кодом в связке этот кусок не компилится Для начала не помешает огласить компилятор, а потом, если _хорошенько_ подумать, то можно все запихать в _один_ asm("...").
Код (Text): { PPEB Peb; __asm__("movl %%fs:0x18, %%eax\n\ movl 0x30(%%eax),%%eax\n\ movl %%eax, %0" : "=m" (Peb)); return Peb; }
UTeX Это mingw32-c++ 3.4.5 Я так понимаю, что речь о gcc 3.4.5. на этом закончим Вдогонку. Зачем вообще переменная Peb? Берем код Код (Text): PPEB GetCurrentPEB(void) { __asm__ ( "movl %%fs:0x18, %%eax\n" "movl 0x30(%%eax),%%eax\n" ); } компилируем Код (Text): "g++.exe" -fomit-frame-pointer -S foo.c получаем Код (Text): .file "foo.c" .text .align 2 .globl __Z13GetCurrentPEBv .def __Z13GetCurrentPEBv; .scl 2; .type 32; .endef __Z13GetCurrentPEBv: /APP movl %%fs:0x18, %%eax movl 0x30(%%eax),%%eax /NO_APP ret ps а если еще inline PPEB GetCurrentPEB(void){ ..., то вообще ...