a.定義_start標籤做爲程序執行的起點
b.經過int 0x80使用內核服務(執行系統調用)linux
global _start ;標籤 程序入口處 [section .data] vstr db "D.T.Software",0x0A [section .text] _start: ;app entry mov edx,13 mov ecx,vstr ;"D.T.Software\n" mov ebx,1 mov eax,4 ;sys_write int 0x80 mov ebx,0 mov eax,1 ;sys_exit int 0x80
交互關鍵字
1.global-從彙編語言中導出符號(變量或函數)
2.extern-使用外部文件中定義的符號(變量或函數)編程
示例分析
實驗運行結果-在linux下編程
混合編程注意事項
1.相同的目標文件格式--elf格式
2.相同的函數調用約定--cdecl調用約定
3.相同的活動記錄(棧幀)結構-ebp基準app
代碼-新建entry.asm、main.c、test.c
代碼分別爲ide
;entry.asm global _start global vstr global vlen global print extern c_func [section .data] vstr db "D.T.Software", 0x0A vlen dd $ - vstr [section .text] _start: mov ebp, 0 call c_func call exit print: push ebp mov ebp, esp mov edx, [ebp + 12] mov ecx, [ebp + 8] mov ebx, 1 mov eax, 4 int 0x80 pop ebp ret exit: mov ebx, 0 mov eax, 1 int 0x80 main.c extern void print(char*, int len); extern char vstr[]; extern int vlen; int c_func() { char* delphi = "Delphi\n"; print(vstr, vlen); return 0; } test.c extern void print(char*, int len); extern char vstr[]; extern int vlen; int c_func() { char* delphi = "Delphi\n"; print(vstr, vlen); return 0; }
運行結果-c語言與彙編
在這裏須要使用gcc將其編譯成目標文件,最後進行連接函數
C語言與彙編語言在知足如下條件時能夠混合編程
1.遵循相同的函數調用約定
2.遵循相同的目標文件格式操作系統