x264的堆栈对齐 x264_stack_align
2013-11-13 16:58
176 查看
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
为什么要对齐,因为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
相关文章推荐
- x264的堆栈对齐 x264_stack_align
- x264_stack_align( x264_slice_write, h )解读
- IO_STACK_LOCATION — I/O堆栈
- 【图标文字垂直对齐】♣vertical-align:length
- openssl中的STACK操作实现了一个自动增加的堆栈
- 老外写的StackWalk64的封装类StackWalker。继承其并且重载onOutput可以得到堆栈。
- 1.5、Activity任务和返回堆栈2(Tasks and Back Stack)
- css text-align 对齐
- 强制要求JVM始终抛出含堆栈的异常(-XX:-OmitStackTraceInFastThrow)
- java中堆(heap)和堆栈(stack)有什么区别
- 堆栈溢出 Maximum call stack size exceeded
- 关于垂直对齐方式vertical-align
- CSS文本对齐text-align详解
- RT8003: 'text-align' 特性在 IE6 IE7 IE8(Q) 中可以影响块级元素的对齐方式,并且在所有浏览器的混杂模式中均不能被 TABLE 元素继承
- 使用text-align:justify实现两端对齐一例
- Java 输出 printStackTrace 堆栈信息
- CSS教程:水平对齐(text-align)
- 对齐函数:ALIGN()
- display:inline-block/text-align:justify下列表的两端对齐布局
- 扩展堆栈(stack) O(1) 时间访问栈中最小值(或最大值)