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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top