assembly - 这个堆栈检查 PPC 程序集在做什么?

标签 assembly stack powerpc

我有以下独立函数(即它分支为使用bl CheckStackFunc),我对其用途感到困惑。熟悉 PowerPC 组装的人可以帮忙吗?

_CheckStackFunc:
    neg     %r11, %r12
    addi    %r0, %r11, 0xFFF
    srawi.  %r0, %r0, 0xC
    blelr
    mr      %r11, %sp
    mtctr   %r0
loc_10176B0C:                           
    lwzu    %r0, -0x1000(%r11)
    bdnz    loc_10176B0C
    blr

话虽如此,我正在使用 this IBM 提供的文档供我的 PPC 组装引用。这是否被认为是最终来源,还是还有其他我应该注意的信息?

最佳答案

我对 PPC 一点也不熟悉,但这是我的猜测:

对我来说,它看起来像alloca_probe()。使用页面步骤接触堆栈的代码,以便触发PAGE_GUARD异常。 (请原谅我的 x86 语言:))

它在大型堆栈分配之后使用(也可以通过alloca完成)。堆栈通常没有为堆栈分配的所有内存保留,最后实际加载的页面有一个特殊标志,PAGE_GUARD,它会触发操作系统捕获的硬件异常,以便它可以提交将更多页面添加到堆栈中。当堆栈正常使用时(使用push/pop),则无法绕过此页面。但是,对于较大的分配,需要先调用alloca_probe(),然后才能安全使用内存。

关于assembly - 这个堆栈检查 PPC 程序集在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4468303/

相关文章:

c - 像算术运算符的操作数这样的临时值是否放在堆栈中?

c++ - iostream是否占用堆栈空间?

ruby - 使用两个递归理解递归概念

linux - PowerPC Linux 上的 D(和 Tango)

c - 程序中的变量是否连续存储在内存中?

c - 将 C 语言翻译成 ARM 汇编语言

assembly - 如何使用NASM访问系统时间?

assembly - 反汇编时如何对二进制arm指令进行分类

c - 我如何知道 ELF 对象文件中的调试信息类型?

c - 当 mpi 发送和接收置于循环中时,Mpirun 挂起