在汇编语言编程中,什么(如果有的话)阻止堆栈增长直到它破坏了数据或指令?
答案 0 :(得分:5)
通常由操作系统完成的CPU / MMU配置可以防止或拦截堆栈溢出和内存损坏或尝试访问没有必要权限的内容。
您可以在英特尔/ AMD的x86 CPU手册中阅读有关内存管理的章节,以了解更多信息。
答案 1 :(得分:4)
您可以直接在可接受的堆栈下限下方使用canaries,并不断检查金丝雀的值。
在kernelland代码(ring 0)中,您还可以通过设置其中一个调试寄存器dr0
,dr1
,dr2
和{{}的值来设置hardware breakpoint。 1}}到断点地址的线性地址,直接位于接受的堆栈下限之下,然后设置dr3
寄存器的正确标志位,并报告或尝试修复断点处理程序代码中的情况。请参阅HardWare BreakPoints The Definitive Guide。
答案 2 :(得分:2)
什么(如果有的话)阻止堆栈增长和破坏数据 还是说明?
您!在Assembly中编码时绝对没有手握。您必须确保所有值都适合其缓冲区,所有指针索引都在边界内。您在堆栈上保留空间,确保适合该缓冲区的任何内容。在使用Assembly时,您负责编程的各个方面。
答案 3 :(得分:1)
99.99%的堆栈溢出原因是程序错误或程序设计错误。
现在我们有两个基本但不在这个主题的问题:
1)如何防止装配中的错误?
2)如何做好程序设计?