写了个函数:
void test(s8 x,s8 y,s8 z)
{
u32 data,datb,datc,datm,datn;
u32 *scp;
u8 i,a,b,c,n,k,s,t;
if(z<50)
{
scp=datbuf; //数组名datbuf
a=x<<1;
a--;
b=z<<1;
b++;
scp+=a;
data=*scp++;
datb=*scp++;
....
}
}
1.问题点:
编译后打开汇编发现 data=*scp++编译错误,运行数据完全不对头。
2.多次重新排列语句顺序会有不同的错误出现,如datb=*scp++该语句编译错误
3.如果把data=*scp++拆成两句 data=*scp;scp++;编译又正常了。
编译错误图片如附件,搞不懂这是怎么了,求大神指点。
[img]file:///C:Documents and SettingsAdministratorApplication DataTencentUsers1661864269QQWinTempRichOle[56FX@
Y95HKDBVTX19KN@1U.png[/img]
补充说明:
把这两句改成 data=*scp;scp++;datb=*scp;scp++后编译才正常。汇编结果如附图。
按照你的描述,那么编译是正确的,实际上运行结果data/datb赋值的内容错误,把赋值和地址加1分开编译后运行结果才正确。
根据指令说明,该处应该是LDMIA.W RD! {寄存器列表} 每读取 Rd一次,地址递增一次。字宽 32bit.
一周热门 更多>