Pregunta

¿Cómo llamar a "printf" directamente sin incluir stdio.h?

Encontré un tutorial interesante aquí:
http://www.halcode.com/archives/2008/05/11/hello-world-c-and-gnu-as/

Entonces, aquí está mi intento:

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

Estoy usando Mingw 4.4, y así es como lo compilo:

GCC -C Hello.C -O Hello.o
ld hello.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

Desafortunadamente, falla:

hola.o: hello.c :(. texto+0x26): referencia indefinida a `ss '

¿Cómo arreglar esto?

¿Fue útil?

Solución

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);
    */
}

Otros consejos

Puede copiar la declaración de printf en tu programa. En C, incluido otro archivo hay una mera copia, pasando su texto en su programa. Para que pueda hacer este trabajo haciendo la copia por su cuenta.

extern int printf (const char* format, ...);

int main()
{
  printf("Hello, world!\n");
  return 0;
}

Linker seguramente encontrará la definición adecuada en las bibliotecas, contra las cuales el programa está vinculado de forma predeterminada.

int main() {

    char ss[] = "hello";
    char *p = ss;

    asm (
        "movl %0, (%%esp);"
        "call _printf;" : "=r" (p)
    );

    return 0;
}

Su muy facilidad Escribe un programa C con la instrucción printf y luego guarda el programa con la extensión .c y ejecuta el programa que funcionará ... incluso puede contener funciones como clrscr (), getch () que forman parte de conio.h

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top