comment appeler les fonctions C à partir de routines d’assemblage et lier les fichiers C et d’assemblage à l’aide de nasm et de gcc

Je souhaite appeler au moins 1 fonction C de l’assemblage. C’est parce que je crée mon propre petit système d’exploitation (à partir de rien). La raison pour laquelle je veux appeler la fonction c à partir de mon chargeur de démarrage. Je peux comprendre le assembly, mais je ne parviens pas à écrire mon propre programme. Donc, si je pouvais transférer le contrôle de la procédure d’assemblage à la procédure c, mon travail est facilité.

Alors, comment lier l’assemblage des fichiers de programme C et C en un seul. Cela me convient même si la taille du fichier dépasse 512 octets. Je le fais sur Windows 7 avec l’aide de mingw . mon compilateur c est gcc et assembler est nasm .

plus facile de vous montrer un exemple, j’ai trouvé cela sur Internet il ya un moment et je l’ai sauvegardé comme source sur mon ordinateur, je ne sais pas d’où vient-il?

 ; printf1.asm print an integer from storage and from a register ; Assemble: nasm -f elf -l printf.lst printf1.asm ; Link: gcc -o printf1 printf1.o ; Run: printf1 ; Output: a=5, eax=7 ; Equivalent C code ; /* printf1.c print an int and an expression */ ; #include ; int main() ; { ; int a=5; ; printf("a=%d, eax=%d\n", a, a+2); ; return 0; ; } ; Declare some external functions ; extern printf ; the C function, to be called SECTION .data ; Data section, initialized variables a: dd 5 ; int a=5; fmt: db "a=%d, eax=%d", 10, 0 ; The printf format, "\n",'0' SECTION .text ; Code section. global main ; the standard gcc entry point main: ; the program label for the entry point push ebp ; set up stack frame mov ebp,esp mov eax, [a] ; put a from store into register add eax, 2 ; a+2 push eax ; value of a+2 push dword [a] ; value of variable a push dword fmt ; address of ctrl ssortingng call printf ; Call C function add esp, 12 ; pop stack 3 push times 4 bytes mov esp, ebp ; takedown stack frame pop ebp ; same as "leave" op mov eax,0 ; normal, no error, return value ret ; return