有了上一篇的基础, 这次写一个我们已经滚瓜烂熟的C程序 helloworld 。只不过这次我们不能用到到C语言中的main()函数。
实验环境: linux 编译器: gcc 编辑器:Vim
1. 新建一个b.c的程序,并编译生成目标文件:
1 int notmain() 2 { 3 printf("hello world "); 4 exit(0); 5 }
$ gcc -c b.c -fno-builtin
2. 新建一个strlen.c的程序,用于统计字符串的长度,主要是为后面的printf()函数服务
1 int strlen(char *s) 2 { 3 int len = 0; 4 while(*s++) 5 { 6 len++; 7 } 8 return len; 9 }
$ gcc -c strlen.c 生成strlen.o的目标文件
3. 新建printf.s的汇编源文件, 利用汇编语言重新编写一个最简单的printf()函数,实习打印字符串的功能:
1 .global printf 2 3 printf: 4 pushl %ebp 5 movl %esp, %ebp 6 pushl %ebx 7 movl $4, %eax 8 movl $1, %ebx 9 movl 8(%ebp), %ecx 10 pushl %ecx 11 call strlen 12 mov %eax, %edx 13 mov $4, %eax 14 int $0x80 15 leave 16 ret
$ gcc -c printf.s 生成相应的目标文件printf.o
4. 我们还需要一个exit.c文件,并编译生成目标文件。(此处省略,与上一篇中的exit.c相同)
5. 此时所有准备工作都已经完成,我们的文件结构应该如图所示:
6. 把所有的目标文件用链接器链接起来生成我们所需要的可执行文件 :
$ ld *.o -e notmain -o notmain
7. 运行我们的notmain程序: $ ./notmain
可以看到在屏幕上打印了helloworld的字符串