结合实例分析arm指令集中的adds指令与arm内嵌汇编

本文通过分析ffmpeg源码中的av_clipl_int32_arm函数,探讨了ARM指令集中adds指令的用法以及内嵌汇编在64位系统的处理方式。通过反汇编代码,展示了64位数据如何存储在两个连续的32位寄存器中,以及如何利用adds指令进行位运算。通过对不同情况的分析,揭示了当输入数值超过32位时,函数返回值的变化规律。
摘要由CSDN通过智能技术生成

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]

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值