【发布时间】:2010-06-16 19:38:11
【问题描述】:
长期以来,我一直在思考和研究汇编形式的C语言编译器的输出,以及CPU架构。我知道这对您来说可能很愚蠢,但在我看来,有些东西非常无效。如果我错了,请不要生气,我看不到所有这些原则是有原因的。如果你告诉我为什么要这样设计,我会很高兴。我真的相信我错了,我知道将 PC 放在一起的人的天才头脑知道这样做的理由。究竟是什么,你问?我马上告诉你,我以 C 为例:
1:堆栈本地范围内存分配:
因此,典型的本地内存分配使用堆栈。只需将 esp 复制到 ebp,然后通过 ebp 分配所有内存。好的,如果您明确需要按默认堆栈值分配 RAM,我会理解这一点,但如果我理解正确,现代操作系统使用分页作为应用程序和物理 RAM 之间的转换层,当您想要的地址在到达实际 RAM 之前被进一步转换时字节。那么为什么不直接说 0x00000000 是 int a,0x00000004 是 int b 等等呢?并通过 mov 0x00000000,#10 访问它们?因为您实际上不会访问内存块 0x00000000 和 0x00000004,但是您的操作系统将分页表设置为。实际上,由于 ebp 和 esp 的内存分配使用间接寻址,“我的”方式会更快。
2:变量分配重复性:
当您运行应用程序时,Loader 会将其代码加载到 RAM 中。当您创建变量或字符串时,编译器会生成代码,这些代码会在 main 中创建时将这些值推送到堆栈顶部。所以有这样做的实际指令,以及内存中的实际数字。因此,RAM 中有 2 个相同值的条目。一种是指令形式,第二种是 RAM 中的实际字节形式。但为什么?为什么不只是在声明变量计数时将它放在哪个内存块上,而不是在使用时插入这个内存位置?
【问题讨论】:
-
为什么投反对票?对我来说,这似乎是一个真正的理论层面的问题。
-
谢谢,我也是这么写的。
-
@Darel:不是我的反对意见,但问题不是很好。 @b-gen-jack-o-nell,您可能可以用代码片段替换一些措辞并提高清晰度。
-
好的,没问题,我希望这个问题对其他人尽可能有用。
-
好吧,凯文已经帮我做了。感谢和抱歉这么多错误,但英语不是我的强项。