ARM IT条件指令汇编程序(armcc)

Jol*_*oza 3 assembly arm conditional-statements

为什么以下编译:

 
    ITE EQ         
    MRSEQ  R0, MSP
    MRSNE   R0, PSP        
Run Code Online (Sandbox Code Playgroud)

但这不是:

 
    ITT NE
MRSNE R0, PSP
MRSEQ R0, MSP
Run Code Online (Sandbox Code Playgroud) 是否有可能MRSNE R0,PSP和MRSEQ R0,MSP都执行(这是我的情况)?

This compiles:
 
    ITT NE         
    MRSNE   R0, PSP       
    MRSNE  R0, MSP 
Run Code Online (Sandbox Code Playgroud)

它是ARM标准吗?

art*_*ise 13

但这不是:

ITT NE
MRSNE   R0, PSP
MRSEQ  R0, MSP
Run Code Online (Sandbox Code Playgroud)

首先,你有一些概念问题.什么ITT都有关系?首先是一些历史.早期的ARM CPU不支持Thumb(16位),也不支持Thumb2(混合16/32bit)编码.对于纯ARM,大部分(4个前导位)专用于条件执行.将拇指指令集不支持条件执行.对于Thumb2(您在Cortex-M部件上想要的内容),条件执行有一些变化.不是在每条指令中编译条件,而是it在条件寄存器中设置8位的指令.

it指令给出的比较来测试(EQ,NE,LO等).然后它最多提供四个条件指令.从Cortex-A程序员手册中,


第A.1.34节

IT(If-then)最多可以有四条有条件的指令(称为IT块).条件可以全部相同,或者某些条件可以是其他条件的逻辑反转.IT是ARM状态下的伪指令.

语法:IT{x{y{z}}} {cond}
where:cond是条件代码.请参见6.1.2节,它指定了IT块中第一条指令的条件.
例如,x,yz指定IT块中第二,第三和第四条指令的条件开关ITTET.条件开关可以是:

  • T(然后),它将条件cond应用于指令.
  • E(Else),它将cond的逆条件应用于指令.

为了支持Thumb2ARM汇编程序,创建了一种称为统一汇编语言的新模式.参考:统一语法

对于纯ARM,IT评估为空.指令使用条件进行编码.对于Thumb2,它会使条件寄存器置位以设置条件位.ARM汇编程序有三种模式; .arm,.thumb.unified.还.code 32.code 16.根据使用的模式和特定的汇编程序(Gnu,ARM等),您将收到不同的警告和/或错误.但是,这种模式永远不会失败,

MRS

IT指令是"IT块".在您的情况下,您使用thumb2特殊寄存器,因此统一语法对于手头的任务没有多大意义.见下面的注释.

制作统一IT块时,您应该注意一些规则.

  1. cmpne块不应设置条件代码.即,IT指导.
  2. 你不应该分支到IT块.
  3. 我们总是开始IT,所以CONDPSR一定的第一个指令相匹配.
  4. 以下指令必须与cond匹配,如果是'T',或者cond如果'E'.
  5. 你不应该改变状态寄存器cpsr,ITE见注
  6. 你只能混合相反的类型.例如,

IT

可以在ARM中工作,但不适用于Thumb2.在你的情况下,你打破了规则'4'并得到一个错误.


例:

   ITE    NE       ; first NE, 2nd !NE = EQ (Thumb2)
   MRSNE  R0, PSP  ; first NE               (ARM)
   MRSEQ  R0, MSP  ; 2nd !NE = EQ           (ARM)
Run Code Online (Sandbox Code Playgroud)

拆卸ARM,

     movlo  r1, #-1
     moveq  r1, #0
     movhi  r1, #1
Run Code Online (Sandbox Code Playgroud)

拆卸的thumb2,

.text
.syntax unified
ITE NE          @ first NE, 2nd !NE = EQ (Thumb2) 
movne R0, #1    @ first NE (ARM) 
moveq R0, #2    @ 2nd !NE = EQ (ARM)
Run Code Online (Sandbox Code Playgroud)

对于thumb2,这是没有IT指令的等价物,

00000000 <.text>:
   0:   13a00001        movne   r0, #1
   4:   03a00002        moveq   r0, #2
Run Code Online (Sandbox Code Playgroud)

即,两个动作设置条件代码.汇编程序中的第二个数字当然是机器代码.对于thumb2 OS/scheduler,它将恢复恢复PSR状态的条件寄存器,您可以进入IT块的中间.也可以手动执行此操作(但是,它可能具有高度CPU特定性,并且没有我所知道的文档).

注意:对于改变它的Cortex-M调度程序代码PSR,您需要使用分支.这些寄存器控制IT块执行.你不应该PSRITT块中修改它.这同样适用于任何上下文恢复指令; 我不是100%熟悉Cortex-M模式切换,它涉及更改活动it.