весёлого времени сУток!
дано: 1)регистр (пусть ebx) содержит смещение в массиве. 2)указатель на массив - в стековой переменной (напр. buffer) 3)С-код:
a=buffer[b];
вопрос: как записать в gcc одну (и только одну!!!) команду, чтоб доступисться к содержимому buffer по смещению offset?
я понимаю, что в конце концов это будет выглядеть в листинге примерно так:
movzbl <смещ.buffer.относит.esp>(%esp,%ebx), %eax
а
__asm__ __volatile__( "movzbl %0(%%ebx), %%eax":: "m"(buffer));
movzbl <смещ.buffer.относит.esp>(%esp)(%ebx), %eax"
что делать? не вычислять же смещение <смещ.buffer.относит.esp>!!! как потом сопровождать?! (да и вообще - что за бред это в gcc. В VS указывается смещение относительно ebp. на него хоть можно положиться (в разумных прогах)).
а почему вся затея с inline asm? потому, что gcc не оптимизирует код (или я не знаю еще какие опции для этого). на одной машине код небольошого цикла после gcc(v.4.xx) выпоняется в 1.5 раза медленнее, чем после VSC!!! а судя по коду, gcc вообще не знает , что такое конвейр cpu!
а для с-кода, описанного выше, gcc генерирует аж 2(!!!) asm-команды, в то время, как VSC обходится одной... для очистки конвейра заранее на случай непредсказанного перехода gcc не предпрринимает усилий... и тд
подскажите, пож-ста, как записать эту команду!