ARM中的条件执行指令 (IT指令)

3 篇文章 0 订阅
2 篇文章 0 订阅
现象基本可以描述为:对于一个if分支结构,在仿真的时候单步跟踪,发现在if和else中的语句块都执行到了。贴个简化的代码:
 
 
  1. if (10 == x)
  2. {
  3. y = 1;
  4. }
  5. else
  6. {
  7. y = 2;
  8. }

  当然,以上代码只是示意,真正的应用中我们一般不会写出这样看似无意义的代码。简而言之,在单步跟踪的过程中,发现y = 1;y = 2都执行到了,这显然不符合C语言的标准。

  于是我打开汇编视图,发现在比较指令(CMP)后有一条指令:IT EQ,其后紧跟两个看似mov的指令,由于只学过x86汇编,对此也不太熟悉,就把两条都当作mov的某个变体了。查阅资料后得知,类似IT EQ的指令还有很多,例如ITEITTITETT等,都属于thumb指令集,是条件执行的指令。而跟在其后的mov也并非简单的mov指令,而是MOVEQMOVNE,分别是“MOVe (while) EQual”和“MOVe (while) Not Equal”的意思。而诸如此类的指令,在ARM中都称为“条件执行”的指令,只有当某种条件符合的时候(例如状态寄存器的某位被置位),该指令才真正执行相应的操作,否则不做任何处理。

  如此便可以解释遇到的情况了。虽然在单步跟踪时,进入了if的两个分支,看起来逻辑错误;然而实际上执行操作的只有一个分支,是符合我们的期望的。由此也能得到一个教训:在嵌入式程序的调试中,单步调试和我们熟悉的在VC或VS中的含义并不一致,想了解代码运行的真实情况还是得观察汇编代码或是直接观察运行结果。

  一般情况下,在if或else后面只跟了一两条简单语句(一般是能编译成四条以内的指令)时,需要特别注意条件执行的情况。因为设计条件执行特性的初衷是保证流水线的完整性,这种跳转地址只有几个字节的场景很容易被编译成条件执行。

Thumb指令集中的IT指令

  IT指令用于根据特定条件来执行紧随其后的1~4条指令,其格式为: IT[x[y[z]]] 。其中x、y、z分别是执行第二、三、四条指令的条件,可取的值为T(then)或E(else),对应于条件的成立和不成立。称为条件字段,可取的值有:

条件后缀标志寄存器含义
EQZ == 1等于
NEZ == 0不等于
CS/HSC == 1无符号大于或相同
CC/LOC == 0无符号小于
MIN == 1负数
PLN == 0整数或零
VSV == 1溢出
VCV == 0无溢出
HIC == 1 && Z == 0无符号大于
LSC == 1 || Z == 0无符号小于或相同
GEN == V有符号大于或等于
LTN != V有符号小于
GTZ == 0 && N == V有符号大于
LEZ == 1 || N != V有符号小于或等于
AL任何始终。不可用于B{cond}中

  看下面这个例子,意思是,当条件“EQ”符合时,执行指令1、3、4的mov操作,否则执行指令2的mov操作。

 
 
  1. ITETT EQ
  2. MOVEQ R0, #1 ;//指令1
  3. MOVNE R0, #0 ;//指令2
  4. MOVEQ R1, #0 ;//指令3
  5. MOVEQ R2, #0 ;//指令4

  此外,IT指令还有一些限制,如:

不允许在 IT 块中使用下面的指令:

  • IT
  • 条件跳转
  • CBZ 和 CBNZ
  • TBB 和 TBH
  • CPS、CPSID 和 CPSIE
  • SETEND。

除以下两种情况外,均不允许跳进或跳出 IT 块:①IT 块的最后一条指令可为无条件跳转指令(IT指令会让其变为条件跳转)。 ②异常处理/恢复


转自:http://blog.csdn.net/petib_wangwei/article/details/41318069

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SimIt-ARM-3.0 给予命令行ARM指令模拟器,短小精悍,是研究ARM处理器的好工具,该模拟器既可以运行用户级别的ELF程序,又可以模拟运行Linux操作系统;提供了简单易用的调试命令,可以逐条跟踪指令执行。 SimIt-ARM-3.0-gk-20150902.tar.bz2 HowTo 0.what is SimIt-ARM-3.0 SimIt-ARM 3.0 is an instruction-set simulator that runs both system-level and user-level ARM programs, for more about it please read user's guide file. 1.how to build tar jxvf SimIt-ARM-3.0-gk-20150902.tar.bz2 cd SimIt-ARM-3.0-gk ./configure make make install After these steps, the ./build/bindirectory contains the following programs: ema An ARM interpreter. To test the installation was successful type ./build/bin/ema test/wc configure modifiy PATH environment variable: PATH=$PATH:$HOME/SimIt-ARM-3.0-gk/build/bin ; export PATH 2. how to use 2.1 run user-level ARM programs [root@ORA9 SimIt-ARM-3.0-gk]# cd gcc-asm [root@ORA9 gcc-asm]# more hello.c /* * hello.c * Tue Sep 8 10:13:40 CST 2015 */ int main() { printf("hello world\n"); __asm("mov r0,#2\n\t" "swi 0x1\n\t"); // syscall: exit(2); } [root@ORA9 gcc-asm]# arm-linux-gcc -v Reading specs from /usr/local/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/specs Configured with: /opt/crosstool/crosstool-0.28/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc-3.4.1/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2 --with-float=soft --with-headers=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2/arm-linux/include --with-local-prefix=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2/arm-linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long Thread model: posix gcc version 3.4.1 [root@ORA9 gcc-asm]# arm-linux-gcc hello.c -o hello -static [root@ORA9 gcc-asm]# ls -l hello* -rwxr-xr-x 1 root root 520775 Sep 8 10:18 hello -rw-r--r-- 1 root root 160 Sep 8 10:15 hello.c [root@ORA9 gcc-asm]# file hello hello: ELF 32-bit LSB executable, ARM, vers

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值