vv40in
Зарегистрирован: 04.06.2008 Сообщения: 3
|
Добавлено: Пт Апр 17 2009 11:22 Заголовок сообщения: inline asm в GCC (i686)... оч.косвенная адресация.. и оптими |
|
|
весёлого времени сУток!
дано:
1)регистр (пусть ebx) содержит смещение в массиве.
2)указатель на массив - в стековой переменной (напр. buffer)
вопрос:
как записать в gcc одну (и только одну!!!) команду, чтоб доступисться к содержимому buffer по смещению offset?
я понимаю, что в конце концов это будет выглядеть в листинге примерно так:
movzbl <смещ.buffer.относит.esp>(%ebp,%ebx), %eax
но как добиться этого?
__asm__ __volatile__( "movzbl %0(%%ebx), %%eax":: "m"(buffer));
приводит к бреду типа (в листинге):
movzbl <смещ.buffer.относит.esp>(%ebp)(%ebx), %eax"
т.е. 2 регистра - каждыйв своих скобках!!!
что делать? не вычислять же смещение <смещ.buffer.относит.esp>!!!
как потом сопровождать?! (да и вообще - что за бред это в gcc. В VS указывается смещение относительно ebp. на него хоть можно положиться (в разумных прогах)).
а почему вся затея с inline asm? потому, что gcc не оптимизирует код (или я не знаю еще какие опции для этого). на одной машине код небольошого цикла после gcc(v.4.xx) выпоняется в 1.5 раза медленнее, чем после VSC!!! а судя по коду, gcc вообще не знает , что такое конвейр cpu!
так, подскажите, пож-ста, как записать такую вот команду |
|