[原]最"小"的程序--内嵌汇编实现的hello world
时间:2010-05-21 来源:帅得不敢出门
/*
作者:帅得不敢出门 程序群 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);
}
作者:帅得不敢出门 程序群 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);
}
相关阅读 更多 +