2009-11-06 8 views
9

To było pytanie z wywiadu na miejscu i byłem zaskoczony.Witaj, nie używając bibliotek

Zostałem poproszony o napisanie programu Hello world dla systemu Linux .. To też bez korzystania z żadnych bibliotek w systemie. Myślę, że trzeba użyć wywołań systemowych czy coś .. Kod powinien uruchomić za pomocą -nostdlib i -nostartfiles opcja ..

Byłoby wspaniale, gdyby ktoś mógłby pomóc ..

+2

Jaki rodzaj pracy, pisanie jądra systemu operacyjnego? –

Odpowiedz

9

Wystarczy popatrzeć na example 4 (nie wygra nagrodę za przenośność):

#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: jak podkreślił Zan Lynx poniżej, pierwszy argument sys_write jest file descriptor. Tak więc ten kod wykonuje niezbyt często pisanie od "Hello, world!\n" do stdin (fd 0) zamiast stdout (fd 1).

+0

Myślę, że chcesz deskryptor pliku 1 w swoim syscall zapisu. –

+0

Hej, masz rację. Widzę, że prawie we wszystkich przykładach na tej połączonej stronie zapisuje na standardowe wyjście zamiast na standardowe wyjście. – Stephan202

0

Musisz bezpośrednio porozmawiać z systemem operacyjnym. Można write do pliku deskryptora 1, (stdout), wykonując:

#include <unistd.h> 

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

A skąd bierze się "zapis"? –

0

Co o skrypcie powłoki? Nie widziałem w pytaniu żadnego wymaganego języka programowania.

echo "Hello World!" 
+0

Nawet jeśli 'echo (1)' 'nie używa 'w ogóle biblioteki standardowej C, jestem prawie pewny, że istnieje tutaj niejawny język" C "(lub przynajmniej język skompilowany). –

+2

OP określone flagi kompilatora gcc, co prawie oznacza, że ​​mieli C myśli tutaj –

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

Zapisuje sterowniki urządzeń z górnej części głowy przy użyciu tylko kota ... – Don

+0

można podać wyjaśnienie kodu "montaż dla manekinów"? – Amro

+0

@Amro: na pewno wkleiłem wersję z komentarzem: http://pastie.org/688375 – DigitalRoss

Powiązane problemy