2009-11-06 6 views
9

Dies war eine Vor-Ort-Interview Frage und ich war verblüfft.Hallo Welt ohne Verwendung von Bibliotheken

Ich wurde gebeten, ein Hello World-Programm für Linux schreiben .. Das auch ohne Verwendung von Bibliotheken im System. Ich glaube, ich Systemaufrufe oder etwas verwenden .. Der Code sollte mit -nostdlib laufen und -nostartfiles Option ..

Es wäre toll, wenn jemand helfen könnte ..

+2

Welche Art von Arbeit, OS-Kernel zu schreiben? –

Antwort

9

Werfen Sie einen Blick auf example 4 (wird nicht mit einem Preis für die Portabilität gewinnen):

#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); 
} 

Edit: wie unten durch Zan Lynx wies darauf hin, das erste Argument sys_write ist die file descriptor. Daher macht dieser Code die ungewöhnliche Sache des Schreibens "Hello, world!\n" zu stdin (fd 0) anstelle von stdout (fd 1).

+0

Ich denke, Sie wollen Datei-Deskriptor 1 in Ihrem Schreiben syscall. –

+0

Hey, du hast Recht. Ich sehe, dass er in fast allen Beispielen auf dieser verlinkten Seite stdin statt stdout schreibt. – Stephan202

0

Sie müssten direkt mit dem Betriebssystem sprechen. Sie könnten write Dateideskriptor 1 (stdout), indem Sie:

#include <unistd.h> 

int main() 
{ 
    write(1, "Hello World\n", 12); 
} 
+2

Und woher glaubst du, dass "schreiben" kommt? –

0

Was ist ein Shell-Skript? Ich habe keine Programmiersprache in der Frage gesehen.

echo "Hello World!" 
+0

Auch wenn 'echo (1)' _doesn'_ die C-Standardbibliothek überhaupt nicht verwendet, bin ich mir ziemlich sicher, dass es hier eine implizite "C" -Sprache gibt (oder zumindest eine kompilierte Sprache). –

+2

Die OP spezifizierte gcc Compilerflags, was ziemlich viel aussagt, dass sie C im Kopf hatten. –

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! 
+10

Schreibt Gerätetreiber von der Oberseite seines Kopfes mit nur Katze ... – Don

+0

Könnten Sie eine "Assembly for Dummies" Erklärung des Codes geben? – Amro

+0

@Amro: sicher, ich habe eine kommentierte Version eingefügt: http://pastie.org/688375 – DigitalRoss