我有以下独立函数(即它分支为使用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/