我在一些内联汇编代码上遇到了一些问题。我知道应该做什么,但我不知道怎么做!
我有一个几乎能够工作的校验和函数:
我的问题,在这一行代码上:: [sum] "+r" (sum) : [w0] "r" (w0)。 在第一条汇编线上,w0通过ldmia正确处理(执行该行时,数据在r4、r5中,w0递增)。但是递增后的w0值没有保存到任何地方,当代码循环时,原始值的w0又被加载了(请参见下面的汇编代码)。 我猜想,我应该在“:[sum]+r(sum):[w0]”上存储w0的值,但我不知道如何操作...
以下是函数内联汇编部分的反汇编代码:
请注意:
编译后,以下代码如下:
生成:
如您所见,我想在31928和3192c之间添加“str r3,[r11,#-20]”这样的内容,因为当程序循环到31910行时,r3将加载r3的初始值...
我认为这对于Stack Overflow社区内联汇编专家来说是一个简单的问题!
顺便说一下,我正在使用ARM7TDMI处理器(但这可能与此问题无关...)
提前致谢!
编辑:
为了验证我的想法,我测试了以下内容:
我有一个几乎能够工作的校验和函数:
static unsigned long cksum_unroll( unsigned short **w, int *mlen)
{
int len;
unsigned short *w0;
unsigned long sum=0;
len = *mlen;
w0 = *w;
while( len >= 8) {
asm volatile (
"ldmia %[w0]!, {v1, v2}\n\t"
"adds %[sum], %[sum], v1\n\t"
"adcs %[sum], %[sum], v2\n\t"
"adcs %[sum], %[sum], #0"
: [sum] "+r" (sum) : [w0] "r" (w0)
);
len -= 8;
}
*mlen = len;
*w = w0;
return (sum);
}
我的问题,在这一行代码上:: [sum] "+r" (sum) : [w0] "r" (w0)。 在第一条汇编线上,w0通过ldmia正确处理(执行该行时,数据在r4、r5中,w0递增)。但是递增后的w0值没有保存到任何地方,当代码循环时,原始值的w0又被加载了(请参见下面的汇编代码)。 我猜想,我应该在“:[sum]+r(sum):[w0]”上存储w0的值,但我不知道如何操作...
以下是函数内联汇编部分的反汇编代码:
请注意:
len is stored at r11, #-16
w0 is stored at r11, #-20
sum is stored at r11, #-24
编译后,以下代码如下:
asm volatile (
"ldmia %[w0]!, {v1, v2}\n\t"
"adds %[sum], %[sum], v1\n\t"
"adcs %[sum], %[sum], v2\n\t"
"adcs %[sum], %[sum], #0"
: [sum] "+r" (sum) : [w0] "r" (w0)
);
len -= 8;
生成:
00031910: ldr r3, [r11, #-20]
00031914: ldr r2, [r11, #-24]
00031918: mov r4, r2
0003191c: ldm r3!, {r4, r5}
00031920: adds r4, r4, r4
00031924: adcs r4, r4, r5
00031928: adcs r4, r4, #0
0003192c: str r4, [r11, #-24]
00031930: ldr r3, [r11, #-16]
00031934: sub r3, r3, #8
00031938: str r3, [r11, #-16]
如您所见,我想在31928和3192c之间添加“str r3,[r11,#-20]”这样的内容,因为当程序循环到31910行时,r3将加载r3的初始值...
我认为这对于Stack Overflow社区内联汇编专家来说是一个简单的问题!
顺便说一下,我正在使用ARM7TDMI处理器(但这可能与此问题无关...)
提前致谢!
编辑:
为了验证我的想法,我测试了以下内容:
asm volatile (
"ldmia %[w0]!, {v1, v2}\n\t"
"adds %[sum], %[sum], v1\n\t"
"adcs %[sum], %[sum], v2\n\t"
"adcs %[sum], %[sum], #0\n\t"
"str %[w0], [r11, #-20]"
: [sum] "+r" (sum) : [w0] "r" (w0)
);
这样做是有效的。也许这就是解决方案,但如果我修改函数,我要用什么来替换 "r11,#20"呢?
asm volatile ( "ldmia %[w0]!, {v1, v2}\n\t" "adds %[sum], %[sum], v1\n\t" "adcs %[sum], %[sum], v2\n\t" "adcs %[sum], %[sum], #0\n\t" "str %[w0], [r11, #-20]" : [sum] "+r" (sum) : [w0] "r" (w0) );
这段代码可以正常工作。也许这就是解决方案,但如果我修改函数,用什么来替换“r11,#20”呢? - Martin Allard