andeq r0, r0, r0
来源:互联网 发布:大唐移动面试知乎 编辑:程序博客网 时间:2024/05/16 14:56
在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,在这里就不分析了。
- andeq r0, r0, r0
- R0多线程
- ORR R0,R0,#R1_nF:OR:R1_iA
- ORR R0,R0,#R1_nF:OR:R1_iA
- orr r0,r0,#R1_nF:OR:R1_iA
- ORR R0,R0,#R1_nF:OR:R1_iA
- tf.split (API r0.12 / r0.9)
- tf.concat (API r0.12 / r0.9)
- CLR R0 指令不存在
- R0取进程路径
- R0 枚举进程信息
- note: r0 LockOpt
- note: KillProcess On R0
- ARM R0-R16
- R0与R3联调
- DSP++ [p0 ++] = r0
- 注册表R0监控
- ARM R0-R16
- java多线程---Executor框架
- Java微信开发(三)之JS-SDK配置
- autofocus——打开页面,自动获得光标的焦点
- 一个绚丽的loading动效分析与实现!
- 2的0-n方和
- andeq r0, r0, r0
- json串格式化代码
- linux下获取按键响应事件
- Bugly IOS Crash 符号表生成使用记录
- LeetCode 091: Decode Ways
- AndroidStudio常用快捷键整理
- Android Studio 导入第三方库工程、jar 包和 so 库
- C语言变参函数宏定义分析
- 如何解决Android软键盘盖住输入框的问题