一個tool.... objdump, 它可以做反組譯的工作...
$ gcc -g -static helloworld.c -o helloworld
$ objdump -S helloworld | less
.... 省略 ....
int main(void)
{
80481f4: 55 push %ebp
80481f5: 89 e5 mov %esp,%ebp
.... 省略 ....
printf("Hello World\n");
8048210: c7 04 24 e8 64 0a 08 movl $0x80a64e8,(%esp)
8048217: e8 e4 09 00 00 call 8048c00 <_IO_printf>
.... 省略 ....
08048c00 <_IO_printf>:
8048c00: 55 push %ebp
8048c01: 89 e5 mov %esp,%ebp
8048c03: 83 ec 0c sub $0xc,%esp
8048c06: 8d 45 0c lea 0xc(%ebp),%eax
8048c09: 89 44 24 08 mov %eax,0x8(%esp)
8048c0d: 8b 45 08 mov 0x8(%ebp),%eax
8048c10: 89 44 24 04 mov %eax,0x4(%esp)
8048c14: a1 b8 2e 0c 08 mov 0x80c2eb8,%eax
8048c19: 89 04 24 mov %eax,(%esp)
8048c1c: e8 af e9 00 00 call 80575d0 <_IO_vfprintf>
.... 省略 .... 以下不追了
總而言之 printf() -> _IO_printf() -> _IO_vfprintf() -> ...
printf()這函數經過很多處理,但是最後看printf的文件...
$ man 3 printf
....
The functions printf() and vprintf() write output to stdout, the standard output stream; fprintf() and vfprintf() write output to the given output stream;
所以,printf(); 同等於 fprintf(stdout, ...);
stdout是POSIX中預設的file descriptor。
除了file descriptor之外,還有file number,他們之間一定有什麼關係???
printf(fprintf)處理到最後,一定會呼叫write();此function,看以下的程式以及執行結果吧...
$ cat fn.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define HELLO_WORLD "Hello World\n"
int main(void)
{
printf("%d, %d\n", STDOUT_FILENO, fileno(stdout));
write(fileno(stdout), HELLO_WORLD, sizeof(HELLO_WORLD));
return 0;
}
$ gcc -Wall fn.c -o fn
$ ./fn
1, 1
Hello World
$
如此,hello world程式執些寫成這樣就行...
#include <unistd.h>
#define HELLO_WORLD "Hello World\n"
int main(void)
{
write(STDOUT_FILENO, HELLO_WORLD, sizeof(HELLO_WORLD));
return 0;
}
No comments:
Post a Comment