2

我有以下独立的功能(即它分支到 using 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

话虽如此,我正在使用IBM 的这份文档作为我的 PPC 组装参考。这被认为是最终来源还是我应该注意的其他来源?

4

1 回答 1

4

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

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

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

于 2010-12-17T06:52:39.400 回答