c和汇编语言混合的限制符号含义表,操作系统-C语言与汇编混合编程

操作系统-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-使用外部文件中定义的符号(变量或函数)

示例分析

882ca1eb87fc53e096a485d037a61bf2.png

实验运行结果-在linux下编程

bf73e68a71573fbc70cb904010b550f0.png

混合编程注意事项

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将其编译成目标文件,最后进行链接

71aa6c7b32f1c48fd25492a0febe1fa3.png

小结

C语言与汇编语言在满足以下条件时可以混合编程

1.遵循相同的函数调用约定

2.遵循相同的目标文件格式

807ac902e3150fa809ffd433391e5437.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值