有了上一篇的基础, 这次写一个我们已经滚瓜烂熟的C程序 helloworld 。只不过这次我们不能用到到C语言中的main()函数。

实验环境: linux  编译器: gcc  编辑器:Vim

1. 新建一个b.c的程序,并编译生成目标文件:

1 int notmain()
2 {
3     printf("hello world\n");
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的字符串

posted on 2014-11-27 13:04  beyond_Acm  阅读(178)  评论(0编辑  收藏  举报