/* 作者:帅得不敢出门 程序群 3503799 看了程序员的自我修养 --链接 装载 与库 后写的 直接使用系统调用实现打印hello world kernel 2.6.23 原理:写stdout来实现输出 stdout对应fd是1不是0 这个书中有误 smlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t count) 高版本的kernel好像这个接口变了 改成用某个宏实现了 gcc $file -o $file.o ld -e nomain -o $file $file.o */ void exit(int status) { __asm__ __volatile__( "movl $1, %%eax/n/ movl $0, %%ebx/n/ int $0x80/n" ::: ); }//这里会报warning 警告:‘noreturn’函数确实会返回 不知道怎么修改 后来看了下链接装载与库这本书 它ebx传的是42 //暂时没有测试 不知道这个42有何特殊意义 int puts(const char *s) { unsigned int writelen = 0; //unsigned int ret; if (s==(void*)0) return -1; while('/0' != s[writelen]) //此处调用putchar可能会更高效些 ++writelen; __asm__ __volatile__( "movl $4, %%eax /n/ movl $1, %%ebx /n/ int $0x80" ://:"=a"(ret) :"c"(s), "d"(writelen) ); //return ret; //eax做为返回值 所以这里没有必要为ret分配空间 } void nomain(void) { puts("Hello World!/n"); exit(0); }