从我得到的here下面的示例代码中,我不明白为什么在执行字节溢出时寄存器的值会移动到堆栈中的特定部分。
pushq %rbp
movq %rsp, %rbp
subq $96, %rsp
leaq L__unnamed_cfstring_23(%rip), %rax
leaq L__unnamed_cfstring_26(%rip), %rcx
movl $42, %edx
leaq l_objc_msgSend_fixup_alloc(%rip), %r8
movl $0, -4(%rbp)
movl %edi, -8(%rbp)
movq %rsi, -16(%rbp)
movq %rax, -48(%rbp) ## 8-byte Spill
movq %rcx, -56(%rbp) ## 8-byte Spill
movq %r8, -64(%rbp) ## 8-byte Spill
movl %edx, -68(%rbp) ## 4-byte Spill
callq _objc_autoreleasePoolPush
movq L_OBJC_CLASSLIST_REFERENCES_$_(%rip), %rcx
movq %rcx, %rdi
movq -64(%rbp), %rsi ## 8-byte Reload
movq %rax, -80(%rbp) ## 8-byte Spill
callq *l_objc_msgSend_fixup_alloc(%rip)
movq L_OBJC_SELECTOR_REFERENCES_27(%rip), %rsi
movq %rax, %rdi
movq -56(%rbp), %rdx ## 8-byte Reload
movl -68(%rbp), %ecx ## 4-byte Reload
而且,我不知道字节溢出的目的是什么,因为如果函数是保存将在其中使用的寄存器值的函数,则仍然可以实现程序逻辑。
我真的不知道为什么会这样。请帮我理解这一点。