Я широко использую встроенную сборку в проекте, где мне нужно вызывать функции с неизвестным количеством аргументов во время компиляции, и пока мне удается заставить ее работать, иногда в Linux (в Windows я не помню, чтобы была такая проблема) происходят такие странные вещи:
Если у меня есть что-то вроде
for(int i = 1; i >= 0; i--)
asm("push %0"::"m"(someArray[i]));
Оно работает.
Если у меня есть
for(int i = this->someVar; i >= 0; i--)
asm("push %0"::"m"(someArray[i]));
и я гарантирую своей жизнью, что someVar имеет значение 1, которое вызывает ошибку сегментации.
Также, если у меня есть
int x = 1;
for(int i = x; i >= 0; i--)
asm("push %0"::"m"(someArray[i]));
это работает, но
int x = this->someVar;
for(int i = x; i >= 0; i--)
asm("push %0"::"m"(someArray[i]));
не.
Кроме того, и это также странно, я могу сказать, что в некоторых функциях у меня нет проблем с выполнением этого в других, и все это в одном и том же объекте.
Если кто-то может указать мне некоторую информацию, которая может прояснить, в чем проблема, я был бы признателен.
Остерегайтесь, что мне действительно нужно вводить аргументы в цикл for, поэтому избежать этого невозможно.
Я также пытался использовать встроенное ассемблерное слово «volatile», но ничего не изменилось.
push
прямо под руками компилятора — очень и очень плохая идея. - person avakar   schedule 13.01.2010