首页
社区
课程
招聘
[旧帖] 一段内存数据,电脑是如何知道其结构的? 0.00雪花
发表于: 2014-12-13 19:01 11902

[旧帖] 一段内存数据,电脑是如何知道其结构的? 0.00雪花

2014-12-13 19:01
11902

  这个是随便截的一个内存片段,电脑怎么知道其中有某个数据结构,比如里面18 15 62 05这个是个整数,而不是对象,结构或者浮点数之类的呢.
  再补充一下,免得误会了我的意思.比如这段程序是我自己写的,我已经知道18 15 62 05这个是个整数.但是电脑是如何知道的呢,而没有认成是地址,指针,对象之类的东西呢.
  下7层的回复我都看了,跟我的问题没啥关系,这个跟代码段或者数据段有毛关系么?已经确定这个是个整数了,只是单纯的想知道
18 15 62 05电脑从哪里知道这个就是个整数呢?毕竟单从字节来说 还是有可能是对象,结构或者指针之类的东西

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (44)
雪    币: 719
活跃值: (777)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
字节对齐。
2014-12-13 19:03
0
雪    币: 9
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
占位1111
2014-12-13 19:03
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
随便截的一个内存片段?电脑当然不知道其中有某个数据结构
甚至不知道他到底是数据还是可执行代码
2014-12-13 19:07
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
5
电脑不会知道这是啥玩意,能访问到这里的,肯定是你的代码啦.
比如你写个程序:
int dw1 = 0x11223344;

int main()
{
  return dw1;
}


假设.text在0x00401000,.data段在0x402000不被优化的话,汇编代码一般是:
mov eax, dword ptr [0x00402000]  //dw1的地址
retn

懂了?

电脑不会知道那是什么结构,要看它是怎么访问的.
2014-12-13 19:23
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这种问题是说不清楚的,本来就是很清楚的事情,不懂只能靠自己去开悟了,多调试程序,某一天就懂了!
2014-12-13 19:30
0
雪    币: 44
活跃值: (186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不明白LZ想干什么???有代码访问的就是数据不是电脑决定它是不是数据,而是代码决定它是不是数据,。。。
2014-12-13 19:30
0
雪    币: 31
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
這個問題記得在CPU工作原理裡有解答過,通俗的比喻,你直接告訴電腦“010100010”它不能理解,也不能執行,但如果你告訴它“010100010”代表某某某含義,這樣電腦才能理解。你的完整程序裡有指令去“告訴”CPU 18 15 62 05的含義。
2014-12-13 19:38
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
9
也对,我自作多情了0.0
2014-12-13 19:43
0
雪    币: 9
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
  某些人的回答我实在无语了,本来肯回答我的朋友就十分感谢了,可是某些半桶水连问题都没搞明白就在那里自作高手的样子实在是令人发笑.
    只有您领会我的意思了,在代码阶段我定义了INT a这种就是相当于您所说的告诉了CPU A就是个整数了.那么这个INT是如何实现的呢,在数据段只有数据本身如您所说的010100010,没有对这个数据的描述.那么肯定是有什么地方在告诉CPU,这个数据的含义.可是还是回到老问题了,是怎么实现的呢?
2014-12-13 20:33
0
雪    币: 102
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
这个有点像"自举"的问题了.
其实楼上说的都是对的...是您没理解好.
int a; 只是C语言中的写法.
甚至可以说纯粹的汇编中没有"变量a"这个概念.

本来我们当前架构的计算机就是不区分指令和数据的, 怎么知道这段数字是数据还是代码?
这要靠你的代码决定, 那这句代码又由谁决定? 答案是: 硬性规定的.
对于PE文件, 他的数据区和结构区都由PE文件头决定, 他的第一句代码的地址也能在文件头里找到.
对于操作系统, 系统默认就将 0x7c00开始的数据当成代码执行.
鸡生蛋的问题解决了.
2014-12-13 20:45
0
雪    币: 68
活跃值: (190)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
电脑只管计算 只认二进制吧 管你什么结构
2014-12-13 21:07
0
雪    币: 9
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
  您所说的这些我早都明白了.......还是借用这位朋友的回答,這個問題記得在CPU工作原理裡有解答過,通俗的比喻,你直接告訴電腦“010100010”它不能理解,也不能執行,但如果你告訴它“010100010”代表某某某含義,這樣電腦才能理解。你的完整程序裡有指令去“告訴”CPU 18 15 62 05的含義。
  可能是我没表述好吧,我要问的很简单,最后这一句"你的完整程序裡有指令去“告訴”CPU 18 15 62 05的含義".那么告诉CPU含义的语句大概在完整程序的哪个位置呢?感觉应该不是在PE结构内部的什么地方.也就是不在400000后面的区域内,而在前面的什么地方,也不是PE头的区域内,PE头里的内容只跟PE结构有关
2014-12-13 21:24
0
雪    币: 542
活跃值: (122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
是你编写的程序和编译器共同决定的
2014-12-13 21:35
0
雪    币: 38
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
待你上了大二学了单片机就知道了0v0
2014-12-13 21:36
0
雪    币: 9
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
int a这个语句实际上就是在栈中开辟了4个字节的区域来存储 4个字节的数据,可是单纯从这4个字节来看的话,4个字节可以代表的内容很多,就不扯什么代码数据之类的东西了.就是数据里面分类整数,对象 结构,指针这些都可以是4个字节的.我的问题根本就是和数据代码什么的没关系,跟结构什么的也没关系.......就是很单纯的凭什么程序就知道这4个字节是整数,而不是对象指针之类的东西呢.....
2014-12-13 21:41
0
雪    币: 0
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
其实电脑根本就不懂什么整数,对象,它只管取指令,翻译指令,执行指令。整数,对象之类是人的意志,是人的理解。LZ可以看看微机原理,其中有CPU是如何工作的。
2014-12-13 21:47
0
雪    币: 0
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
看汇编代码对这个4字节内存的操作啊,上下文代码一看应该就清楚了
2014-12-13 21:58
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
19
不是 “某某数据什么数据“,而是 ”把某某数据作为什么数据

--- 好好领悟吧!
2014-12-13 23:09
0
雪    币: 153
活跃值: (181)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
20
对CPU来说,内存中就是无数01它并不知道也不关心你用这些01来表示什么,如果能告诉CPU从哪里开始读取01读多少位,CPU便能够根据读取的01构成一个指令,指令的一个重要的性质就是字节编码具有唯一的解释。这个指令能唯一表示一组运算。

如果你要问,指令怎么执行那个唯一的运算。
组合电路组成了CPU的基本运算,可以实现位级别,字级别逻辑运算。你可以理解根据唯一的指令,CPU构成不同的组合电路。

具体可以参考一些CPU处理器设计和体系结构的资料。

参考《深入理解计算机系统》中的一段话
如果每条指令的首字节具有唯一的代码和功能组合,给定这个字节,我们就能决定所有其他附加字节的长度和含义,这个性质决定了处理器可以无二意性执行目标代码。即使代码镶嵌在程序的其他字节中,只要能从序列的第一个字节开始处理,我们仍然很容易确定指令序列。反过来说,如果不能确定一段代码的起始位置,我们就不能准确的确定怎么样将序列划分成单独的指令。(你从内存中随便取一段,当然没法划分成单独的指令了)
2014-12-19 22:48
0
雪    币: 293
活跃值: (287)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
其实嘛,是你没理解前面7楼的意思啦,不要总按照自己的想法一直想下去,这么多人都回答一个答案,你还是觉得他们没理解你的问题的话,我只能呵呵了。
2014-12-19 22:57
0
雪    币: 45
活跃值: (388)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
看了很多回答,都没理解你真正想问的是什么。我来回答你,你所谓的“电脑怎么知道”是指调试程序的时候吗?调试的时候,调试器通过调试数据文件(比如VC,则需要pdb文件)中的信息,来把这个内存地址与变量符号联系起来,进而知道其类型,从而能按相应的类型来显示信息给你。
至于运行的时候,没有任何人能阻止你把任何地址解释为任何数据类型!比如:
any_type a;
a = (any_type) pointer_to_any_addr;
2014-12-20 20:45
0
雪    币: 188
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
楼主想了解这个的话,可以去看一下微机原理方面的书,了解CPU是怎样操作内存,并识别代码和数据的,这个只是识别数据和代码。具体怎么识别数据是整数、浮点数还是其他类型,应该跟编译器有关吧,可以看一些编译原理方面的资料。
2014-12-20 21:11
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
凭什么程序就知道这4个字节是整数,而不是对象指针之类的东西呢

我來回答樓主的問題!

好比說你在代碼中聲名整数變量:
int a;

編譯器會在內存中保留一塊空間,這個空間的大小是由編譯器藉由代碼聲明變量的類型去決定的,而在32位編譯器中預設的整数空間占用4個字節(Bytes),把你的代碼編譯成機器指令是編譯器在做的事,而我們可以透過反匯編來把這些複雜的指令變成簡單易理解的代碼。

那麼凭什么程序就知道这4个字节是整数呢?這是由於你在代碼中聲明了他是整数變量,因此編譯器會檢查你的代碼是否有正確的根據變量的類型編寫代碼,因此如果你聲明了a是整数,卻在代碼中給a賦予浮點數:
a=1.1;

透過調試器反匯編查看該處的代碼會發現編譯器將代碼修改了!

File1.c.190: a = 1.1;
004016DB C745FC01000000   mov [ebp-$04],$00000001


所以說真正決定內存中數據要如何解釋他的類型,其實是你的代碼決定的!
你的代碼聲明他是整數型,那麼編譯器就會將他視為整數型來產生操作碼!
樓主聽我這樣解釋有比較理解了嗎?
2014-12-20 21:16
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
楼上说的很明白,然后你再回想一下强制类型转换。。。。
2014-12-22 12:54
0
游客
登录 | 注册 方可回帖
返回
//