2009-11-06 30 views
9

Esta fue una pregunta de entrevista en el sitio y estaba desconcertado.Hola mundo sin usar librerías

Me pidieron que escribiera un programa mundial Hello para Linux ... Eso también sin utilizar ninguna biblioteca en el sistema. Creo que tengo que usar llamadas al sistema o algo .. El código debe ejecutar utilizando -nostdlib y -nostartfiles opción ..

Sería muy bueno si alguien podría ayudar ..

+2

Qué tipo de trabajo, escribiendo los núcleos del sistema operativo? –

Respuesta

9

Tenga una mirada en example 4 (no va a ganar un premio para la portabilidad):

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

Editar: como ha señalado Zan Lynx a continuación, el primer argumento de sys_write es la file descriptor. Por lo tanto, este código no es común al escribir "Hello, world!\n" en stdin (fd 0) en lugar de stdout (fd 1).

+0

Creo que quiere el descriptor de archivo 1 en su syscall de escritura. –

+0

Oye, tienes razón. Veo que en casi todos los ejemplos en esa página vinculada escribe a stdin en lugar de stdout. – Stephan202

0

Tendría que hablar directamente con el sistema operativo. Se podría write el descriptor de archivo 1, (stdout), haciendo:

#include <unistd.h> 

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

¿Y de dónde crees que viene la "escritura"? –

0

¿Qué pasa con un script de shell? No vi ningún requisito de lenguaje de programación en la pregunta.

echo "Hello World!" 
+0

Incluso si 'echo (1)' _doesn't_ no utiliza la biblioteca estándar C en absoluto, estoy bastante seguro de que aquí hay un lenguaje "C" implícito (o al menos un lenguaje compilado). –

+2

El OP especificó los indicadores del compilador gcc, lo que indica que tenían en cuenta C aquí –

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

Escribe controladores de dispositivos de la parte superior de su cabeza usando solo ... – Don

+0

¿podría dar una explicación del código "ensamblar para tontos"? – Amro

+0

@Amro: claro, pegué una versión comentada a: http://pastie.org/688375 – DigitalRoss

Cuestiones relacionadas