因此,当我们引用“堆栈顶部”时,请记住它位于堆栈内存的底部。
我正在阅读有关x86 ASM的教程,它有这个。我真的甚至无法理解这是如何产生任何感觉的。我认为它与某些硬件级别的东西有关,而且到目前为止我对硬件一无所知。
有人可以解释一下吗?一个图表非常有帮助,但也许只是解释为什么“堆栈的顶部”意味着“堆栈的底部”
答案 0 :(得分:1)
我绝对不会选择x86作为你的第一个汇编语言......但是它们几乎都有堆栈。
想想一堆钞票卡,每个钞票卡上只能写一个钞票。说一个购物清单,一个说鸡蛋,另一个牛奶另一个面包。所以你可以去看看最上面的一个吧,我需要面包,拿面包丢弃卡片。下一个牛奶,对吧,去吧,丢弃卡,等等。哦,我需要黄油,把它写在一张新卡上,把它放在上面,然后去拿它,把它取下来,丢弃它。等等。
如果说你有20张牌,如果顶牌被编号为0,下面的那张牌是1,那么下面的那张牌是2,或者如果顶牌是19,那么下面的那张牌是18,这就重要了那么17?不,只要每个关心编号规则的人都遵循规则,那么它就不重要了。
为什么我们要关心卡的编号?因为该数字是用于该项目的内存地址。如果从0到N编号,你的堆栈就会在内存中成长为最老的0和N.或者你的堆栈可能从最顶层开始,最旧的东西是堆栈中的最高地址和最新的东西在N.只要每个人都知道规则,这是任意的。
我们关心的另一个原因是一些处理器/很多,有一种方法可以跳过,我想偷看第三张卡但是当偷看我无法删除它时我只能从堆栈的顶部删除或添加。你可以做的也是取代第三张牌。为什么我们会这样做呢?想想C函数中的局部变量,也许我的函数中有两个局部变量。 C是递归的,所以每次调用函数时都需要存储两个以上的int。堆栈非常适合。一旦我进入该功能,我就会在堆栈中添加两张空白卡片,同时运行该功能,如果我需要访问这些功能,请阅读或写入它们我可以查看或更换带有一些新值的卡片。当我退出该功能时,我将两张卡都移走并丢弃它们,当我到达那里时,它就像我找到的那样离开堆栈。在功能期间堆栈是临时存储,但在某种程度上我不在乎地址是什么我只关心顶部的两张卡是我的,我可以得到它们两个堆叠可能是1000卡高或8745卡高不重要我只关心前两个,我下面的所有卡都属于称为函数的函数。每个退出的功能都会清除属于它的卡片。
堆栈只是内存,并指向一个称为堆栈指针的指针寄存器。这使得我们不关心具体地址是什么,我们只关心它们相对于堆栈指针的含义。我们必须知道并遵循该处理器或环境的处理器或约定的规则,以了解哪种方式来执行偏移,如果堆栈向下增长意味着sp = sp - 3(位置)向堆栈添加三个空白卡,并且sp + 0是顶部sp + 1是堆栈中的下一个,依此类推。如果堆栈在地址空间中长大(不是那么常见,但有一些可以做或者做),那么sp = sp + 3(位置)是你向堆栈中添加3个新东西的方式,而sp-1是第一个下来,等等。
这不是计算的黑暗时代,我建议更好地学习C或者某些编程语言可以用任何语言编写程序,能够将问题分解为步骤并实现步骤以完成任务。然后,asm只是将这些步骤分解为更小的步骤并按顺序实现。我再次推荐几乎所有东西,除了x86作为第一个指令集,我建议使用指令集模拟器(模拟器或模拟器)而不是真正的硬件用于你的第一个汇编语言,一旦你开始掌握它,特别是调试你的asm,你会完全理解,尤其是如果你从一个更简单的指令集开始,然后再看看x86。 msp430,arm,pdp11(是的,我很认真),avr和其他几个都是很好的第一个指令集。但是在深入asm之前,要获得一定程度的C或类似经验。