x264_stack_align( x264_slice_write, h )解读
2012-12-04 23:01
176 查看
看到x264中对于字节对齐的函数x264_stack_align( x264_slice_write, h ),为什么要字节对齐呢?因为x264中用到的指令集优化SSE2,而SSE2寄存器是128位寄存器,SSE2的指令是对16字节(128/8)同时处理,这就要求指令作用时,数据存放的地址以16字节对齐(即数据地址是16的倍数),这样一个指令周期就可以处理数据,不然会消耗多个指令周期而发挥不了指令集优化的性能。
在x264_stack_align( x264_slice_write, h )上设置断点,进行反汇编跟踪
x264_stack_align( x264_slice_write, h );
0040F130 mov eax,dword ptr [h]
0040F133 push eax
0040F134 push offset x264_slice_write (40F180h)
0040F139 call _x264_stack_align (412990h)
0040F13E add esp,8
如图结合汇编程序,分别将参数h,x264_slice_write的函数地址压栈,接着调用call至_x264_stack_align处,调用call时例行对返回地址压栈
_x264_stack_align:
00412990 push ebp
00412991 mov ebp,esp
00412993 sub esp,4
00412996 and esp,0FFFFFFF0h
00412999 mov ecx,dword ptr [ebp+8]
0041299C mov edx,dword ptr [ebp+0Ch]
0041299F mov dword ptr [esp],edx
004129A2 call ecx
程序跳至_x264_stack_align处,首先将ebp值压栈,接着将esp的值赋给ebp,ebp指在图中所示处,然后esp = esp - 4,如图所指。接着执行and esp,0FFFFFFF0h ,这边esp被调整到16的倍数如图所示调整后esp下移(esp本身就是16的倍数时在原位置不变),这边即是实现了16字节的对齐。然后将x264_slice_write的函数入口地址赋给ecx,将h赋给edx,并将edx压入栈中,call
ecx程序跳转至x264_slice_write处。
static void x264_slice_write( x264_t *h )
{
0040F180 push ebp
0040F181 mov ebp,esp
0040F183 sub esp,120h
0040F189 push ebx
0040F18A push esi
0040F18B push edi
0040F18C lea edi,[ebp-120h]
0040F192 mov ecx,48h
0040F197 mov eax,0CCCCCCCCh
0040F19C rep stos dword ptr es:[edi]
接着跳转到x264_slice_write处,push ebp,参数值h可以通过dword ptr [ebp+8] 索引到。
转载请注明出处。。。
在x264_stack_align( x264_slice_write, h )上设置断点,进行反汇编跟踪
x264_stack_align( x264_slice_write, h );
0040F130 mov eax,dword ptr [h]
0040F133 push eax
0040F134 push offset x264_slice_write (40F180h)
0040F139 call _x264_stack_align (412990h)
0040F13E add esp,8
如图结合汇编程序,分别将参数h,x264_slice_write的函数地址压栈,接着调用call至_x264_stack_align处,调用call时例行对返回地址压栈
_x264_stack_align:
00412990 push ebp
00412991 mov ebp,esp
00412993 sub esp,4
00412996 and esp,0FFFFFFF0h
00412999 mov ecx,dword ptr [ebp+8]
0041299C mov edx,dword ptr [ebp+0Ch]
0041299F mov dword ptr [esp],edx
004129A2 call ecx
程序跳至_x264_stack_align处,首先将ebp值压栈,接着将esp的值赋给ebp,ebp指在图中所示处,然后esp = esp - 4,如图所指。接着执行and esp,0FFFFFFF0h ,这边esp被调整到16的倍数如图所示调整后esp下移(esp本身就是16的倍数时在原位置不变),这边即是实现了16字节的对齐。然后将x264_slice_write的函数入口地址赋给ecx,将h赋给edx,并将edx压入栈中,call
ecx程序跳转至x264_slice_write处。
static void x264_slice_write( x264_t *h )
{
0040F180 push ebp
0040F181 mov ebp,esp
0040F183 sub esp,120h
0040F189 push ebx
0040F18A push esi
0040F18B push edi
0040F18C lea edi,[ebp-120h]
0040F192 mov ecx,48h
0040F197 mov eax,0CCCCCCCCh
0040F19C rep stos dword ptr es:[edi]
接着跳转到x264_slice_write处,push ebp,参数值h可以通过dword ptr [ebp+8] 索引到。
转载请注明出处。。。
相关文章推荐
- x264源代码简单分析:x264_slice_write()
- x264的堆栈对齐 x264_stack_align
- x264的堆栈对齐 x264_stack_align
- x264源码分析三:x264_slices_write和x264_slice_write函数分析
- x264源代码简单分析:x264_slice_write()
- x264代码剖析(九):x264_encoder_encode()函数之x264_slice's'_write()函数
- CopyOnWriteArrayList 解读
- SensorTag编译错误Error[e16]: Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition.
- ZigBee学习之——ZStack API解读
- 解读x264_param_default
- 《Smashing The Stack For Fun And Profit》解读
- Could not write content: Infinite recursion (StackOverflowError)
- 微服务间调用导致的Could not write content: Infinite recursion (StackOverflowError)问题
- 线性表数据结构解读(三)栈结构Stack
- 源码解读Saltstack运行机制之Job Runtime
- Openstack 开发人员安装脚本解读 [stack.sh]
- Z-STACK之OSAL_Nv非易失性存储解读上
- Openstack 开发人员安装脚本解读 [stack.sh]
- 线性表数据结构解读(三)栈结构Stack
- Z-STACK之OSAL_Nv非易失性存储解读上