操作系统-C语言与汇编混合编程

1.使用汇编语言编写Linux可执行程序

a.定义_start标签作为程序执行的起点 b.通过int 0x80使用内核服务(执行系统调用)

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基准

实验

代码-新建entry.asm、main.c、test.c 代码分别为

;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.遵循相同的目标文件格式