有什么区别"代码"和"数据"如果所有代码都访问数据,并且所有数据都访问代码?

时间:2013-01-07 22:44:32

标签: assembly

在大会上,关于内存,代码,数据,段等的理论辩论很多。

直言不讳。

什么是代码,文本,数据等?

我已经阅读了教程,他们只专注于应用程序,而不是代码在100%的书面文字下所做的事情。

我不能成为大会程序员,这是不清楚的;做任何教程更好地澄清一下吗?

4 个答案:

答案 0 :(得分:7)

好的,所以这些东西中的一些有点主观,因为它可能因系统和工具链而异,但是:

  • 代码&文本通常是同义词,意思是“此部分/段包含可执行代码”

  • 数据通常表示“此部分/段包含非可执行数据”

如果您的硬件支持它,数据部分加载到的内存页面可能会被标记为“不可执行”,这样如果您的程序试图跳转到该区域,它将立即崩溃,而不是做一些疯狂的事情。 / p>

同样,代码/文本部分的页面可能标记为“只读”,因此程序不会意外修改它们。有些系统也有“只读数据”部分,它们放置字符串文字和常量变量,等等。

最极端的例子可能是Harvard architecture,其中代码和数据存储器不是同一物理设备。

答案 1 :(得分:4)

最低级别的代码和数据之间确实没有区别。最后,所有代码都是数据,只需询问编译器,任何数据都可以执行。操作系统应用规则来访问各种内存块。这就是区别开始的地方。随着语言和系统级别的提高,区别变得更加复杂,您可以获得堆栈和分页内存以及虚拟内存和虚拟机。这一切都变得非常复杂,但从根本上来说它是一台Von Neumann机器,即使它看起来像Apple的一个很酷的小工具。

是的,我曾经是一名汇编程序员。

答案 2 :(得分:0)

也许这里有一些历史背景。 目前流行的体系结构属于Von Nuemann类型,其中代码和数据在同一内存中共享。并非所有架构都是这样的 - 一些隔离代码和数据。

答案 3 :(得分:0)

我没有听过也没见过"伟大的理论辩论"在这些条款上,除非是在不理解和猜测的人之间。

比特只是比特,因为你越低,他们的长期意义越来越少。在高级语言中,您的变量可以非常明确地定义为某些"类型"并且该变量始终是该程序或范围中该变量生命周期的类型。但是当你接近逻辑时,这些位只会变成位或信号而失去它们的类型。类型开始没有意义,也没关系。如果你是"计算地址"对于你正在用数据位做的事情,他们不会成为一个地址,直到他们降落在地址总线上的短暂时刻,只有他们是一个地址,剩下的时间他们只是位置。

当处理器"取出" "指令"从某个地方获取指令以最终执行它的行为,使这些位代码。但是如果你把构成一条指令的所有那些位分解成更小的部分,那么这些位中的一些可能是立即值,可能是数据被加载到寄存器或地址或正在使用的地址的一小部分访问一些数据。所以其中一些"代码"只是与代码紧密捆绑在一起的简单数据。因此,从一个角度来看,位可能仅被称为代码,只是它们被提取并注定要作为指令执行的短暂时刻。在ram或缓存或磁盘上放置时,他们大部分时间只是数据。

当从硬盘读取代码时,写入内存,早在操作系统尝试执行该代码之前,它只是数据位,在较低级别无法与jpeg图像区分开来或mpeg视频或从硬盘读取并移入内存的任何位。

当一条指令正在读取或写入存储器而不是一条要执行的指令时(就那一刻而言该操作而言)那么这只是数据,这些位的通用术语。它们总是数据,如果它们实际上或者可能直接或间接地作为指令执行,它们具有代码的双重定义。

至于文本与数据文本无论出于何种原因(其他人在stackoverflow上已经有更详细的解释),文本基本上是程序的代码部分,代码的另一个词,指令部分。数据只是数据,不是指令的部分,不是指令。至少在那种情况下。

无论出于什么历史或实际原因都不重要,你的程序通常由一些百分比的指令组成,一些百分比可能被认为是数据,例如保存变量的内存,或者你可能嵌入了一个图像在代码中,或者一个未初始化的内存数组,当程序运行时,它将从程序运行的某个地方加载一些数据。编译器术语倾向于使用术语文本作为代码部分,而数据作为其他部分(如果有的话)。

在许多情况下,无论目的或目的地如何,所有比特都被称为"数据"。

什么是内存,它是存储位的东西。在那个上有很多切线,但基本上它存储你的位,短期或长期或两者。

细分就是这个词所暗示的细分为细分的东西。许多人首先认为x86及其作为分段架构的历史,人们常常过于复杂,只是意味着就该架构而言,使用多个寄存器或实体来计算地址。没有意识到通常所谓的平面存储器架构一直使用分段。通常,您的视频内存一次只能访问一个段。通常你的硬盘一次只能访问一个段,你有一个小的光圈,你可以查看和寻址其余地址在其他地方管理,这两个地址在你的程序之外的某个点,一起访问你想要访问的东西。访问该段的边界和规则因硬件和软件而异。如果这里的目标是你正在尝试学习汇编语言并且字段即将出现可能意味着x86,并且x86是你想要学习的最后一个汇编语言,那么有许多更好的第一汇编语言需要学习(拥有选择第一种汇编语言时硬件是最糟糕的借口,也许,就在50年前,你可以在那里做出有效的论证,绝对不是今天。

你的问题很模糊,你想做什么,你是什么,你曾经用什么资源试着自己回答这个问题。如果你正在尝试学习汇编语言而且只看了一本书,那本书可能很糟糕,而且这种语言可能很糟糕,或者两者兼而有之,你只是在浪费时间,找到另一本书或其他汇编语言。有很多不同的书可以教授任何特定的编程语言,例如C语言,并不意味着这些书中的每一本都非常好并且适合所有人。特别提出你的问题,我读了" blah"在这" blah"书,我不明白这个词的意思。它是如何应用的。或者也许从另一种方法中拿出这个,你最好不要问,因为它已被多次询问和回答了#34;我想学习xyz汇编语言,是否有一本好书"什么是最好的" (这里使用非常糟糕的词)书等等。