andeq r0, r0, r0

在arm反汇编文件(.dis)中经常在<.text段文字池>或<.bss>段中看到一些奇怪的代码,比如:
 

1、.text段文字池:

0000003c:  0000804c    andeq   r8, r0, ip, asr #32
    00000040:  00008048    andeq   r8, r0, r8, asr #32
 

2、.bss段: 
    0000804c:   00000000    andeq   r0, r0, r0
 

其中第一列表示链接地址,第二列为链接地址中的数据,第三列表示数据对应的汇编指令;

    这里需要强调的是,这些地址中的数据仅仅只是数据,而不是命令,所以后面对应的汇编语句也不会执行;并不是说这些汇编语句本身不能执行,而是在这种特定情景中它们仅仅代表数据。

    下面我们首先来分析,为什么<andeq   r0, r0, r0>就代表数据0x00000000呢?
看一下这种and汇编指令对应的二进制格式:

and {<cond>} {S} <Rd>, <Rn>, <shifter_operand> 

31~28

27~26

25

24~21

20

19~16

15~12

11~0

cond

00

I

0000

S

Rn

Rd

Shifter_operand

    根据具体的指令形式(<Rm>形式),二进制格式可以细化为: 

31~28

27~25

24~21

20

19~16

15~12

11~7

6~4

3~0

0000

000

0000

0

r0(0)

r0(0)

00000

000

r0(0)

 所以指令<andeq   r0, r0, r0>对应的二进制格式为0x00000000,也就说明了,在反汇编代码bss段中有大量的这种代码,也就不足为奇了。 

下面再分析一个例子,<andeq   r8, r0, ip, asr #32>:

同上面的分析,根据指令形式(<Rm>, asr #<shift_imm>形式),二进制格式直接细化为: 

31~28

27~25

24~21

20

19~16

15~12

11~7

6~4

3~0

0000

000

0000

0

Rn

Rd

Shift_imm

100

Rm

    在二进制指令格式中:

    r0表示为0000,Rn=0000;

    r8表示为1000,Rd=1000;

    ip(r12)表示为1100,Rm=12=0xc;

    当shift_imm=0时,表示移位32位。

    上图用具体数据替换后为: 

31~28

27~25

24~21

20

19~16

15~12

11~7

6~4

3~0

0000

000

0000

0

0000

1000

00000

100

000c

也就是指指令<andeq   r8, r0, ip, asr #32>的二进制形式为0x0000804c。

最后一个指令<andeq   r8, r0, r8, asr #32>的二进制形式为0x00008048,在这里就不分析了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值