【发布时间】:2010-01-13 10:14:18
【问题描述】:
我在一个项目中大量使用内联汇编,在该项目中我需要在编译时调用具有未知数量参数的函数,而我自己管理自己让它工作,有时,在 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”,但没有任何改变。
【问题讨论】:
-
问题肯定是,“为什么不将指针传递给数组而不是将数组元素复制到堆栈中”,或者我错过了什么?沿着: func (someArray, this->someVar) 然后你也会得到性能提升(没有内存移动,没有循环)
-
我正在调用我无法控制的函数。他们在其他图书馆。我需要按照他们的期望将参数传递给他们。
-
通过在编译器的手下执行不成对的
push来改变局部变量的相对位置是非常非常糟糕的主意。 -
你的意思是:“你在做什么是一个非常糟糕的主意?”。老实说,我从 11 月开始学习 C++ 和汇编,所以我在这两方面都是新手。
标签: c++ inline-assembly