关于给定汇编代码中调用atoi前栈是否对齐的技术问询
汇编代码栈对齐分析(调用atoi前)
待分析的汇编代码如下:
global main extern atoi default rel section .text main: push rdi push rsi mov rdi, [rsi] call atoi mov rdi, rax mov rsi, 1 mov rax, 1 syscall pop rsi pop rdi xor rax, rax ret
分析依据
基于SysV AMD64 ABI规范,x86-64平台下调用外部函数前,栈指针RSP必须满足16字节对齐(即 RSP % 16 == 0)。这是因为call指令会自动压入8字节的返回地址,确保被调用函数入口处的RSP + 8仍保持16字节对齐,满足函数栈帧的对齐要求。
逐步骤栈状态分析
进入main时的栈状态:
程序启动后,_start函数执行call main调用main。执行该call前,RSP是16字节对齐的;执行call后,RSP因压入8字节返回地址变为16n - 8(n为整数),此时RSP模16余8,处于未对齐状态。push rdi后的栈状态:
执行push rdi后,RSP减少8字节,变为16n - 16,此时RSP恢复16字节对齐。push rsi后的栈状态:
执行push rsi后,RSP再减少8字节,变为16n - 24,此时RSP模16余8,再次进入未对齐状态。调用atoi前的栈状态:
随后执行mov rdi, [rsi]准备atoi的参数,紧接着执行call atoi。此时调用atoi前的RSP值为16n - 24,不满足SysV ABI要求的16字节对齐条件。
结论
调用atoi函数之前,栈未对齐。
内容的提问来源于stack exchange,提问作者HERO
相关产品推荐
相关产品推荐

