char test[] = "abc";
init_uart();
putc('0');
putc('1');
puts("abc");
putc('o');
puts(test);
...
...
void puts(char *s)
{
int i = 0;
while (s[i])
{
putc(s[i]);
i++;
}
}
程序结果,测试putc正常,第一个puts("abc")输出乱码,并在puts中测试s指针为NULL;第二个puts(test),正常打印abc;我实在是想不出这个地方有什么问题,发帖请教个为大神些。
5 个解决方案
#1
第一,库里面已经有个puts了,小心冲突。
第二,两个"abc"存的地方不尽相同,嵌入式可能更明显。
第二,两个"abc"存的地方不尽相同,嵌入式可能更明显。
#2
可能缓存溢出?
#3
这个问题你仔细看看
#4
关于第一条在编译的时候加上
CFLAGS := -Wall -O2
CPPFLAGS := -nostdinc -nostdlib -fno-builtin 不使用编译器的库函数
第二:puts("abc")的参数存在rodata区,以下是反汇编代码
51000530: e59f0044 ldr r0, [pc, #68] ; 5100057c <main+0x74>
51000534: ebffff92 bl 51000384 <puts>
....
5100057c: 51000a58 tstpl r0, r8, asr sl
....
51000a58 <.rodata.str1.4>:
51000a58: 00636261 rsbeq r6, r3, r1, ror #4
传入puts的参数5100057c地址的内容51000a58 ,这个51000a58 上存的就是00636261(abc)
puts(test)的反汇编代码:
5100050c: e59f3064 ldr r3, [pc, #100] ; 51000578 <main+0x70>
51000510: e24dd008 sub sp, sp, #8
51000514: e28d4008 add r4, sp, #8
51000518: e5243004 str r3, [r4, #-4]!
....
51000540: e1a00004 mov r0, r4
51000544: ebffff8e bl 51000384 <puts>
....
51000578: 00636261 rsbeq r6, r3, r1, ror #4
查看地址也没有问题。
#5
仿真啊,光看是不行的,一步一步调
#1
第一,库里面已经有个puts了,小心冲突。
第二,两个"abc"存的地方不尽相同,嵌入式可能更明显。
第二,两个"abc"存的地方不尽相同,嵌入式可能更明显。
#2
可能缓存溢出?
#3
这个问题你仔细看看
#4
关于第一条在编译的时候加上
CFLAGS := -Wall -O2
CPPFLAGS := -nostdinc -nostdlib -fno-builtin 不使用编译器的库函数
第二:puts("abc")的参数存在rodata区,以下是反汇编代码
51000530: e59f0044 ldr r0, [pc, #68] ; 5100057c <main+0x74>
51000534: ebffff92 bl 51000384 <puts>
....
5100057c: 51000a58 tstpl r0, r8, asr sl
....
51000a58 <.rodata.str1.4>:
51000a58: 00636261 rsbeq r6, r3, r1, ror #4
传入puts的参数5100057c地址的内容51000a58 ,这个51000a58 上存的就是00636261(abc)
puts(test)的反汇编代码:
5100050c: e59f3064 ldr r3, [pc, #100] ; 51000578 <main+0x70>
51000510: e24dd008 sub sp, sp, #8
51000514: e28d4008 add r4, sp, #8
51000518: e5243004 str r3, [r4, #-4]!
....
51000540: e1a00004 mov r0, r4
51000544: ebffff8e bl 51000384 <puts>
....
51000578: 00636261 rsbeq r6, r3, r1, ror #4
查看地址也没有问题。
#5
仿真啊,光看是不行的,一步一步调