鱼C论坛

 找回密码
 立即注册
查看: 5316|回复: 10

exe文件加载到内存的地址是由什么决定的

[复制链接]
发表于 2013-10-18 04:42:11 | 显示全部楼层 |阅读模式
1鱼币
在学王爽的汇编语言的第四章,关于exe文件加载到内存,CS和IP的值是根据什么决定的?是随机的吗?还是exe文件中有什么东西能决定这两个寄存器的值?还有一个,就是伪指令,它是否会被编译器以某种形式编译到obj文件中??实在是困惑的不行了。。在网上搜索的答案都太学术了,根本看不懂,希望大神能够帮我

最佳答案

查看完整内容

程序的入口就是end之后的那个标号 伪指令是写给人看的,便于人们更容易写程序,但伪指令最后还是会被编译器处理为0和1 源代码经过编译链接后会加入MS-DOS头,变成exe文件,开始我还以为是个PE头,反编译后发现自己错了,是个MS-DOS头。操作系统从MS-DOS头中获取信息从而知道程序的入口从哪儿执行。 MS-DOS可执行文件分为两个部分:MS-DOS文件头和程序段。MS-DOS文件头分为两个部分:固定文件头和重定位信息。程序段对应程序的 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-18 04:42:12 | 显示全部楼层

程序的入口就是end之后的那个标号
伪指令是写给人看的,便于人们更容易写程序,但伪指令最后还是会被编译器处理为0和1
源代码经过编译链接后会加入MS-DOS头,变成exe文件,开始我还以为是个PE头,反编译后发现自己错了,是个MS-DOS头。操作系统从MS-DOS头中获取信息从而知道程序的入口从哪儿执行。
MS-DOS可执行文件分为两个部分:MS-DOS文件头和程序段。MS-DOS文件头分为两个部分:固定文件头和重定位信息。程序段对应程序的数据和代码部分。
EXE文件包含一个文件头和一个可重定位程序映象.文件头包含MS-DOS用于加载程序的信息,例如程序的大小和寄存器的初始值.文件头还指向一个重定位表,该表包含指向程序映象中可重定位段地址的指针链表.文件头的形式与EXEHEADER结构对应。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-18 10:03:00 | 显示全部楼层
1、随机的,程序犯不着去考虑这种分配加载空间的事儿,也无法合理考虑这事儿。
2、伪指令是给编译器看的,告诉编译器该如何去编译源代码。
个人观点,楼下纠正补充。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-18 11:38:01 | 显示全部楼层
是编译器根据伪指令指出的吧,
再往下学习会有详细的说明的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-18 12:57:24 | 显示全部楼层
我觉得exe文件是PE结构的,exe文件的结构在硬盘中和装载入内存是一样的
.asm后缀名的源代码经过编译、链接后有个程序入口地址,end start中的start就是程序入口,start这个伪指令经过编译后会变成实际地址
伪指令在编译的过程中会被转换,比如标号经过编译后都成为了实际地址
除非是在纯dos下编译、链接和运行的,不然都成32位寄存器,成了CS和EIP。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-18 14:51:12 | 显示全部楼层
福禄娃娃 发表于 2013-10-18 12:57
我觉得exe文件是PE结构的,exe文件的结构在硬盘中和装载入内存是一样的
.asm后缀名的源代码经过编译、链接 ...

谢谢!我明白点了。。但是为什么我搜百度百科上面说“伪指令它既不控制机器的操作也不被汇编成机器代码”,我一直就感觉伪指令是可以汇编成机器代码的,不然操作系统怎么能知道程序的入口在哪里?这是怎么回事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-18 14:52:07 | 显示全部楼层
随风听雨雪 发表于 2013-10-18 11:38
是编译器根据伪指令指出的吧,
再往下学习会有详细的说明的

谢谢!我继续往下学学看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-18 16:41:23 | 显示全部楼层
pl213311 发表于 2013-10-18 14:52
谢谢!我继续往下学学看看

不客气,共同进步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-18 17:33:35 | 显示全部楼层
福禄娃娃 发表于 2013-10-18 15:33
程序的入口就是end之后的那个标号
伪指令是写给人看的,便于人们更容易写程序,但伪指令最后还是会被编译 ...

有点深奥的说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-19 05:34:32 | 显示全部楼层
福禄娃娃 发表于 2013-10-18 12:57
我觉得exe文件是PE结构的,exe文件的结构在硬盘中和装载入内存是一样的
.asm后缀名的源代码经过编译、链接 ...

你看我的理解对不对。。有些伪指令也是会被编译成1和0的只不过存到了其他地方(你说的什么头文件之类的,我还没理解到那么深层次)。。而程序部分是不存在伪指令的,所以这就是百科上说的不能被汇编成机器代码,是这个意思吗??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-19 09:09:35 | 显示全部楼层
pl213311 发表于 2013-10-19 05:34
你看我的理解对不对。。有些伪指令也是会被编译成1和0的只不过存到了其他地方(你说的什么头文件之类的, ...

汇编指令只是对机器码的一种助记形式,和伪指令不同,,把0和1变成人类更容易理解的类似英语的格式,汇编指令基本上和每个操作码都有对应汇编指令。
伪指令用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。 将相对于程序或相对于寄存器的地址载入寄存器中。 与 ADR 指令相似。ADRL 所加载的地址比 ADR 所加载的地址更宽,因为它可生成两个数据处理指令。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 11:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表