| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4816 人关注过本帖
标题:变量不管用
只看楼主 加入收藏
nooomoon
Rank: 1
等 级:新手上路
帖 子:13
专家分:5
注 册:2015-9-2
收藏
得分:0 
以下是引用wmf2014在2015-9-3 11:03:02的发言:

不是操作系统取此指令,是cpu取此指令。“mov ax,@data”是汇编码,意思是取变量data所在内存区域的段地址到ax寄存器中。汇编代码需要经过编译后成为机器码才能供cpu执行,至于data所在的段地址是多少,需要exe文件重定位后确定。exe文件头会在系统加载后从系统获取一个起始段地址,以这个段地址为基础,定位所有需要浮动的地址(包括跳转、栈等),com类型文件不需要此句。加入编译后的文件加载后数据段地址为1000H,则对应的机器码为"B8 00 10",其中B8为指令,“00 10”为该指令所需要的数据,cpu从内存中取得b8指令后,就会自动从指令后内存中再取两个字节数据,然后把这两个字节数据送到寄存器ax中,这条指令就执行完毕。大概如此了,如果你学过数字脉冲电路,你就比较好理解这个操作过程在电路上是如何操作的,无非是计数器、寄存器、译码器等电路按时序工作而已。

多谢指教 程序编成exe文件后 我用二进制编辑器查看文件 文件代码的第一条指令是b8 04 00
然后用debug把程序加载进内存
用d命令查看内存中的代码段
这条指令变成b8 60 07
CPU要执行的就是b8 60 07
0760就是数据段地址。
那个b8 04 00不知去哪里了 如果cpu执行这条 也是把0004这个放到ax里面 显然是操作系统没有把硬盘中二进制执行文件exe的代码段直接拷进内存 而是改变了第一条指令的操作数为分配的内存数据段地址 我估计有个exe文件头里面有个什么东西 让操作系统把数据段地址送到b8后面2个字节


[ 本帖最后由 nooomoon 于 2015-9-3 12:00 编辑 ]
2015-09-03 11:59
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 11楼 nooomoon
我在10楼说了,EXE类型文件属于浮动代码可执行文件,系统加载后需要重定位,该类型文件头记录了需要重定位的数据位置,你文件的数据位"b8 00 04",加载后“00 04”就重定位成“60 07”了,说明加载该文件时,系统给你的基础段地址为075c,重定位执行075c+0004的操作。COM类型文件不需要此类操作。

能编个毛线衣吗?
2015-09-03 12:16
nooomoon
Rank: 1
等 级:新手上路
帖 子:13
专家分:5
注 册:2015-9-2
收藏
得分:0 
以下是引用wmf2014在2015-9-3 12:16:52的发言:

我在10楼说了,EXE类型文件属于浮动代码可执行文件,系统加载后需要重定位,该类型文件头记录了需要重定位的数据位置,你文件的数据位"b8 00 04",加载后“00 04”就重定位成“60 07”了,说明加载该文件时,系统给你的基础段地址为075c,重定位执行075c+0004的操作。COM类型文件不需要此类操作。
多谢您指点。在下查了有关资料。和您10楼所言略有不同。exe文件在加载过程中需要重定位。操作系统先将头文件载入内存。根据头文件的记录给程序分配内存和基地址。把程序载入内存中。还要根据头文件,找到重定位表,根据重定位表找到需要重定位的条目。把载入内存的程序中需要重定位的条目按你说的方法计算后,替换原有的条目。然后设置SS,SP,ES,CS寄存器的值。然后IP指向程序的第一条指令。其中还有些过程略过。
这就是为什么内存中的程序和文件中的程序不同。程序重定位表中的条目,在载入内存中后会被修改。然后再执行。


[ 本帖最后由 nooomoon 于 2015-9-3 19:23 编辑 ]
2015-09-03 19:22
zhulei1978
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
收藏
得分:0 
以下是引用nooomoon在2015-9-3 09:53:20的发言:

此回复奇也怪哉。余所问者 代码事耳 尔所见者 符号事矣
余所用标点符号,乃中文古法。现代标点源自西夷。古文未有标点。有注释者。以朱笔圈点断句。以便阅读。
又因白话文故,之乎者也矣焉哉不用。以夷之感叹号、问号代之。故有此标点之法。以便阅读。
读之者,不以文害辞,不以辞害意。可知吾文之所指。当不以此标点为怪。吾未尝见有以吾标点为异者。
今尔以为怪。故告之来去始末。有不妥之处,望予以指正。为谢。


强啊,现在估计没人这么说话了

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-04-10 07:35
zhulei1978
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
收藏
得分:0 
以下是引用nooomoon在2015-9-3 19:22:20的发言:

多谢您指点。在下查了有关资料。和您10楼所言略有不同。exe文件在加载过程中需要重定位。操作系统先将头文件载入内存。根据头文件的记录给程序分配内存和基地址。把程序载入内存中。还要根据头文件,找到重定位表,根据重定位表找到需要重定位的条目。把载入内存的程序中需要重定位的条目按你说的方法计算后,替换原有的条目。然后设置SS,SP,ES,CS寄存器的值。然后IP指向程序的第一条指令。其中还有些过程略过。
这就是为什么内存中的程序和文件中的程序不同。程序重定位表中的条目,在载入内存中后会被修改。然后再执行。


[ 本帖最后由 nooomoon 于 2015-9-3 19:23 编辑 ]


文件中的程序是静态的,内存中的程序是动态的,是在运行的

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-04-10 07:49
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
贴子很旧了,但也想回一下

5楼的原程式没有错
若有Irvine32.inc,并INCLUDE进来
Irvine32.inc包括了许多32bit程式的细节/lib等设定
楼主这段代码,编译器会为它编译成32bit程式,只能在window下运行,
那时候cs,ds等段暂存器[不需要],直接mov eax,val1就拿到资料

但若没有Irvine32.inc
编译器只当它是普通的16bit Dos程式,ds段暂存器[必须]赋值,
否则无法取得ds段里val1的值
2016-06-11 21:32
快速回复:变量不管用
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045737 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved