GNU内联汇编的问题

我做了一些重构的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

如何使这项工作任何提示的欢迎。 还有一个x86版本(内联汇编的)如何访问C定义的变量/ C ++结构将是有益的。 GNU的内联汇编解释什么是“= M”关键字做的文件也很有用。

提前致谢,

尤利安

--------------解决方案-------------

看看在警告消息的ASM:

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

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

如果是这样的情况下,请注意,原代码为 ,首先,并只发生在工作因为gcc决定替代,在ASM公司制作一个简单的地址表达。

从ibiblio上

“M”:内存操作数将被允许,任何地址的机器支持一般。

关于“错误” - 这是“唯一”的警告 - 尽量让小.c文件与此组装和拆解,看看如何obj​​dump的输出。 它可能给你线索就如何修改你的代码不会有这些警告

分类:C# 时间:2013-03-15 人气:0
本文关键词: C#,GNU,内联汇编
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.220 (s). 9 q(s)