我是汇编编程的新手,我正在使用使用内存堆栈的 push 和 pop 指令。 那么,堆栈默认大小是多少,如何修改它以及它的大小限制是多少?
最佳答案
筹码量取决于很多因素。 这取决于你从哪里开始堆栈,你有多少内存,你使用的是什么 CPU 等等。 您使用的 CPU 不称为“Windows CPU”。 如果您要指定正在使用的 CPU,请详细指定该 CPU 的名称,而且非常重要的是,还要指定 CPU 的体系结构。在这种情况下,您可能使用的是 x86 架构。
这是 x86 架构的内存映射:
All addresses Before 0X100000 - Free<br/>
0x100000 - 0xc0000 - BIOS<br/>
0xc0000 - 0xa0000 - Video Memory<br/>
0xa0000 - 0x9fc00 - Extended BIOS data area<br/>
0x9fC00 - 0x7e00 - Free<br/>
0x7e00 - 0x7c00 - Boot loader<br/>
0x7c00 - 0x500 - Free<br/>
0x500 - 0x400 - BIOS data area<br/>
0x400 - 0x00 - Interupt vector table<br/>
在 x86 中,堆栈信息由两个寄存器保存:
Base pointer (bp): Holds starting address of the stack
Stack pointer (sp): Holds the address in which next value will be stored
这些寄存器在不同的模式下有不同的名字:
`Base pointer Stack pointer`
16 bit real mode: bp sp
32 bit protected mode: ebp esp
64 bit mode: rbp rsp
当你建立一个栈时,栈指针和基指针得到相同的地址。
堆栈设置在基址指针寄存器指定的地址中。
您可以在空闲的内存中的任何位置设置您的堆栈,并且堆栈向下增长。
每次将某些东西“推”到堆栈上时,该值将存储在堆栈指针指定的地址中(与开始时的基指针相同),并且堆栈指针寄存器递减。
每次从堆栈中“弹出”某些内容时,存储在堆栈指针寄存器指定地址中的值将存储在程序员指定的寄存器中,并且堆栈指针寄存器会递增。
在 16 位实模式下,您“压入”和“弹出”16 位。所以每次你“压入”或“弹出”时,堆栈指针寄存器递减或递增 0x02,因为每个地址都包含 8 位..
在 32 位保护模式下,您“压入”和“弹出”32 位。因此,每次您“压入”或“弹出”时,堆栈指针寄存器都会递减或递增 0x04,因为每个地址都包含 8 位。
您必须根据要“推送”的值的数量在正确的位置设置堆栈。
如果你继续“插入”你的堆栈不断向下增长,在某个时间点你的堆栈可能会覆盖一些东西。因此,请明智地将堆栈设置在内存中有足够空间供堆栈向下增长的地址中。
例如:
如果您将堆栈设置在 0x7c00,就在引导加载程序下方,并且您“推送”了太多值,您的堆栈可能会在某个时间点覆盖 BIOS 数据区域,这会导致很多错误。
现在您应该对堆栈及其大小有一个基本的了解。
关于windows - 程序集 - 如何修改堆栈大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34544565/