您的位置:首页 > 其它

x264的堆栈对齐 x264_stack_align

2013-10-08 16:52 78 查看
x264_stack_align

为什么要对齐,因为AVX2指令需要32字节对齐。

怎么对齐,在common/x86/cpu-a.asm

一句话,就是模拟一个空调用,这个调用只是对齐堆栈和转调真实的函数

%if ARCH_X86_64

;-----------------------------------------------------------------------------
; void stack_align( void (*func)(void*), void *arg );
;-----------------------------------------------------------------------------
cglobal stack_align
push rbp ;保存帧寄存器
mov rbp, rsp ;保存rsp
%if WIN64
sub rsp, 32 ; shadow space win64的调用惯例规定,请参看http://wiki.lazarus.freepascal.org/Win64/AMD64_API#Shadow_space
%endif
and rsp, ~31 ;保证32byte对齐。其实一句话,上面是模拟一个函调调用,并把堆栈指针32byte对齐,注意和下面的leave呼应。
mov rax, r0 ;把真实函数指针付给rax
mov r0, r1 ;把参数移到真实函数的参数中,真实函数应该不会使用多余三个的参数 :)
mov r1, r2
mov r2, r3
call rax ;呼叫真实函数
leave ;恢复rsp,rbp,也就是模拟的函数调用返回,
ret

%else
cglobal stack_align
push ebp
mov ebp, esp
sub esp, 12 ;预留堆栈空间,保存至少三个参数
and esp, ~31 ;对齐堆栈
mov ecx, [ebp+8] ;把第一个参数,真实的函数赋值给ECX, +8跳过old EIP和old EBP ,参考 http://www.unixwiz.net/techtips/win32-callconv-asm.html mov edx, [ebp+12] ; 把后续的三个参数放在堆栈上
mov [esp], edx
mov edx, [ebp+16]
mov [esp+4], edx
mov edx, [ebp+20]
mov [esp+8], edx
call ecx ;呼叫真实的函数
leave ;退出当前虚拟的函数调用
ret

%endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: