文档章节

x264的堆栈对齐 x264_stack_align

ljb_iss
 ljb_iss
发布于 2013/10/08 16:52
字数 362
阅读 210
收藏 0

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


© 著作权归作者所有

ljb_iss
粉丝 10
博文 8
码字总数 8099
作品 0
武汉
技术主管
私信 提问
音视频技术--H.264代码与标准如何对应

总是有人说自己把代码和标准对应不起来。其实是因为你要么不知道标准各个章节讲的什么,要么不知道代码中各个函数的功能,或者两者都不知道。今天再以 X264 的帧内编码为例让大家体会一下读代...

技术小阿哥
2017/11/27
0
0
x264源代码简单分析:宏块分析(Analysis)部分-帧内宏块(Intra)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leixiaohua1020/article/details/45917757 ===================================================== H.264源代......

雷霄骅
2015/05/22
0
0
x264_encoder_encode 运行异常问题

我的程序采集过来视频数据是UYVY,采用X264编译,视频数据都是实时采集,问题是现在遇到x264_encoder_encode直接抛出异常,通过跟踪代码刚开始接受数据时x264_encoder_encode不会异常但是返回...

lucasli
2011/12/15
3.3K
4
x264源代码简单分析:编码器主干部分-2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leixiaohua1020/article/details/45719905 ===================================================== H.264源代......

雷霄骅
2015/05/14
0
0
x264源代码简单分析:熵编码(Entropy Encoding)部分

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leixiaohua1020/article/details/45944811 ===================================================== H.264源代......

雷霄骅
2015/05/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
4
0
溢出\越界\泄漏

溢出:栈溢出是指函数中的局部变量造成的溢出,递归次数太多也会栈溢出 一是分配的大小超过栈的最大值,char a[99999999999999999]; 二是分配的大小没有超过最大值,但是接收的buff比新buff小...

SibylY
昨天
3
0
线性表-链式(c/c++实现)

在写数据的结构就是自己排兵布阵,根据客户的需求可增删功能,顺序与链式编程思想是一样的,两个比较只需要改变实现功能这一块。 线性表(链式)实现的三个步骤: 定义所需的功能(LinkList....

白客C
昨天
4
0
导览Linux系统文件系统类型

虽然对于普通用户来说可能并不明显,但在过去十年左右的时间里,Linux 文件系统已经发生了显著的变化,这使它们能够更好对抗损坏和性能问题。 如今大多数 Linux 系统使用名为 ext4 的文件系统...

老孟的Linux私房菜
昨天
4
0
Eureka重要对象简介

在进行分析EurekaClient和EurekaServer之间通信的源码之前,我们首先需要熟悉一下几个实体类 InstanceInfo 这个类代表着EurekaClient实例,客户端向服务端请求注册时就会携带着这个实例,这个...

Java学习录
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部