Un semplice programma C senza #include
-
18-09-2019 - |
Domanda
Come chiamare "printf" direttamente senza includere stdio.h?
Ho trovato un interessante tutorial qui:
http: //www.halcode .com / archives / 2008/05/11 / ciao-mondo-c-e-gnu-as /
Quindi, ecco il mio tentativo:
int main(){
char ss[] = "hello";
asm (
"pushl %ebp ;"
"movl %esp, %ebp ;"
"subl $4, %esp ;"
"movl $ss, (%esp) ;"
"call _printf ;"
"movl $0, %eax ;"
"leave ;"
"ret ;"
);
return 0;
}
sto usando MinGW 4.4, ed ecco come compilo che:
gcc -c hello.c -o hello.o
ld ciao.o -o Hello.exe C: /mingw/lib/crt2.o C: /mingw/lib/gcc/mingw32/4.4.0/crtbegin.o C: /mingw/lib/gcc/mingw32/4.4.0/crtend.o -LC: /mingw/lib/gcc/mingw32/4.4.0 -LC: / MinGW / lib -lmingw32 -lgcc -lmsvcrt -lkernel32
Purtroppo, non riesce:
hello.o:. Ciao.c :( testo + 0x26): undefined reference to `ss'
Come risolvere questo problema?
Soluzione
int main(void)
{
char ss[] = "hello";
__asm(
"pushl %[ss]\n" // push args to stack
"call _puts\n"
"addl $4, %%esp\n" // remove args from stack
:: [ss] "r" (ss) // no output args, no clobbered registers
);
/* C equivalent:
extern int puts(const char *);
puts(ss);
*/
}
Altri suggerimenti
È possibile copiare la dichiarazione di printf
nel vostro programma. In C, compresi gli altri file è una mera copia-incollare il testo nel programma. Così si può fare questo lavoro per fare il copia-incolla da soli.
extern int printf (const char* format, ...);
int main()
{
printf("Hello, world!\n");
return 0;
}
Linker sarà sicuramente trovare la definizione corretta nelle biblioteche, contro il quale si programma è collegato per impostazione predefinita.
int main() {
char ss[] = "hello";
char *p = ss;
asm (
"movl %0, (%%esp);"
"call _printf;" : "=r" (p)
);
return 0;
}
La sua stessa facilità Scrivere un programma C utilizzando printf poi salvare il programma con estensione .c ed eseguire il programma Funzionerà.... Anche può contenere funzione come clrscr (), getch () che fanno parte del conio.h