qq截图进来的图全部丢失了。。。。。。。。郁闷。。。。。。
以下是ffmpege0.11.1源码中的一个函数,稍微做了点修改
注意:编译器我arm-linux-gcc4.4.1,其他的编译器请读者自行验证
static av_always_inline av_const int32_t av_clipl_int32_arm(int64_t a)
{int x, y;
#ifndef MELIS
__asm__ ("adds %1, %R2, %Q2, lsr #31 \n\t"
"itet ne \n\t" //反汇编之后发现该条指令不起作用,可以删除
"mvnne %1, #1<<31 \n\t"
"moveq %0, %Q2 \n\t"
"eorne %0, %1, %R2, asr #31 \n\t"
: "=r"(x), "=&r"(y) : "r"(a):"cc");
#else
__asm__
{
adds y, (((int*) &a)[1]), (((unsigned*) &a)[0]), lsr #31
mvnne y, #1<<31
moveq x, (((unsigned*) &a)[0])
eorne x, y, (((int*) &a)[1]), asr #31
}
#endif
return x;
}
分析:
__asm__是内嵌汇编的标志,这个不多说。
%0表示x,%1表示y,%2表示a,%R2表示a的高32位,%Q2表示a的低32位。
%R2表示a的高32位,%Q2表示a的低32位是怎么来的呢?
查看编写测试程序查看反汇编代码,测试程序如下:
#include <stdio.h>
int main()
{
long long int a=0x2200LL; //用long long int a=0x110022002200LL测试会发现输出结果是0x7fffffff,请读者自行测试
printf("0x%x\n", av_clipl_int32_arm(a));
return 0;
}
在linux下用arm-linux-gcc反汇编,反汇编的关键代码如下:
000083ec <av_clipl_int32_arm>:
83ec: e92d0810 push {r4, fp}
83f0: e28db004 add fp, sp, #4
83f4: e24dd010 sub sp, sp, #16
83f8: e50b0014 str r0, [fp, #-20]
83fc: e50b1010 str r1, [fp, #-16]