Uboot调用库函数memset程序跑飞,贴出反汇编代码

隔夜月 2013-03-28 12:57:53
我在移植Uboot的时候,在uboot stage 2 发现代码在调用memset库函数的时候就跑飞了,很郁闷,我之后用点灯和反汇编来看,但是没看出问题,我把代码贴出来给大家看看,看哪里出了问题。我用两次点灯来定位问题,发现点灯1操作能正常,点灯2就不正常了,断定memset没有调用成功。不知道哪里出了问题,大家帮忙看看,谢谢了啊

C 代码:

/* ----------- Leds test chen ----------------------*/
(*((volatile unsigned int *)0x7F008820)) = 0x0110; //点灯1
(*((volatile unsigned int *)0x7F008824)) = 0x0;

memset ((void*)gd, 0, sizeof (gd_t)); //这里有问题

while (1);
/* -------------------------------- ----------------------*/

void * memset(void * s,int c,size_t count)
{

(*((volatile unsigned int *)0x7F008820)) = 0x1001; //点灯2
(*((volatile unsigned int *)0x7F008824)) = 0x0;

unsigned long *sl = (unsigned long *) s;
unsigned long cl = 0;
char *s8;
int i;

/* do it one word at a time (32 bits or 64 bits) while possible */
if ( ((ulong)s & (sizeof(*sl) - 1)) == 0) {
for (i = 0; i < sizeof(*sl); i++) {
cl <<= 8;
cl |= c & 0xff;
}
while (count >= sizeof(*sl)) {
*sl++ = cl;
count -= sizeof(*sl);
}
}
/* fill 8 bits at a time */
s8 = (char *)sl;
while (count--)
*s8++ = c;

return s;
}


反汇编代码:
57e00808 <start_armboot>:
57e00808: e59f3034 ldr r3, [pc, #52] ; 57e00844 <start_armboot+0x3c> //点灯1相关指令
57e0080c: e92d4010 push {r4, lr}
57e00810: e5933000 ldr r3, [r3] //点灯1相关指令
57e00814: e2438941 sub r8, r3, #1064960 ; 0x104000
57e00818: e2488020 sub r8, r8, #32 ; 0x20
57e0081c: e59fe024 ldr lr, [pc, #36] ; 57e00848 <start_armboot+0x40>
57e00820: e3a0c000 mov ip, #0 ; 0x0
57e00824: e3a03e11 mov r3, #272 ; 0x110 //点灯1相关指令
57e00828: e58e3820 str r3, [lr, #2080] //点灯1相关指令
57e0082c: e1a0100c mov r1, ip
57e00830: e1a00008 mov r0, r8
57e00834: e3a02020 mov r2, #32 ; 0x20
57e00838: e58ec824 str ip, [lr, #2084] //点灯1相关指令
57e0083c: eb004628 bl 57e120e4 <memset> //跳转memset执行
57e00840: eafffffe b 57e00840 <start_armboot+0x38>
57e00844: 57e00048 .word 0x57e00048
57e00848: 7f008000 .word 0x7f008000


57e120e4 <memset>:
57e120e4: e59f3088 ldr r3, [pc, #136] ; 57e12174 <memset+0x90> //点灯2相关指令
57e120e8: e92d4010 push {r4, lr}
57e120ec: e210c003 ands ip, r0, #3 ; 0x3
57e120f0: e1a04000 mov r4, r0
57e120f4: e59f007c ldr r0, [pc, #124] ; 57e12178 <memset+0x94> //点灯2相关指令
57e120f8: e5830820 str r0, [r3, #2080] //点灯2相关指令
57e120fc: e3a00000 mov r0, #0 ; 0x0
57e12100: e5830824 str r0, [r3, #2084] //点灯2相关指令
57e12104: e1a00004 mov r0, r4
57e12108: 1a000010 bne 57e12150 <memset+0x6c>
57e1210c: e1a0000c mov r0, ip
57e12110: e2800001 add r0, r0, #1 ; 0x1
57e12114: e20130ff and r3, r1, #255 ; 0xff
57e12118: e3500004 cmp r0, #4 ; 0x4
57e1211c: e183c40c orr ip, r3, ip, lsl #8
57e12120: 1afffffa bne 57e12110 <memset+0x2c>
57e12124: e1a00002 mov r0, r2
57e12128: e3a03000 mov r3, #0 ; 0x0
57e1212c: ea000001 b 57e12138 <memset+0x54>
57e12130: e784c003 str ip, [r4, r3]
57e12134: e2833004 add r3, r3, #4 ; 0x4
57e12138: e3500003 cmp r0, #3 ; 0x3
57e1213c: e2400004 sub r0, r0, #4 ; 0x4
57e12140: 8afffffa bhi 57e12130 <memset+0x4c>
57e12144: e3c23003 bic r3, r2, #3 ; 0x3
57e12148: e0840003 add r0, r4, r3
57e1214c: e2022003 and r2, r2, #3 ; 0x3
57e12150: e3a03000 mov r3, #0 ; 0x0
57e12154: ea000001 b 57e12160 <memset+0x7c>
57e12158: e7c01003 strb r1, [r0, r3]
57e1215c: e2833001 add r3, r3, #1 ; 0x1
57e12160: e3520000 cmp r2, #0 ; 0x0
57e12164: e2422001 sub r2, r2, #1 ; 0x1
57e12168: 1afffffa bne 57e12158 <memset+0x74>
57e1216c: e1a00004 mov r0, r4
57e12170: e8bd8010 pop {r4, pc}
57e12174: 7f008000 .word 0x7f008000
57e12178: 00001001 .word 0x00001001
...全文
298 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
隔夜月 2013-03-28
  • 打赏
  • 举报
回复
Hony杨 2013-03-28
  • 打赏
  • 举报
回复
个人觉得你点灯调试有问题,既然是C库的memset,你应该在该函数前后打印夹击它即可看出问题。

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧