这是一个现场采访问题,我很困惑。
我被要求为linux编写一个Hello world程序..那也是 不使用系统中的任何库。我想我必须使用 系统调用或什么..代码应该使用-nostdlib和 -nostartfiles选项..
如果有人可以提供帮助,那就太棒了。
答案 0 :(得分:17)
$ cat > hwa.S
write = 0x04
exit = 0xfc
.text
_start:
movl $1, %ebx
lea str, %ecx
movl $len, %edx
movl $write, %eax
int $0x80
xorl %ebx, %ebx
movl $exit, %eax
int $0x80
.data
str: .ascii "Hello, world!\n"
len = . -str
.globl _start
$ as -o hwa.o hwa.S
$ ld hwa.o
$ ./a.out
Hello, world!
答案 1 :(得分:9)
看看example 4(不会因为便携性获奖):
#include <syscall.h>
void syscall1(int num, int arg1)
{
asm("int\t$0x80\n\t":
/* output */ :
/* input */ "a"(num), "b"(arg1)
/* clobbered */ );
}
void syscall3(int num, int arg1, int arg2, int arg3)
{
asm("int\t$0x80\n\t" :
/* output */ :
/* input */ "a"(num), "b"(arg1), "c"(arg2), "d"(arg3)
/* clobbered */ );
}
char str[] = "Hello, world!\n";
int _start()
{
syscall3(SYS_write, 0, (int) str, sizeof(str)-1);
syscall1(SYS_exit, 0);
}
修改:正如下面Zan Lynx所指出的,sys_write的第一个参数是file descriptor。因此,此代码执行将"Hello, world!\n"
写入stdin(fd 0)而不是stdout(fd 1)的不常见的事情。
答案 2 :(得分:2)
如在以下链接中提供的示例中那样在纯装配中编写它?
http://blog.var.cc/blog/archive/2004/11/10/hello_world_in_x86_assembly__programming_workshop.html
答案 3 :(得分:0)
你必须直接与操作系统交谈。您可以通过执行以下操作write
来提交描述符1(stdout):
#include <unistd.h>
int main()
{
write(1, "Hello World\n", 12);
}
答案 4 :(得分:0)
shell脚本怎么样?我在问题中没有看到任何编程语言要求。
echo "Hello World!"
答案 5 :(得分:0)
.global _start
.text
_start:
mov $1, %rax
mov $1, %rdi
mov $yourText, %rsi
mov $13, %rdx
syscall
mov $60, %rax
xor %rdi, %rdi
syscall
yourText:
.ascii "Hello, World\n"
您可以使用gcc
进行组装和运行:
$ vim hello.s
$ gcc -c hello.s && ld hello.o -o hello.out && ./hello.out
或使用as
:
$as hello.s -o hello.o && ld hello.o -o hello.out && ./hello.out