B.G*_*ill 10 c methods assembly
很长一段时间,我正在思考和研究汇编形式的C语言编译器的输出,以及CPU架构.我知道这对你来说可能很愚蠢,但在我看来,事情是非常无效的.如果我错了,请不要生气,并且有一些原因我没有看到所有这些原则.如果你告诉我为什么这样设计,我会很高兴的.我实际上真的相信我错了,我知道让人们聚在一起的人的天才头脑知道这样做的理由.究竟是什么,你问?我马上告诉你,我用C作为例子:
1:堆栈本地范围内存分配:
因此,典型的本地内存分配使用堆栈.只需将esp复制到ebp,然后通过ebp分配所有内存.好的,如果您明确需要默认堆栈RAM,我会理解这一点,但如果我理解它正确,现代操作系统会使用分页作为应用程序和物理RAM之间的转换层,当您需要的地址在到达实际RAM之前进一步转换字节.那么为什么不说0x00000000是int a,0x00000004是int b等等?并通过mov 0x00000000,#10访问它们?因为您实际上不会访问内存块0x00000000和0x00000004,而是您的操作系统将分页表设置为.实际上,由于ebp和esp的内存分配使用间接寻址,"my"方式会更快.
2:变量分配的两面性:
运行应用程序时,Loader将其代码加载到RAM中.当您创建变量或字符串时,编译器会生成代码,以便在main中创建时将这些值推送到顶部堆栈.所以有实际的指令,以及内存中的实际数字.因此,RAM中有2个相同值的条目.一种是指令形式,第二种是RAM中实际字节的形式.但为什么?为什么不在声明变量计数到哪个内存块时比使用时,只需插入这个内存位置?
因为C(和大多数其他语言)支持递归,所以函数可以调用自身,并且函数的每次调用都需要任何局部变量的单独副本.此外,在大多数当前的处理器上,您的方式实际上会更慢 - 间接寻址非常常见,以至于处理器都针对它进行了优化.
您似乎希望C(或至少C允许)的行为用于字符串文字.这有好有坏,例如即使您已经定义了"变量",也无法实际修改其内容(不会影响指向同一位置的其他变量).