免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: tianhailong
打印 上一主题 下一主题

结构体在编译中的作用 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-06-14 13:53 |只看该作者
再说明一点,C语言的机制和汇编的机制是完全不同的。汇编是基于计算机硬件的体系结构的,而C语言是基于自己的一套完备的高层体系结构。正是因此,C语言才具有良好的可移植性。

但是C语言程序和对应的汇编实现是多对多的关系,同一段C源码可以编译出不同的汇编实现,同一段汇编实现也可以(人工地)反向工程到不同的C语言实现。所以想用反汇编结果来说明C语言自身的问题是行不通的。他们只具有抽象语义上,宏观层面的等效性,任意取某一点上的具体语义并不一定等效。换句话说,通过反汇编,你可以看到程序的流程,但这是去除了C语言抽象概念后的结果,它并不能代表C语言源码本身。。

论坛徽章:
0
12 [报告]
发表于 2012-06-14 20:04 |只看该作者
谢谢指教,我就是想通过c编译成汇编语言,直观的感受一下程序到底是怎样在机器上执行的,
机器只能执行机器码,汇编语言和机器码是对应的,
那么是不是可以这样理解:
所有的语言,C、C++等等编译类的,都会编译成汇编指令,最终对应成机器指令
所有的解释型语言虽然不需要编译,但是也要都转成机器语言才可以执行对吧?回复 11# sonicling


   

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
13 [报告]
发表于 2012-06-14 20:24 |只看该作者
本帖最后由 yulihua49 于 2012-06-14 20:37 编辑
sonicling 发表于 2012-06-14 13:39
回复 9# tianhailong
而对于x86体系结构来说,它只能从名字上指代那几个xx指针专用寄存器,概念已经不一样了。“指针的指针”在x86体系结构里面是没有的概念。

请教:
X86有丰富的变址、比例变址、不是结构概念吗?而且MS宏汇编直接有结构的表述(好像叫记录),不是体系对结构的支持吗?
各种间接寻址指令,不是指针的指针的概念吗?
那几个指针寄存器只是执行的手段,结构是可以放在内存任何地方的,可以直接内存变址操作。当然寄存器变址是效率最高的,但是不能说结构只是几个寄存器的事。

虽然我前边把变址与结构操作等同起来不妥,但是变址操作仍然是操作结构最经常最有力的工具。

一般的,可以有如下对应(不是等同):
结构 --- 变址
数组 --- 比例变址
指针 --- 间接寻址

指针的指针,的N次方?那就多次间接寻址呗。

论坛徽章:
0
14 [报告]
发表于 2012-06-14 21:14 |只看该作者
回复 13# yulihua49


    你也说了,“。。。同起来不妥,。。。最有力的工具”。他们之间不存在必然的对应关系,只是用一个实现另外一个的方法之一。

MS宏汇编和一般意义上的汇编已经有区别了,通过添加宏和相关的预处理在某种程度上的高层概念。即便如此,宏预处理很难对概念进行检查,准确来说,汇编不支持类型检查,添加再多的宏也没用。如果你抽象出来了概念,却不能检查,那不是跟食用油标准一样,明知是地沟油,检查不出来,白搭。

论坛徽章:
0
15 [报告]
发表于 2012-06-14 21:23 |只看该作者
回复 12# tianhailong


    C/C++是原生语言,会被完全翻译为汇编。汇编里只有字节数分类的db dw dd dq...这种简单类型系统,还不提供检查。这与C/C++的类型系统完全不同。所以C/C++的所有声明的类型信息都会被抹去,而转换为汇编这种按字节数分类的简单系统。C/C++的类型翻译成汇编后,不光体现在数据的存储格局上,还体现在数据的操作上,不同C/C++类型的操作是不同的,比如有符号、无符号、和不同的步进。。。

论坛徽章:
0
16 [报告]
发表于 2012-06-15 13:14 |只看该作者
tianhailong 发表于 2012-06-14 20:04
谢谢指教,我就是想通过c编译成汇编语言,直观的感受一下程序到底是怎样在机器上执行的,
机器只能执行机器码,汇编语言和机器码是对应的,


如果你使用带有结构体声明的宏汇编,那么汇编语言和机器码就不是对应的,至少对常见的体系结构来说是这样的。

不信你试着解释一下汇编里面的一个结构体声明怎么翻译成机器码?

论坛徽章:
0
17 [报告]
发表于 2012-06-18 14:32 |只看该作者
听得不是很明白,还是谢谢指教,我没做过汇编简单的听也挺难理解的回复 15# sonicling


   

论坛徽章:
0
18 [报告]
发表于 2012-06-18 14:34 |只看该作者
我试试,谢谢指教,如果汇编里的结构体也不翻译成机器指令,那么汇编语言中需要结构体是什么用处呢?为了编程的方便吗,和C等高级语言中的结构体一样?回复 16# 变异老鼠


   

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
19 [报告]
发表于 2012-06-18 16:56 |只看该作者
本帖最后由 yulihua49 于 2012-06-18 16:59 编辑
tianhailong 发表于 2012-06-18 14:34
我试试,谢谢指教,如果汇编里的结构体也不翻译成机器指令,那么汇编语言中需要结构体是什么用处呢?为了编 ...

当然要翻译成机器指令,楼上只说了没有严格的检查,反正油是有了,可以炒菜,是不是地沟油,自己知道。
理论上楼上那位是对的。实际上几种东西的确是固定搭档,因为这样搭档性能最高。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
20 [报告]
发表于 2012-06-18 17:02 |只看该作者
本帖最后由 yulihua49 于 2012-06-18 17:17 编辑
变异老鼠 发表于 2012-06-15 13:14
如果你使用带有结构体声明的宏汇编,那么汇编语言和机器码就不是对应的,至少对常见的体系结构来说是这 ...

这话听着怎么这么别扭?宏当然是要转换为机器码,要么怎么执行啊,有什么意义?
经过宏汇编预处理后,宏被翻译成汇编指令,难道还有别的用法?
在有变址的CPU上,记录成员的访问通常是变址指令。
在这个具体问题上单纯的理论或哲学没什么意义,关键是实践,对机能的理解和对性能的估算。
这个坛子学究可真不少。

在这里说结构的操作采用变址机制,这话,你拿100%的绝对真理的标准,是错的。
但是实际上涵盖了99%以上的实际应用环境。所以不能说错。
有谁还在用Z80或8080CPU?在那里这话是错的;在现今的X86体系和大部分RISC体系都是不错的。


就像牛顿定律,在广义相对论的领域内是不对的,但在日常生活中是不错的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP