sqfasd 发表于 2011-11-14 18:27

大家帮忙看看这段汇编代码有啥问题,内嵌汇编实现的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两个指令。
对底层的技术不是太熟,但很有兴趣,求指导

garyv 发表于 2011-11-14 20:13

有2点需要确认:
1.你确认size是32的整数倍?
2.SUBS指令会影响标志位Z?

sqfasd 发表于 2011-11-15 09:27

回复 2# garyv


1.可以确定,拷贝数据的大小是32的倍数
2.我试过去掉LDMIA和STMIA两个指令,测试R0确实是等于0的时候结束循环

garyv 发表于 2011-11-15 11:10

本帖最后由 garyv 于 2011-11-15 11:15 编辑

将:
LDR R1,
LDR R2,

替换成:
LDR R1,dst
LDR R2,src

试试,你用ads编译工具不知能否编译通过

还有一点就是,LDM/STM类指令好像要求两个操作数中的寄存器都在R0~R7范围之类,所以上述代码可能有问题,你的编译器没有报错?!

sqfasd 发表于 2011-11-15 17:09

回复 4# garyv


中括号去掉的话编译会报错。
LDM/STM指令编译没有报错,改成R3-R6,一次16个字节,运行还是崩溃。
MTK平台有点奇怪啊,这些代码都是从网上抄来的,别人的ARM都能跑,为啥一到我这就不行了呢
页: [1]
查看完整版本: 大家帮忙看看这段汇编代码有啥问题,内嵌汇编实现的memcpy