English 中文(简体)
坡道内的在线集会
原标题:Inline assembly inside loops

我在一个项目中大量使用网上集会,在这个项目中,我需要在汇编时间时以人数不明的论据来召集职能,而我却设法让它去工作,有时在轴心中(在窗户中,我不记得这个问题),这样会发生:

如果我有这样的情况的话,我会做些什么。

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]));

我一生就保证,一些瓦尔人持有价值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]));

不适用。

同样奇怪的是,我可以说,虽然在某些职能中,我并没有遇到问题,而在另一些职能中,我也都怀着同样的目标。

如果有人能够向我指出能够澄清问题的一些信息,我将不胜感激。

我意识到,我确实必须把论点推向 lo,以避免它。

我还尝试使用“无能为力”的在线组装字,但没有任何变化。

最佳回答

我可以理解问题是什么,但试图用同手法相同的明确编码撰写法典。

asm{
   loop1:
     mov ax, this->var
     ......
     dec ax
     cmp ax, 0
     je exit
     jmp loop1
}

......

离职:

此外,还试图将“老”价值作为静态数值,这也会有所助益。

问题回答

仔细研究。 最可能的原因是,<代码>i和(或)具有最终价值的变数,正在从<<><<<<>for loop>和push/code>每一代编码上固定的折中部分中,冲抵编者预期的点数,并因此造成错误的数值。

您可以尝试各种工作方式(例如,宣布地方变量register<>/code>),但不幸的是,在C/C++的正确行为方面,没有良好的途径。 为了避免这一问题,正如奥诺多多诺所建议的那样,实施 yourself。

在这里,我心血清脱bu:

<代码>ithis >最有可能储存在 st上,在386和上,机码可直接查阅esp-rel memory sites,因此,汇编者可提出类似指示。

mov eax,[esp+8]

将<代码>ts的数值输入<条码>。 问题是,你的<代码>push操作标注器,因此,这些硬代码出入器在第一次喷洒后将进入(越来越错)记忆点。

最有可能的是,没有<条码>的较简单的循环形式,即“ts->someVar,由汇编者更彻底地加以选择,并形成只使用登记册的机器编码,而没有<条码>sp-rel Accesses,即继续从事罚款。

一次,通过<条码>ebp<>/条码>登记册,所有记忆都能够查阅当地变量和论点。 您的在线组装代码没有改变这一登记册。 如果能找到一个编汇人来强迫使用<代码>ebp<>/code>而不是esp,这可以解决你的问题。

<>strong>Warning:,汇编者并不期望你看一看一栏——它期望在顶点的所有时间都知道。 如果你真心想把事情推向 st,我建议把整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整整册。 已经这样做。

首先,可能发生的情况是,气温低的电梯正在使用梯子来计算贵国的当地变量,而不是使用梯子。 这是一种优化,允许使用基准点(BP under x86)作为另一个一般用途登记册,避免制定框架的许多代码。 框架基本上只是属于地方职能的SP和BP之间的领域。 我很幸运的是,如果你向全岛发出呼吁,要求你将规模推到这一功能中,那么大家就会更好,因为它会迫使汇编者不做这一优化工作。

That being said, the bug is really in your code. Unless you really know what you re doing you should never exit an inline asm with the stack pointer different than what it was when you entered the inline asm. Compilers almost always think that they exclusively own the stack pointer. They depend on it staying the same so that they can use it to find where they have stored variables. You should also stay away from the frame pointer (BP).

it到那些东西的时代是罕见的,通常就环境变化代码(从一对一对一对或向另一方向转变)。

如果你知道对增量的限制,你就只能把它称为单一功能,要求有这么多的论据,使你的实际论点接近尾声。

警告:X86_64 abi在某些参数中使用登记册,也打破了这一登记册和你的代码。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签