Linux0.11カーネル--アセンブリコード実装C関数


Linux0.11カーネルには多くの関数がC言語で宣言され,アセンブリによって実現される.例えば/kernel/blk_drv/hd.c中関数で宣言
extern void hd_interrupt (void);
    C       ,    ,              。
               
test.c  
#include<stdio.h> extern void test1(void); extern void test2(void); extern void test3(void); int main(void) { printf("0x%x/n",test1); printf("0x%x/n",test2); printf("0x%x/n",test3); return 0; } 
shixain.s  
.text
.globl test1,test2,test3
test1:
pushl %eax
popl %eax
ret
test2:
pushl %eax
popl %eax
ret
test3:
pushl %eax
popl %eax
ret
もしそうならsコード、コンパイルtest.cエラーを する
test.c: In function ‘main’:
test.c:8: warning: format ‘%x’ expects type ‘unsigned int’, but argument 2 has type ‘void (*)(void)’
test.c:9: warning: format ‘%x’ expects type ‘unsigned int’, but argument 2 has type ‘void (*)(void)’
test.c:10: warning: format ‘%x’ expects type ‘unsigned int’, but argument 2 has type ‘void (*)(void)’
/tmp/ccqsI4JA.o: In function `main':
test.c:(.text+0x15): undefined reference to `test1'
test.c:(.text+0x29): undefined reference to `test2'
test.c:(.text+0x3d): undefined reference to `test3'
collect2: ld returned 1 exit status
しかしアセンブリ コードを する
コマンド:
as -gstabs -o shixian.o shixian.s
gcc -c -o test.o test.c
gcc -o result test.o shixian.o
コンパイル ファイルresultの
./result
:
0x8048440
0x8048443
0x8048446
:mingWの でGCCと のLinuxのバージョンの でGCC、アセンブリの の の の に_をプラスします( )、 のlinux GCCでは_は されません.