ARM IT 条件指令汇编器 (armcc)

问题描述 投票:0回答:1

为什么下面的代码可以编译?

ITE    EQ         
MRSEQ  R0, MSP
MRSNE  R0, PSP

...但以下不是?

ITT    NE         
MRSNE  R0, PSP       
MRSEQ  R0, MSP

是否有可能

MRSNE R0, PSP
MRSEQ R0, MSP
都被执行(这是我的情况)?

编译:

ITT    NE         
MRSNE  R0, PSP       
MRSNE  R0, MSP

是ARM标准吗?

assembly arm conditional-statements
1个回答
19
投票

概述

但这不是:

ITT NE
MRSNE   R0, PSP
MRSEQ  R0, MSP

首先你有一些概念问题。

ITT
到底是什么? 首先是一些历史。 早期的 ARM CPU 不支持 Thumb(16 位),也不支持 Thumb2(混合 16/32 位)编码。 对于纯 ARM,很大一部分(4 个前导位)专用于条件执行。 Thumb指令集不支持条件执行。 对于 Thumb2(您想要的 Cortex-M 部分),条件执行有一个变化。 有一条
it
指令在条件寄存器中设置 8 位,而不是在每条指令中编译条件。

it
指令给出了与测试的比较(
EQ
NE
LO
等)。 然后它给出最多四个条件指令。 来自 Cortex-A 程序员手册,

文档

A.1.34 节

IT(If-then)最多可包含 four 以下条件指令(称为

IT
块)。条件可以全部相同,或者某些条件可以与其他条件相反。
IT
是ARM状态下的伪指令。

语法:

IT{x{y{z}}} {cond}

其中: cond 是条件代码。请参阅第 6.1.2 节,其中指定了 IT 块中first指令的条件。
xyz指定
IT
块中第二、第三和第四条指令的条件开关,例如
ITTET
。 条件开关可以是:

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

Thumb2 条件块的限制

为了同时支持Thumb2ARM汇编器,创建了一种称为统一汇编语言的新模式。参考:统一语法

对于纯 ARM,

IT
的计算结果为空。 这些指令是用条件编码的。对于 Thumb2,它会启动条件寄存器以设置条件位。 ARM汇编器有3种模式;
.arm
.thumb
.unified
。 还有
.code 32
.code 16
。 根据使用的模式和特定的汇编器(Gnu、ARM 等),您将收到不同的警告和/或错误。 但是,对于您的序列,此模式将永远不会失败

   ITE    NE       ; first NE, 2nd !NE = EQ (Thumb2)
   MRSNE  R0, PSP  ; first NE               (ARM)
   MRSEQ  R0, MSP  ; 2nd !NE = EQ           (ARM)

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

要制作统一的

IT
块,您应该注意一些规则。

  1. IT
    块不应设置条件代码。即,
    cmpne
    指令。
  2. 您不应该分支到
    IT
    区块。
  3. 我们总是以
    IT
    开头,因此 IT 中的
    cond
    必须与第一条指令匹配。
  4. 以下指令必须匹配 cond(如果是“T”)或 !cond(如果是“E”)。
  5. 您不应更改条件寄存器
    PSR
    cpsr
    等。参见注释
  6. 您只能混合相反类型。 例如,
     movlo  r1, #-1
     moveq  r1, #0
     movhi  r1, #1

可以在 ARM 中工作,但不能在 Thumb2 中工作。 就您而言,您违反了规则“4”并收到错误。 此外,ARM 允许将无条件指令与条件指令混合。 但一般来说,当 90-99% 的情况都是在编译代码中无条件执行时,获得这些额外的操作码位会付出很高的代价。

检查操作码

示例:

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

拆卸的手臂

00000000 <.text>:
   0:   13a00001        movne   r0, #1
   4:   03a00002        moveq   r0, #2

拆解thumb2

00000000 <.text>:
   0:   bf14            ite     ne
   2:   2001            movne   r0, #1
   4:   2002            moveq   r0, #2

对于 thumb2,这相当于没有

ITE
指令,

00000000 <.text>:
   0:   2001            movs    r0, #1
   2:   2002            movs    r0, #2

即,设置条件代码的两个动作。 反汇编器中的第二个数字当然是机器代码。 对于 thumb2 操作系统/调度器,它将恢复条件寄存器,从而恢复

IT
状态,并且您可以 enter 进入
IT
块的中间。 也可以手动执行此操作(但是,它可能高度特定于 CPU,并且据我所知没有记录)。

Thumb2 为 6 字节,ARM 代码为 8 字节以实现同等功能。 如果“宽”(32 位)操作码位于条件块中,Thumb2 将需要更多代码空间。

注意: 对于改变 PSR

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

© www.soinside.com 2019 - 2024. All rights reserved.