assembly ARM IT条件指令汇编程序

q0qdq0h2  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(218)

下面为什么编:

ITE EQ         
    MRSEQ  R0, MSP
    MRSNE   R0, PSP

但这不是:

ITT NE

    MRSNE   R0, PSP

    MRSEQ  R0, MSP

有没有可能,MRSNE R0,PSP和MRSEQ R0,MSP都执行(这是我的情况)?
第一个
它是ARM标准吗?

wmtdaxz3

wmtdaxz31#

概述

但这不是:

ITT NE
MRSNE   R0, PSP
MRSEQ  R0, MSP

首先,你有一些概念问题。ITT是关于什么的?首先是历史。早期的ARM CPU不支持 Thumb(16位),或非 * Thumb 2 *(混合16/32位)编码。对于纯ARM,大部分(4个前导位)专用于条件执行。Thumb 指令集不支持条件执行。对于 * Thumb 2 *(您希望Cortex-M部件执行的操作),条件执行有一个变体。it指令在条件寄存器中设置8位,而不是在每条指令中编译一个条件。
it指令提供比较测试(EQNELO等)。然后,它最多提供四条条件指令。根据Cortex-A程序员手册,

文件

第A.1.34节

IT(If-then)最多由四条以下指令组成条件指令(称为IT块)。这些条件可以全部相同,也可以是其他条件的逻辑反转。IT是ARM状态下的伪指令。

语法:IT{x{y{z}}} {cond}
其中:cond 是条件代码。参见6.1.2节,该节指定了IT块中 first 指令的条件。

  • x*,yz 指定IT块中第二条,第三条与第四条指令得条件开关,例如ITTET.条件开关可以是:
  • T(Then),它将条件cond应用于指令。
  • E(Else),它将cond得逆条件应用于指令.

Thumb 2条件块的限制

为了同时支持Thumb 2和ARM汇编语言,本文提出了一种新的汇编语言模式,称为统一汇编语言。Unified Syntax
对于纯ARM,IT的值为空。指令用条件编码。对于Thumb 2,它启动条件寄存器以设置条件位。ARM汇编器有三种模式:.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块”。在您的情况下,您使用 * thumb 2 * 特殊寄存器,因此 * 统一语法 * 对手头的任务没有太大意义。请参阅下面的注解。
在制作统一的IT块时,您应该注意一些规则。

  1. IT块不应设置条件代码,即cmpne指令。
    1.您不应该分支到IT区块。
    1.我们总是从IT开始,所以IT中的 cond 必须与第一条指令匹配。
    1.如果为'T',则下列指令必须匹配 cond,如果为'E',则必须匹配 !cond
    1.不应更改条件寄存器PSRcpsr等。请参见“注
    1.您只能混合相反的类型。例如,
movlo  r1, #-1
     moveq  r1, #0
     movhi  r1, #1

在ARM中可以工作,但 * Thumb 2 * 不行。在您的例子中,您违反了规则“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)

已拆卸ARM

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

已拆卸 * 拇指2 *,

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

对于 * thumb 2 *,这是没有ITE指令的等效值,

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

也就是说,设置条件代码的两步。当然,反汇编程序中的第二个数字是机器代码。对于 * thumb 2 * OS/调度程序,它将恢复条件寄存器,该寄存器恢复IT状态,您可以 enter 进入IT块的中间。也可以手动执行此操作(但是,它可能是高度CPU特定的,据我所知没有文档记录)。

**Thumb 2为6个字节,ARM代码为8个字节,以实现等效功能。**如果条件块中有“宽”(32位)操作码,则Thumb 2将需要更多的代码空间。
**注:**对于修改PSRCortex-M 调度程序代码,您需要使用分支。这些寄存器控制IT块的执行。您不应修改IT块中的PSR。这同样适用于任何上下文恢复指令;我不是100%熟悉Cortex-M模式切换,这涉及到更改活动的PSR

相关问题