下面为什么编:
ITE EQ MRSEQ R0, MSP MRSNE R0, PSP
但这不是:
ITT NE MRSNE R0, PSP MRSEQ R0, MSP
有没有可能,MRSNE R0,PSP和MRSEQ R0,MSP都执行(这是我的情况)?第一个它是ARM标准吗?
wmtdaxz31#
首先,你有一些概念问题。ITT是关于什么的?首先是历史。早期的ARM CPU不支持 Thumb(16位),或非 * Thumb 2 *(混合16/32位)编码。对于纯ARM,大部分(4个前导位)专用于条件执行。Thumb 指令集不支持条件执行。对于 * Thumb 2 *(您希望Cortex-M部件执行的操作),条件执行有一个变体。it指令在条件寄存器中设置8位,而不是在每条指令中编译一个条件。it指令提供比较测试(EQ、NE、LO等)。然后,它最多提供四条条件指令。根据Cortex-A程序员手册,
ITT
it
EQ
NE
LO
第A.1.34节
IT(If-then)最多由四条以下指令组成条件指令(称为IT块)。这些条件可以全部相同,也可以是其他条件的逻辑反转。IT是ARM状态下的伪指令。
IT
语法:IT{x{y{z}}} {cond}其中:cond 是条件代码。参见6.1.2节,该节指定了IT块中 first 指令的条件。
IT{x{y{z}}} {cond}
ITTET
为了同时支持Thumb 2和ARM汇编语言,本文提出了一种新的汇编语言模式,称为统一汇编语言。Unified Syntax对于纯ARM,IT的值为空。指令用条件编码。对于Thumb 2,它启动条件寄存器以设置条件位。ARM汇编器有三种模式:.arm、.thumb和.unified。还有.code 32和.code 16。根据使用的模式和特定的汇编程序(Gnu、ARM等),您将得到不同的警告和/或错误。但是,对于您的序列,此模式永远不会失败,
.arm
.thumb
.unified
.code 32
.code 16
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块时,您应该注意一些规则。
MRS
cmpne
PSR
cpsr
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指令的等效值,
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将需要更多的代码空间。**注:**对于修改PSR的 Cortex-M 调度程序代码,您需要使用分支。这些寄存器控制IT块的执行。您不应修改IT块中的PSR。这同样适用于任何上下文恢复指令;我不是100%熟悉Cortex-M模式切换,这涉及到更改活动的PSR。
1条答案
按热度按时间wmtdaxz31#
概述
但这不是:
首先,你有一些概念问题。
ITT
是关于什么的?首先是历史。早期的ARM CPU不支持 Thumb(16位),或非 * Thumb 2 *(混合16/32位)编码。对于纯ARM,大部分(4个前导位)专用于条件执行。Thumb 指令集不支持条件执行。对于 * Thumb 2 *(您希望Cortex-M部件执行的操作),条件执行有一个变体。it
指令在条件寄存器中设置8位,而不是在每条指令中编译一个条件。it
指令提供比较测试(EQ
、NE
、LO
等)。然后,它最多提供四条条件指令。根据Cortex-A程序员手册,文件
第A.1.34节
IT(If-then)最多由四条以下指令组成条件指令(称为
IT
块)。这些条件可以全部相同,也可以是其他条件的逻辑反转。IT
是ARM状态下的伪指令。语法:
IT{x{y{z}}} {cond}
其中:cond 是条件代码。参见6.1.2节,该节指定了IT块中 first 指令的条件。
IT
块中第二条,第三条与第四条指令得条件开关,例如ITTET
.条件开关可以是:Thumb 2条件块的限制
为了同时支持Thumb 2和ARM汇编语言,本文提出了一种新的汇编语言模式,称为统一汇编语言。Unified Syntax
对于纯ARM,
IT
的值为空。指令用条件编码。对于Thumb 2,它启动条件寄存器以设置条件位。ARM汇编器有三种模式:.arm
、.thumb
和.unified
。还有.code 32
和.code 16
。根据使用的模式和特定的汇编程序(Gnu、ARM等),您将得到不同的警告和/或错误。但是,对于您的序列,此模式永远不会失败,MRS
指令是“IT块”。在您的情况下,您使用 * thumb 2 * 特殊寄存器,因此 * 统一语法 * 对手头的任务没有太大意义。请参阅下面的注解。在制作统一的
IT
块时,您应该注意一些规则。IT
块不应设置条件代码,即cmpne
指令。1.您不应该分支到
IT
区块。1.我们总是从
IT
开始,所以IT
中的 cond 必须与第一条指令匹配。1.如果为'T',则下列指令必须匹配 cond,如果为'E',则必须匹配 !cond。
1.不应更改条件寄存器
PSR
、cpsr
等。请参见“注1.您只能混合相反的类型。例如,
在ARM中可以工作,但 * Thumb 2 * 不行。在您的例子中,您违反了规则“4”并得到一个错误。同样,ARM允许无条件指令与条件指令混合。但一般来说,当90-99%的情况在编译代码中是无条件执行时,拥有这些额外的操作码位是一个很高的代价。
正在检查操作码
示例:
已拆卸ARM,
已拆卸 * 拇指2 *,
对于 * thumb 2 *,这是没有
ITE
指令的等效值,也就是说,设置条件代码的两步。当然,反汇编程序中的第二个数字是机器代码。对于 * thumb 2 * OS/调度程序,它将恢复条件寄存器,该寄存器恢复
IT
状态,您可以 enter 进入IT
块的中间。也可以手动执行此操作(但是,它可能是高度CPU特定的,据我所知没有文档记录)。**Thumb 2为6个字节,ARM代码为8个字节,以实现等效功能。**如果条件块中有“宽”(32位)操作码,则Thumb 2将需要更多的代码空间。
**注:**对于修改
PSR
的 Cortex-M 调度程序代码,您需要使用分支。这些寄存器控制IT
块的执行。您不应修改IT
块中的PSR
。这同样适用于任何上下文恢复指令;我不是100%熟悉Cortex-M模式切换,这涉及到更改活动的PSR
。