C语言与汇编语言相互调用原理以及实例

下面两个分别是1个foo.asm(汇编语言文件),bar.c(c语言文件)
首先来了解C语言为何能调用汇编语言,和汇编语言为何能调用C语言。其实不论是C语言还是汇编语言想要履行都是终究编译链接成为2进制文件。
注意是编译链接这个两个步骤,编译产生的其实不是可履行的2进制文件,链接以后才是可履行的2进制文件。
这里1定要明确编译和链接是两个步骤,生成的文件格式也是不1样的。
编译生成的文件是1定格式的,里面包括函数符号表、参数表…等信息,这些信息主要是提供给链接阶段使用,函数调用是怎样调用的?是否是指定利用的函数的符号?所以链接阶段就是将函数调用的符号变成相对地址(要特别注意这个阶段,由于这个进程使得C语言和汇编语言相互调用成为可能)
gcc -m32 -c -o bar.o bar.c  生成了bar.o(是中间文件,不是可履行文件,带有符号表,参数表等)
nasm -f elf -o foo.o foo.asm 生成foo.o(是中间文件,不是可履行文件,带有符号表,参数表等
既然都生成了相同格式的.o中间文件,那末ld链接器便可将两个中间文件链接成为2进制可履行文件了,ld主要做的工作是将bar.o foo.o中的相互援用的函数符号变成在2进制文件foobar中相对地址(相对地址在2进制文件装入内存运行的时候会被全部转换为绝对地址)
ld -m elf_i386 -s -o foobar foo.o bar.o (链接成为2进制可履行文件了)
进程如图所示:

foo.asm
extern choose;
[section .data]
num1st dq 3
num2nd dq 4
[section .text]
global main
global myprint
main:
push qword [num2nd]
push qword [num1st]
call choose
add esp,8
mov ebx,0
mov eax,1
int 0x80
; pop qword [num1st]
; pop qword [num2nd]
myprint:
mov edx,[esp+8]
mov ecx,[esp+4]
mov ebx,1
mov eax,4
int 0x80
; pop qword [num1st]
; pop qword [num2nd]
ret
bar.c

void myprint(char * msg ,int len);
int choose(int a,int b) 
{ 
  if (a>=b){
    myprint("the 1st one
",13);}
  else {
    myprint("the 2nd one
",13);}
  return 0;
}

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » C语言与汇编语言相互调用原理以及实例

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡