[心得] bss section

楼主: descent (“雄辩是银,沉默是金”)   2016-12-14 20:16:28
之前在《bss section (0) ( https://goo.gl/jlDiYt )》留下来的问题要在这篇解答。
先来看看 b.c, 这程式很简单, b.c L6 int i; 会放在 bss, p() 会把 c=i+1 用
itoa() 转成 string 印出。预期得到 1, 因为在 C 中, 教科书都告诉我们 int i; 虽然
没有初值, 但 c 会初始为 0, 这不是凭空得来的, 里头有魔法, 让我们来恶搞一下 bss
吧!
这是 bare-metal 程式, 和一般程式的编译以及执行方式有些不同。
b.c
1 asm(".code16gcc\n");
2
3 typedef unsigned char u8;
4 typedef unsigned int u32;
5
6 int i;
7 char* itoa(int n, char* str);
8
9 void print(const char *s)
10 {
11 while(*s)
12 {
13 __asm__ __volatile__ ("int $0x10" : : "a"(0x0E00 | *s), "b"(7));
14 s++;
15 }
16 }
17
18 int p()
19 {
20 int c=i+1;
21 char arr[6]="a";
22 char *s = arr;
23
24 //const char *str="test";
25 //volatile u8 *video_addr = (u8*)0xB8000;
26 //asm("movw $0xb000 %gs");
27 //*video_addr = 'a';
28 s = itoa(c, s);
29 print(s);
30 return c;
31 }
32
33 #if 1
34 char* itoa(int n, char* str)
35 {
36 char digit[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
37 char* p=str;
38 char* head=str;
39 int radix = 10;
40
41 // if(!p || radix < 2 || radix > 36)
42 // return p;
43 if (n==0)
44 {
45 *p++='0';
46 *p=0;
47 return str;
48 }
50 if (radix == 10 && n < 0)
51 {
52 *p++='-';
53 n= -n;
54 }
56 while(n)
57 {
58 *p++=digit[n%radix];
59 n/=radix;
60 }
61 *p=0;
63 for (
作者: wtchen (没有存在感的人)   2016-12-14 20:20:00
请问一下,上次看了你用sd开机的code,请问你SDRAMinitialization的部份放在哪?不然要怎么从sd加载到SDRAM
楼主: descent (“雄辩是银,沉默是金”)   2016-12-14 21:42:00
stm32用sram,不需要初始化就可以使用
作者: wtchen (没有存在感的人)   2016-12-14 22:01:00
感谢
作者: art1 (人,原来不是人)   2016-12-14 22:30:00
程式没有眼睛,请问要怎么看见全域变量或看不见区域变量?

Links booklink

Contact Us: admin [ a t ] ucptt.com