Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Microchip C内联asm不为内联asm中的即时生成前缀_C_Assembly_Inline Assembly_Microchip_Dspic - Fatal编程技术网

Microchip C内联asm不为内联asm中的即时生成前缀

Microchip C内联asm不为内联asm中的即时生成前缀,c,assembly,inline-assembly,microchip,dspic,C,Assembly,Inline Assembly,Microchip,Dspic,我正在尝试在asm中实现我自己的memcpy功能。CPU为dsPIC33F,编译芯片为C30 asm("repeat %2 \n mov.b [%1++], [%0++]" : : "r"(dst), "r"(src), "ri"(len)); 当len是变量时,这可以正常工作:编译器选择一个寄存器,没有问题。 但当len是编译时常量(例如10)时,汇编程序会说:错误:指定的操作数无效('repeat 10

我正在尝试在asm中实现我自己的
memcpy
功能。CPU为dsPIC33F,编译芯片为C30

asm("repeat %2 \n mov.b [%1++], [%0++]" 
   : : "r"(dst), "r"(src), "ri"(len));
len
是变量时,这可以正常工作:编译器选择一个寄存器,没有问题。 但当
len
是编译时常量(例如10)时,汇编程序会说:
错误:指定的操作数无效('repeat 10')。

这是因为微芯片汇编程序需要
#
在立即执行之前:
重复10

在源代码中使用
#%2
是不可行的,因为如果编译器选择一个寄存器,这将导致中断

这是一个微芯片编译器错误吗

是否有任何方法可以编写内联asm,使其正确扩展到

repeat reg
repeat#imm
对于
“ri”
“g”

您应该能够使用“#”,如何创建内联语句?您能显示一些代码吗?如果我使用
重复#%2
),则在
len
变为变量之前不会出现错误。如果
len
变为变量(例如存储在w10中),我得到错误:
指定的操作数无效('repeat#w10')
。完整代码只是定义memcpy(dst、src、len)asm(…)您是否尝试了
“ri”
“g”
?是的,两者都有。我还尝试了
“rI”
“rn”
如何包装asm?由于它是编译时内置的,“if”不应该生成任何运行时代码。然后你可以有一个带#的asm语句和一个不带。还有,你不应该有一个记忆障碍器吗?这段代码不会改变src/dst吗?根据(请参见警告),asm的输入参数(第二个冒号后的参数)是“只读”的,并且在退出asm语句时必须具有与进入时相同的值。