как вызвать функции C из процедур сборки и связать файлы C и сборки, используя nasm и gcc - PullRequest
2 голосов
/ 14 января 2012

Я хочу вызвать не менее 1 функции C из сборки.Это потому, что я делаю свою собственную крошечную ОС с нуля (из ничего).Причина, по которой я хочу вызвать функцию c из моего загрузчика.Я понимаю ассемблер, но плохо пишу свою собственную программу.Так что, если бы я мог перенести управление из процедуры сборки в процедуру c, моя работа стала бы проще.

Итак, как связать программные файлы pgm и C. сборки в один. Это нормально для меня, даже если размер файла превышает 512 байт.Я делаю это в Windows 7 с помощью mingw .мой компилятор c gcc и ассемблер nasm .

1 Ответ

1 голос
/ 08 сентября 2012

проще просто показать вам пример, я нашел это в Интернете некоторое время назад и сохранил как источник на своем компьютере, хотя не знаю, откуда

; 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 string
    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
...