gpt4 book ai didi

arm64 - 溢出在 ARM ISA 中是什么意思

转载 作者:行者123 更新时间:2023-12-04 09:32:33 27 4
gpt4 key购买 nike

我已经写了一些测试代码,just for testing the stack overflow .

int MyFunc(long c)
{
char buffer[12];
return sprintf(buffer, "xxxxxxxxxxx%ld", c);
}
当我将它编译为 ARM64 程序集时,我得到了结果
MyFunc(long): // @MyFunc(long)
sub sp, sp, #32 // =32
stp x29, x30, [sp, #16] // 16-byte Folded Spill
add x29, sp, #16 // =16
adrp x1, .L.str
mov x2, x0
add x1, x1, :lo12:.L.str
add x0, sp, #4 // =4
bl sprintf
ldp x29, x30, [sp, #16] // 16-byte Folded Reload
add sp, sp, #32 // =32
ret
那么,是什么 16-byte Folded Spill意思?为什么?

最佳答案

Stackoverflow.com 是解决堆栈溢出问题的理想场所。 =)
16-byte 是因为我们将两个 8 字节的寄存器保存到堆栈中。
Folded 对于这一点,我将不得不猜测。折叠是数学运算的简化组合。我会一时兴起说它在这里不适用,它只是一个通用的编译器消息,有时才适用。如果我们连续使用其中的几个来将许多寄存器保存到堆栈中并且只增加一次堆栈指针(sp),那么它将被合并,因为我们将使用 -32+16=-16 并且这不会导致任何额外的数学。

sub sp, sp, #32 
stp x27, x28, [sp]
stp x29, x30, [sp, #16] <--- folded because we decrement sp once on 1st row
Spill 是将寄存器保存到内存的过程,因为我们需要额外的寄存器。这通常称为将寄存器溢出到内存。

关于arm64 - 溢出在 ARM ISA 中是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62767217/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com