码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-10-13 17:25:33      阅读:29      评论:0      收藏:0      [点我收藏+]

标签:elf   ima   图片   app   pop   汇编   lin   通过   程序   

操作系统-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.遵循相同的目标文件格式
技术图片

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

标签:elf   ima   图片   app   pop   汇编   lin   通过   程序   

原文地址:https://blog.51cto.com/13475106/2541479

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!