转载自: 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 系统调用。