gpt4 book ai didi

c++ - GNU 内联汇编问题

转载 作者:太空狗 更新时间:2023-10-29 21:29:40 25 4
gpt4 key购买 nike

我在 c167 做了一些重构特定于平台的代码,我偶然发现了一个内联汇编问题。

上一个代码:

  asm volatile ( "
extp #pag:%0, #3
mov r4, pof:%0 @ R4 = g_nRcvBufCount
sub r4, #1 @ R4 = R4 - 1
mov pof:%0, r4 @ g_nRcvBufCount = R4"
: "=m" (g_nRcvBufCount)
:
: "r4"
);

[

基本上这段代码对“g_nRcvBufCount”变量进行原子递减

“extp”指令获取“g_nRcvBufCount”变量的“页”和后面的原子表达式的数量(在本例中为 3 个)

]

当前 - 未编译代码:

  asm volatile ( "
extp #pag:%0, #3
mov r4, pof:%0 @ R4 = cfg->g_nRcvBufCount
sub r4, #1 @ R4 = R4 - 1
mov pof:%0, r4 @ cfg->g_nRcvBufCount = R4"
: "=m" (cfg->g_nRcvBufCount)
:
: "r4"
);

其中 cfg 是指向包含“g_nRcvBufCount”变量的结构的指针。

struct {
...
unsigned short g_nRcvBufCount;
...
}cfg;

编译时收到的错误是:

test.c:1124:Warning:Missing operand value assumed absolute 0. 
test.c:1124:extp #pag:[r2+#66],#3: trailing chars after expression
test.c:1125:Warning:Missing operand value assumed absolute 0.
test.c:1125:mov r4,pof:[r2+#66]: trailing chars after expression
test.c:1127:Warning:Missing operand value assumed absolute 0.
test.c:1127:mov pof:[r2+#66],r4: trailing chars after expression

欢迎任何关于如何使这项工作的提示。关于如何访问 C/C++ 结构中定义的变量的 x86 版本(内联汇编)也会有所帮助。解释“=m”关键字作用的 GNU 内联汇编程序的文档也很有用。

提前致谢

尤利安

最佳答案

查看警告信息中的asm:

extp #pag:[r2+#66],#3

显然 #pag: 后面有一个寄存器或绝对地址是有效的,但对于已经包含偏移量的更复杂的表达式则无效 [r2+#66]。您可能需要切换到使用包含 cfg->g_nRcvBufCount地址的 “r” 参数,而不是 “m” 引用它的参数。

如果是这种情况,请注意原始代码一开始就是伪造的,并且只是碰巧起作用,因为 gcc 决定替换一个在 asm 中起作用的简单地址表达式。

关于c++ - GNU 内联汇编问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4303860/

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