2010-12-31 3 views
3

Выходит из моего обычного домена VC++ в мир GCC (через MINGW32). Попытка создать PE Windows, который состоит в основном из НОП, аля:GOP NOPs компилируется

for(i = 0; i < 1000; i++) 
{ 
    asm("nop"); 
} 

Но либо я использую неправильный синтаксис или компилятор оптимизирует через них, потому что эти NOPS не выживают процесс компиляции.

Я использую флаг -O0, в противном случае значения по умолчанию. Любые идеи о том, как я могу уговорить компилятора оставить NOP без изменений?

+0

Может '-O0' проблема? Петли обычно устанавливаются оптимизатором. Попробуйте найти параметр для этого. – ruslik

+0

Это не так. Я начал без него. И я просмотрел ЧЕЛОВЕК - никаких кубиков. -O0 должен отключить оптимизацию, по буквальному определению. – Rushyo

+0

Из любопытства, почему петля задержки? В большинстве случаев я бы классифицировал это как «избегать за все расходы». * Помните, я не знаю, что в первую очередь касается Windows PE. – dmckee

ответ

2

Ожидаете ли вы его развернуть цикл до 1000 nop? Я сделал быстрый тест с gcc, и я не вижу (один) nop исчезают:

 xorl %eax, %eax 
     .p2align 4,,7 
.L2: 
#APP 
     nop 
#NO_APP 
     addl $1, %eax 
     cmpl $1000, %eax 
     jne  .L2 

С gcc -S -O3 -funroll-all-loops я вижу, раскатать в цикл 8 раз (при этом 8 nop), но я думаю, что если вы хотите 1000 это будет проще всего сделать:

#define NOP10() asm("nop;nop;nop;nop;nop;nop;nop;nop;nop;nop") 

И затем использовать NOP10(); ...

+0

Достаточно честный. Это было бы да. Обычно не играйте с встроенным ASM в целом. – Rushyo

+0

Уход. Не очень, но ... – Rushyo

+1

как насчет asm ("db 1000 dup (90h)")? – mbaitoff

2

This recent question about looping to 1000 without conditionals привело к умным ответом, используя шаблон рекурсии, который на самом деле может быть использован для производства ваша 1000 nop функция без повторения asm("nop") вообще. Есть некоторые оговорки: если вы не получите компилятор, чтобы встроить эту функцию, в итоге вы получите рекурсивный стек с 1000 глубинами отдельных функций nop. Кроме того, ограничение по умолчанию для шаблона gcc равно 500, поэтому вы должны явно указать более высокий лимит (см. Ниже, хотя вы можете просто избежать превышения nop<500>()).

// compile time recursion 
template<int N> inline void nop() 
{ 
    nop<N-1>(); 
    asm("nop"); 
} 

template<> inline void nop<0>() { } 

void nops() 
{ 
    nop<1000>(); 
} 

Собран с:

g++ -O2 -ftemplate-depth=1000 ctr.c 

 Смежные вопросы

  • Нет связанных вопросов^_^