我有以下自包含功能(即它分支到使用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的this文档作为我的PPC程序集参考。这被认为是权威来源还是其他我应该知道的?
答案 0 :(得分:4)
我对PPC一点都不熟悉,但这是我的猜测:
对我来说看起来像alloca_probe()
。 使用页面的步骤触及堆栈的代码,以便触发PAGE_GUARD
异常。 (请原谅我的x86语言:))
它在大量堆栈分配后使用(也可以由alloca
完成)。堆栈通常没有为分配的堆栈保留所有内存,最后一个实际加载的页面有一个特殊的标志PAGE_GUARD
,它触发了操作系统捕获的硬件异常,因此它可以提交更多的页面堆栈。正常使用堆栈(使用push / pop)时,无法绕过此页面。但是,对于较大的alloc,在安全使用内存之前需要调用alloca_probe()
。