在汇编中,关于内存、代码、数据、段等有很大的理论辩论。
直言不讳是没有意义的。
什么是代码、文本、数据等?
我读过教程,他们只关注应用程序,而不是 100% 书面文字下的代码在做什么。
我不能成为汇编程序员,这还不清楚;有没有教程能更好地阐明这一点?
在汇编中,关于内存、代码、数据、段等有很大的理论辩论。
直言不讳是没有意义的。
什么是代码、文本、数据等?
我读过教程,他们只关注应用程序,而不是 100% 书面文字下的代码在做什么。
我不能成为汇编程序员,这还不清楚;有没有教程能更好地阐明这一点?
好的,所以其中一些内容有点主观,因为它可能因系统和工具链而异,但:
代码和文本通常是同义词,意思是“此部分/段包含可执行代码”
数据通常表示“此部分/段包含不可执行的数据”
如果您的硬件支持它,数据部分被加载到的内存页面可能会被标记为“不可执行”,这样如果您的程序试图跳入该区域,它将立即崩溃而不是做一些疯狂的事情。
同样,代码/文本部分可能会将其页面标记为“只读”,这样它们就不会被程序意外修改。一些系统也有“只读数据”部分,它们放置字符串文字和常量变量等。
最极端的例子可能是哈佛架构,其中代码和数据存储器不是同一个物理设备。
There really are no distinctions between code and data at the lowest levels. In the end all code is data, just ask a compiler, and any data can be executed. Operating systems apply rules to how various blocks of memory can be accessed. That's where the distinction starts. As you go higher in language and system levels the distinctions get more complex, you get heaps and stacks and paged memory and virtual memory and virtual machines. It all gets very complex, but at its root it is a Von Neumann machine, even if it looks like a cool gadget from Apple.
And yes, I used to be an Assembler programmer.
我没有听过也没有见过关于这些术语的“伟大的理论辩论”,除非是在不理解和猜测的人之间。
位只是位,随着您的级别越来越低,它们的长期意义越来越少。在高级语言中,您的变量可能被非常清楚地定义为某种“类型”,并且该变量在该程序或范围内的该变量的生命周期内始终是该类型。但是当你更接近逻辑时,这些位就变成了位或信号,并失去了它们的类型。类型开始变得毫无意义并且无关紧要。如果您正在“计算地址”到您正在使用数据位执行的某事,那么它们直到它们降落在地址总线上的短暂时刻才会成为地址,只有它们是地址,其余时间它们只是位在周围。
当处理器从某处“获取”“指令”时,为了最终执行它而获取指令的行为,使这些位代码。但是,如果您将构成指令的所有这些位分解为更小的部分,则其中一些位可能是立即值,这些位可能是正在加载到寄存器中的数据或地址或正在使用的地址的一部分访问一些数据。所以其中一些“代码”只是与代码紧密捆绑在一起的纯数据。因此,从一个角度来看,位可能仅在它们被提取并注定要作为指令执行的短暂时刻被称为代码。在内存、缓存或磁盘中放置时,它们大部分时间只是数据。
当该代码从硬盘读取、写入内存时,远在操作系统尝试执行该代码之前很久,它只是数据位,在较低级别无法与 jpeg 图像或 mpeg 视频区分开来或从硬盘读取并移入内存的任何位。
当一条指令正在读取或写入内存而不是作为要执行的指令(就当时的操作而言)时,那只是数据,是这些位的通用术语。它们始终是数据,如果它们实际上或可能注定要直接或间接地作为指令执行,则它们具有代码的双重定义。
至于出于任何原因的文本与数据文本(其他人已在 stackoverflow 的其他地方更详细地解释过),文本基本上是程序的代码部分,代码的另一个词,指令部分。数据只是数据,不是指令的部分,也不会是指令。至少在这种情况下。
无论出于何种历史或实际原因,您的程序通常包含一定百分比的指令位,并且某些百分比可能被视为数据,例如保存变量的内存,或者您可能在代码中嵌入了图像,或者一个未初始化的内存数组,当你的程序运行时,它会从你的程序运行的某个地方加载一些数据。编译器术语倾向于将术语文本用于代码部分,将数据用于其他部分(如果有的话)。
在许多情况下,无论目的或目的地如何,将所有位称为“数据”并不是不正确的。
什么是内存,它是存储位的东西。那个有很多切线,但基本上它存储你的位,短期或长期或两者兼而有之。
段是这个词所暗示的东西被分解成段。许多人首先认为 x86 及其历史是一种分段架构,人们通常过于复杂化,这意味着就该架构而言,地址是使用多个寄存器或实体计算的。没有意识到通常所谓的平面内存架构一直都在使用分段。通常您的视频内存一次只能访问一个段。通常你的硬盘一次只能访问一个段,你有一个小孔径可以查看并寻址,其余的地址在其他地方管理,这两个地址在你的程序之外的某个点,一起访问你想访问的东西。访问段的边界和规则因硬件而异,有时因软件而异。
你的问题很模糊,你想做什么,你挂断了什么,你用什么资源试图自己回答这个问题。如果您正在尝试学习汇编语言并且只看过一本书,那本书可能很烂,该语言可能很烂,或者两者兼而有之,而您只是在浪费时间,请找另一本书或另一种汇编语言。有大量不同的书籍教授任何特定的编程语言,例如 C,这并不意味着这些书籍中的每一本书都非常好并且适用于每个人。特别提出你的问题,我在这本“blah”书中读到“blah”,我不明白这个词是什么意思。它是如何应用的。
也许这里有一些历史背景。目前流行的架构是 冯纽曼类型,代码和数据在同一个内存中共享。并非所有架构都是这样的——一些隔离代码和数据。