标签:elf ima 图片 app pop 汇编 lin 通过 程序
操作系统-C语言与汇编混合编程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.遵循相同的目标文件格式
标签:elf ima 图片 app pop 汇编 lin 通过 程序
原文地址:https://blog.51cto.com/13475106/2541479