5702|10

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

编译器是如何翻译函数,函数调用的? 从汇编语言角度去解释 ? [复制链接]

编译器是如何翻译函数,函数调用的? 从汇编语言角度去解释 ?

最新回复

大家都说得很对, 函数是放在代码段中,各线程只是用了函数的处理流程而已,各线程每一次的函数调用都有自己的函数栈, 因此函数内的局部变量,形参是不会有同步问题的,对于全局变量则存在同步问题。 因此大家写代码的时候,要注意线程与全局变量可能会存在的同步问题。 “函数 就是一段功能二进制代码和函数入口地址 调用 就是把参数写到对应函数的栈空间 保存现场 跳转到函数入口地址 ” 这句话说得很对,说出了函数的本质。 希望大家都能理解函数是什么,为什么几乎大多数计算机语言都有函数的概念, 我想函数无法对一段可复用逻辑的封装吧,这样一个大程序分配一段一段的小逻辑, 这样也是乎合人的大脑思考问题,分解问题的习惯的。 好了,就说这么多,把分给大家了。   详情 回复 发表于 2009-8-31 10:32
点赞 关注

回复
举报

2

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
好像是把函数名称翻译成label
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
函数 就是一段功能二进制代码和函数入口地址
调用 就是把参数写到对应函数的栈空间 保存现场 跳转到函数入口地址
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
编译器的角度来说,编译过程就是把代码变成二进制码流(也可能是中间态 类似汇编 最后再转换),然后分配地址(build time),函数地址可以看做label,函数调用就是call label,跳转过去,然后linking,把代码段连接成一个东东,之后就ooxxxxx了
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
基本上就是楼上说的这个样子了,楼主用编译工具看看C语言编译后的汇编代码不就知道了?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 



那如果有两个线程要调用同一个函数,是不是会有同步的问题?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
两个线程去调用同一个函数,是不会有同步问题的

程序在内存里面,存在代码段和数据段的概念,函数入口只是代码段的概念,相关的需要操作的变量,是存在调用者的数据段(堆栈啥的,具体看声明)的,换句话说,两个线程同时去调用一个函数,其共用的只有这个函数的处理流程,而内部数据是相互独立的,所以不存在同步问题

但是有两种情况比较特殊:
1 两个线程隶属于同一个进程,因为进程是资源分配的最小单位,两个线程实质上共用资源,所以会存在同步问题
2 被调用函数存在全局变量,这个也会引发同步问题,这也就是所有的编码建议都提到减少全局变量使用的重要原因之一
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

8
 
引用 5 楼 wtjd 的回复:
那如果有两个线程要调用同一个函数,是不是会有同步的问题?


你说的同步指的是什么? 从汇编角度并没有这个问题。
单个CPU的话,同一时间是只能执行一条指令的。所谓多线程也只是操作系统利用时钟进行了一个任务调度而已。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
编译器的角度来说,编译过程就是把代码变成二进制码流(也可能是中间态 类似汇编 最后再转换),然后分配地址(build time),函数地址可以看做label,函数调用就是call label,跳转过去,然后linking,把代码段连接成一个东东,之后就ooxxxxx了
顶!
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

10
 
引用 7 楼 sherlock_lai 的回复:
引用 5 楼 wtjd 的回复:
那如果有两个线程要调用同一个函数,是不是会有同步的问题?


你说的同步指的是什么? 从汇编角度并没有这个问题。
单个CPU的话,同一时间是只能执行一条指令的。所谓多线程也只是操作系统利用时钟进行了一个任务调度而已。

同意
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
大家都说得很对,

函数是放在代码段中,各线程只是用了函数的处理流程而已,各线程每一次的函数调用都有自己的函数栈,
因此函数内的局部变量,形参是不会有同步问题的,对于全局变量则存在同步问题。
因此大家写代码的时候,要注意线程与全局变量可能会存在的同步问题。

“函数 就是一段功能二进制代码和函数入口地址
调用 就是把参数写到对应函数的栈空间 保存现场 跳转到函数入口地址 ”
这句话说得很对,说出了函数的本质。
希望大家都能理解函数是什么,为什么几乎大多数计算机语言都有函数的概念,
我想函数无法对一段可复用逻辑的封装吧,这样一个大程序分配一段一段的小逻辑,
这样也是乎合人的大脑思考问题,分解问题的习惯的。

好了,就说这么多,把分给大家了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表