转载自: http://bbs.pediy.com/thread-220753.htm
ARM和Thumb
ARM状态的指令长度是32位的,Thumb状态的指令长度是16位的(也可能为32位)。当我们编写ARM shellcode时,需要使用16 bit的Thumb指令代替32 bit的ARM指令,从而避免在指令中出现’\0’截断。
容易引起混淆的是,不同的ARM版本,支持的Thumb指令集并不相同。在某些版本中,ARM引入了扩展的Thumb指令集(也就是Thumb-2),它支持32 bit指令以及条件执行。
你只需要知道目标设备的版本和该版本对Thumb指令有哪些特殊支持,然后调整你的代码就好了。ARM Infocenter可以帮助你了解各个ARM版本的具体细节(http://infocenter.arm.com/help/index.jsp)。
我们已经知道了Thumb有不同的版本,下面我们对不同的版本做一下简单的介绍,注意不同的命名只是为了区分不同的版本(换句话说,处理器只知道它运行在Thumb状态,其它一概不知)。
Thumb-1(16位指令):用于ARMv6和更早的版本。
Thumb-2(16位和32位指令):对Thumb-1的扩展,添加了更多指令并允许它们为16位或32位宽(ARMv6T2,ARMv7)。
ThumbEE:在Thumb-2基础上包含了针对动态代码生成(代码在执行前或执行期间编译代码)的一些变更和补充。
ARM和Thumb的区别
1.条件执行:ARM所有指令支持条件执行。
2.32位的Thumb指令具有.w后缀。
3.桶形移位器是另一种ARM模式特有的功能。它可以将多个指令合并成一个。例如,Mov R1,R0,LSL#1; R1 = R0 * 2
3.如果当前程序状态寄存器中的T位置1,我们知道我们处于Thumb模式。
ARM指令简介
执行条件,设置了执行条件的指令在执行指令前先校验CPSR中标志位;
第一个操作数,可以是一个寄存器或一个立即数;
第二个操作数,立即数、寄存器、带移位操作的寄存器。
LDM 多次加载;
MVN 取反码移动数据;
STM 多次存储;
LSL 逻辑左移;
LSR 逻辑右移;
ASR 算数右移;
ROR 循环右移;
B 分支;
BL 带返回的分支;
BX 带状态切换的分支;
BLX 带返回、状态切换的分支;
SWI/SVC 系统调用。