gpt4 book ai didi

c++ - GCC 内联汇编中的一个简单的 while 循环

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:58 24 4
gpt4 key购买 nike

我想使用 GCC 扩展内联 ASM 编写以下循环:

long* arr = new long[ARR_LEN]();
long* act_ptr = arr;
long* end_ptr = arr + ARR_LEN;

while (act_ptr < end_ptr)
{
*act_ptr = SOME_VALUE;
act_ptr += STEP_SIZE;
}

delete[] arr;

一个长度为 ARR_LENlong 类型的数组被分配并初始化为零。循环遍历数组,增量为 STEP_SIZE。每个触摸的元素都设置为 SOME_VALUE

好吧,这是我在 GAS 中的第一次尝试:

long* arr = new long[ARR_LEN]();

asm volatile
(
"loop:"
"movl %[sval], (%[aptr]);"
"leal (%[aptr], %[incr], 4), %[aptr];"
"cmpl %[eptr], %[aptr];"
"jl loop;"
: // no output
: [aptr] "r" (arr),
[eptr] "r" (arr + ARR_LEN),
[incr] "r" (STEP_SIZE),
[sval] "i" (SOME_VALUE)
: "cc", "memory"
);

delete[] arr;

如评论中所述,此汇编代码确实更像是一个 do {...} while 循环,但它实际上做同样的工作。

那段代码的真正奇怪之处在于,它一开始对我来说运行良好。但是当我后来试图让它在另一个项目中工作时,它似乎什么也做不了。我什至制作了 working 项目的一些 1:1 拷贝,再次编译并且...结果仍然是随机的。

也许我对输入​​操作数采用了错误的约束,但实际上我现在已经尝试了几乎所有的约束,而且我没有真正的想法了。让我特别困惑的是,它在某些情况下仍然有效。

我不是 ASM 方面的专家,尽管我在大学时就学过它。请注意,我不是在寻求优化——我只是想了解内联汇编的工作原理。所以这是我的问题:我的尝试有什么根本性的错误,还是我在这里犯了一个更微妙的错误?提前致谢。

(使用 g++ MinGW Win32 x86 v.4.8.1)

更新

到目前为止,我已经尝试了这里提供的每一个建议。特别是我试过

  • 使用“q”操作数约束而不是“r”,有时有效,有时无效,
  • ... : [aptr] "=r"(arr) : "0"(arr) ... 相反,相同的结果,
  • 甚至 ... : [aptr] "+r"(arr) : ...,还是一样。

同时我知道官方documentation几乎用心了,但我仍然看不出我的错误。

最佳答案

您正在修改不允许的输入操作数 (aptr)。要么限制它与输出操作数匹配,要么将其更改为输入/输出操作数。

关于c++ - GCC 内联汇编中的一个简单的 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18440755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com