大家帮忙看看这段汇编代码有啥问题,内嵌汇编实现的memcpy
本帖最后由 sqfasd 于 2011-11-15 09:28 编辑void memcpy_32(void *dst, void *src, unsigned int size)
{
__asm
{
LDR R1,
LDR R2,
MOV R0,size
LOOP:
LDMIA R2!,{R3-R10}
STMIA R1!,{R3-R10}
SUBS R0, R0, #32
BNE LOOP
}
}
static char data = {0};
for(i=0;i<10;i++){
memcpy_32(screen, data, sizeof(data));
}
使用该函数的场景就是将一段存在栈中的320*480*2大小的数据拷贝到指定的显示缓冲区上
编译工具是ads1.2
运行环境是手机平台MTK6236 11A
我遇到的问题是,一运行这段代码,系统就崩溃,屏幕显示fatal error,和一个出错的地址。
好像是内存越界了,问题可能出在LDMIA和STMIA两个指令。
对底层的技术不是太熟,但很有兴趣,求指导 有2点需要确认:
1.你确认size是32的整数倍?
2.SUBS指令会影响标志位Z? 回复 2# garyv
1.可以确定,拷贝数据的大小是32的倍数
2.我试过去掉LDMIA和STMIA两个指令,测试R0确实是等于0的时候结束循环 本帖最后由 garyv 于 2011-11-15 11:15 编辑
将:
LDR R1,
LDR R2,
替换成:
LDR R1,dst
LDR R2,src
试试,你用ads编译工具不知能否编译通过
还有一点就是,LDM/STM类指令好像要求两个操作数中的寄存器都在R0~R7范围之类,所以上述代码可能有问题,你的编译器没有报错?! 回复 4# garyv
中括号去掉的话编译会报错。
LDM/STM指令编译没有报错,改成R3-R6,一次16个字节,运行还是崩溃。
MTK平台有点奇怪啊,这些代码都是从网上抄来的,别人的ARM都能跑,为啥一到我这就不行了呢
页:
[1]