能力值:
( LV3,RANK:20 )
|
-
-
2 楼
貌似要火,顶贴,同问
|
能力值:
( LV9,RANK:210 )
|
-
-
3 楼
这个要涉及OS相关的吧。。。可以看下 程序员的自我修养 http://baike.baidu.com/view/3122513.htm
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
因为连接器和操作系统相关,不同的操作系统结构不同
目标代码,已经是机器码了,只要按照系统指定的格式组装即可,比如linux的elf,win的pe
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
关键是,如果有人并不知道如何组装,希望得到指导,无从了解相关知识。
我对这部分完全不知道,所以,对你说的并不理解也不认同。PE格式我略知一二,但如何就能组装?这个好像还是水晶一样的透明体,不知其中玄妙。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
我好好看看再说。谢谢。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
比如mscoff格式的obj,obj中也有重定位,要求导入的符号,导出的符号,和pe格式区别不大啊
不过里面麻烦的东西很多
真想学习这个的可以去看开源的编译器代码,比如GCC和LLVM,大部分编译器都是直接生成obj,再用ms的link连接的
还有一个非成品
http://alink.sourceforge.net/
|
能力值:
( LV2,RANK:150 )
|
-
-
8 楼
可以的,我做过!
C语言开发,在DOS编译我的编译器,然后我的编译器可以裸奔在硬件上,编译出来的可执行文件也可以裸奔,连DOS都不用。
词法分析,语法分析,转汇编,汇编
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
虽不晓,但觉吊~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
愿闻其详!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
我的问题焦点在于:如果是各种中间代码,都是程序能产生实现的,不过就是各种文件格式的数据读写而已。可纯二进制的机器代码,我自己怎么生成啊?那不成了我要自己写程序把目标代码变成二进制机器码!?我不知道怎么弄。而各种编译原理书籍也就弄到目标代码,那玩意儿也就是某种程度的伪代码而已,距离纯二进制机器码还差得远了。
我理解错了?
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
是不是这样的,我理解错了。
实际上操作系统如windows、dos、linux等其实是我们通常认为的程序的容器,也就是说运行在这些操作系统之上的任何程序,其实都不是真正的二进制机器码,而是某种操作系统来解释执行的中间代码。如果这样解释的话,那么如PE文件之流的不完全二进制机器码的可执行文件就可以解释了。
是这样吗?所以,我们现在所说的链接,其实就是链接成这种中间码而已。只有操作系统本身的底层才是二进制机器码!
对不?如果是这样的话,那么这个链接其实就没那么难如登天了。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
错,pe之类都是完全的x86的二进制指令执行的。而其中所有的代码,有些功能不需要你自己去编写,操作系统都已经写好了,你只要call xxxx 然后操作系统执行功能然后返回,你继续执行你自己的代码。如果你不嫌麻烦,你可以完全不调用操作系统的api,所有代码全部自己编写。当然,理想状态是那样,现实情况不是那样,现实是很多功能是操作系统封装好了,而且由操作系统统一指挥调度,就象交通警察,你能使用的所有机器上面的硬件资源被操作系统限制了,只能通过调用系统api来实现。在dos时代,你就可以完全不使用dos调用,每一个io端口都自己编程序,而保护模式下,硬件特权级别限制了ring3不能执行io端口指令。
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
你说的中间代码,是有一些高级语言采用,比如java,c#等等。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
你用UltraEdit随便打开一个windows下的exe看看,PE格式并不是你说的那么纯粹的。也许是我学艺不精,但就我这眼下的粗浅层度来说是不认同阁下说法的。
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
链接程序ms已经写好了link.exe,你非要自己写一个链接程序,仔细看一遍pe格式细节,完全按照要求进行输出exe就可以了。如果你愿意,可以自己生成自己的中间文件,不按obj的要求也可以,如果要生成目标文件obj,就需要查看obj的文档,了解obj格式。
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
OBJ文件也是中间代码构成的文件。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
PE文件不是从第一个字节到最后一个字节每个都是x86指令,pe文件是有格式的,你查看它的详细格式吧,我一句话也讲不清楚,PE分很多段,只有代码段才是x86指令。
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
你牛逼,我对这些文件并不是多精通。否则也不会问了。
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
obj不是中间代码,是完完全全的x86二进制代码和一些数据结构的组合,pe也是可执行代码外加一些帮助整个程序顺利执行的数据结构,你需要具体去了解pe可执行文件的结构。
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
所以,我说PE文件也是中间代码,用来被操作系统容器解析执行的。
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
如果OBJ是最终机器码,那还链接干啥?直接用得了?所以我不认同你的说法。
不过我不想争了。反正我学艺不精,自己去看几位提到的书了。等若干时间之后再说吧。
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
首先你要搞清楚,一般说中间代码都是指这样的代码不能被CPU直接执行,需要再次进行处理
在x86 windows平台上,obj里面已经是x86机器码,也就是最终代码
而obj和pe的区别就在于一个pe文件可能是由多个obj链接而成,这样obj就需要额外的数据来将函数和变量在链接时进行对接,pe文件自然就不需要这些东西.但是pe文件又是由os载入,它也需要一些额外的数据来通知os这个文件的属性(比如subsystem),这些也是obj中不存在的,因为obj与具体平台无关,只是一个机器码的载体
举个栗子
麦当劳的薯条是装在一个大塑料袋里,塑料袋上面有保质期重量这些麦当劳需要知道的信息
麦当劳卖你薯条是装在一个小纸盒里,纸盒上面有营养成分这些你需要知道的信息
但是薯条无论在塑料袋还是在纸盒里都是薯条
好好理解编译器和coff&pe结构吧
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
编译生成何种代码由你来决定,而现在的PE文件也不只包含纯粹的机器指令了,比如.net模块也是pe格式,但程序代码是IL,需要由.net核心解释成x86机器指令
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
不是有两本编译原理
这两个书,一本被称为龙书,和虎书。
原来是3大经典,没想到还有一本鲸书。
不是说看完虎书就可以实现一个简单的编译器?
反正我还没看完,还得翻译还得看。。
|
|
|