8

これはオンサイトインタビューの質問で、私は困惑しました。

Linux用のHello worldプログラムを書くように頼まれました..それもシステム内のライブラリを使用せずに. システムコールか何かを使用する必要があると思います..コードは -nostdlib および -nostartfiles オプションを使用して実行する必要があります..

誰かが助けてくれたら最高だ..

4

6 に答える 6

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!
于 2009-11-06T22:40:59.013 に答える
9

例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の最初の引数はファイル記述子です。したがって、このコードは、 stdout(fd 1)ではなくstdin(fd 0)に"Hello, world!\n"書き込むという珍しいことを行います。

于 2009-11-06T22:30:09.580 に答える
2

以下のリンクにある例のように、純粋なアセンブラで書いてみてはどうでしょうか。

http://blog.var.cc/blog/archive/2004/11/10/hello_world_in_x86_assembly__programming_workshop.html

于 2009-11-06T22:38:41.580 に答える
0

OSに直接話しかける必要があります。write次のようにして、記述子 1 (stdout) をファイルすることができます。

#include <unistd.h>

int main()
{
    write(1, "Hello World\n", 12);
}
于 2009-11-06T22:34:11.990 に答える
0

シェルスクリプトはどうですか?質問にはプログラミング言語の要件はありませんでした。

echo "Hello World!"
于 2009-11-06T22:34:13.457 に答える