2009-11-06 22 views
9

Questa era una domanda di intervista in loco e io ero sconcertato.Ciao mondo senza usare le librerie

Mi è stato chiesto di scrivere un programma Hello world per linux. Anche questo senza utilizzare alcuna libreria nel sistema. Penso di avere usare chiamate di sistema o qualcosa del genere .. Il codice dovrebbe essere eseguito utilizzando -nostdlib e -nostartfiles opzione ..

Sarebbe bello se qualcuno potesse aiutare ..

+2

Che tipo di lavoro, scrittura kernel del sistema operativo? –

risposta

9

Dai un'occhiata alla example 4 (non vincerà un premio per la portabilità):

#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: come ha sottolineato Zan Lynx seguito, il primo argomento di sys_write è il file descriptor. Quindi questo codice fa la cosa rara di scrivere "Hello, world!\n" a stdin (fd 0) invece di stdout (fd 1).

+0

Penso che vuoi il descrittore di file 1 nel tuo syscall di scrittura. –

+0

Ehi, hai ragione. Vedo che in quasi tutti gli esempi su quella pagina collegata scrive su stdin anziché stdout. – Stephan202

0

Dovresti parlare direttamente al sistema operativo. Si potrebbe write nel descrittore di file 1, (stdout), facendo:

#include <unistd.h> 

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

E da dove credi che "scrivi" venga? –

0

Che dire di uno script di shell? Non ho visto alcun requisito di linguaggio di programmazione nella domanda.

echo "Hello World!" 
+0

Anche se 'echo (1)' _non usa affatto la libreria standard C, sono abbastanza sicuro che ci sia una lingua "C" implicita qui (o almeno una lingua compilata). –

+2

L'OP ha specificato i flag del compilatore gcc, il che indica che avevano in mente C in questo caso –

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

Scrive i driver del dispositivo dalla cima della sua testa usando solo cat ... – Don

+0

potresti fornire una spiegazione del codice "assembly for dummies"? – Amro

+0

@Amro: sicuro, ho incollato una versione commentata a: http://pastie.org/688375 – DigitalRoss