操做系統-C語言與彙編混合編程

操做系統-C語言與彙編混合編程

1.使用匯編語言編寫Linux可執行程序

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-使用外部文件中定義的符號(變量或函數)編程

示例分析
操做系統-C語言與彙編混合編程
實驗運行結果-在linux下編程
操做系統-C語言與彙編混合編程
混合編程注意事項
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語言與彙編混合編程函數

小結

C語言與彙編語言在知足如下條件時能夠混合編程
1.遵循相同的函數調用約定
2.遵循相同的目標文件格式
操做系統-C語言與彙編混合編程操作系統

相關文章
相關標籤/搜索