2012-01-14 10 views
2

アセンブリから少なくとも1つのC関数を呼び出したい。それは私が自分の小さなOSを最初から何もしていないからです。なぜ私のブートローダからc関数を呼びたいのですか?私はアセンブリを理解することができますが、自分のプログラムを書くことに貧弱です。ですから、もし私がアセンブリ手順からc手順に制御を移すことができれば、私の仕事はより簡単になります。アセンブリルーチンからC関数を呼び出し、nasmとgccを使用してCとアセンブリファイルをリンクする方法

どのようにしてへのリンクアセンブリpgmとCプログラムファイルを1つにリンクします。ファイルサイズが512バイトを超えていても問題ありません。 Windowsのmingwの助けを借りて実行しています。私のCコンパイラはgccであり、アセンブラはnasmです。

+4

チェック[このチュートリアル](HTTP: //wiki.osdev.org/Bare_Bones)、 'call kmain'を参照してください。アセンブラで正しいC呼び出し規約を実装する必要があります。 –

答えて

1

が簡単にあなたに例を示すように、私は場所がわからしばらく前に、インターネット上でこれを発見し、自分のコンピュータ上のソースとしてそれを保存し、ではないが

; 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 
から
+0

http://www.csee.umbc.edu/portal/help/nasm/sample.shtml#printf1 ここで私はそれを見つけました。 –

関連する問題