我已获得以下ARM汇编代码。
CMP R0, #0
ITT EQ
MOVEQ R0, #0x7FFFFFFF
BXEQ LR
首先,为什么MOV和BX指令后需要均衡器? ARM reference表示ITT之后的条件(EQ)将应用于IT块中的第一条指令(MOV),然后由于ITT中的第二条T,EQ将应用于第二条指令(BX) )在IT区块。因此,如果ITT正在应用EQ,为什么MOVEQ和BXEQ需要EQ?
其次,为什么需要IT指令呢?为什么不只是:
CMP R0, #0
MOVEQ R0, #0x7FFFFFFF
BXEQ LR
它的MOV不是MOVS所以标志不会被更新,而BXEQ中的EQ仍将是"引用"至CMP设定的标志值。
答案 0 :(得分:13)
为什么不试试呢?
.cpu cortex-m3
.thumb
.syntax unified
CMP R0, #0
ITT EQ
MOVEQ R0, #0x7FFFFFFF
BXEQ LR
CMP R0, #0
MOVEQ R0, #0x7FFFFFFF
BXEQ LR
首先尝试
arm-none-eabi-as vectors.s -o vectors.o
vectors.s: Assembler messages:
vectors.s:13: Error: thumb conditional instruction should be in IT block -- `moveq R0,#0x7FFFFFFF'
vectors.s:14: Error: thumb conditional instruction should be in IT block -- `bxeq LR'
make: *** [vectors.o] Error 1
这是显而易见的,因为在拇指模式下没有这些指令的条件版本。
所以离开:
.cpu cortex-m3
.thumb
.syntax unified
CMP R0, #0
ITT EQ
MOVEQ R0, #0x7FFFFFFF
BXEQ LR
工具很满意
0: 2800 cmp r0, #0
2: bf04 itt eq
4: f06f 4000 mvneq.w r0, #2147483648 ; 0x80000000
8: 4770 bxeq lr
所以我们尝试没有eq
.cpu cortex-m3
.thumb
.syntax unified
CMP R0, #0
ITT EQ
MOV R0, #0x7FFFFFFF
BX LR
不开心
vectors.s:8: Error: instruction not allowed in IT block -- `mov R0,#0x7FFFFFFF'
vectors.s:9: Error: incorrect condition in IT block -- `bx LR'
我认为它必须只是一种语法来帮助你,并确保你得到你真正想要的东西。
.cpu cortex-m3
.thumb
.syntax unified
CMP R0, #0
IT EQ
MOVEQ R0, #0x7FFFFFFF
BX LR
给出
0: 2800 cmp r0, #0
2: bf08 it eq
4: f06f 4000 mvneq.w r0, #2147483648 ; 0x80000000
8: 4770 bx lr
注意bx lr是相同的指令0x4770,结尾处的eq或者结尾处的eq似乎清楚地作为汇编语法来帮助你并确保你获得与If Then相关的正确数量的指令指令。 (你可以看到在一个条件指令和两个条件指令之间发生了变化)。
我觉得很麻烦
.cpu cortex-m3
.thumb
.syntax unified
CMP R0, #0
IT EQ
MOVSEQ R0, #0x7
BX LR
movs r0,#7
mov r0,#7
movs.w r0,#7
在这种情况下,使用了thumb2扩展
00000000 <.text>:
0: 2800 cmp r0, #0
2: bf08 it eq
4: f05f 0007 movseq.w r0, #7
8: 4770 bx lr
a: 2007 movs r0, #7
c: f04f 0007 mov.w r0, #7
10: f05f 0007 movs.w r0, #7
这是一种好奇心。
从指令集文档中可以明显看出它的原因。完整的臂指令在每条指令上都有一个4位的条件字段。拇指说明没有。起初你只是在条件上做了传统分支以避免指令,拇指没有提供每条指令的ARM特性是有条件的而不需要冲洗管道。因此,根据文档,他们使用ARMv7-M添加了If Then(IT)指令,并且正如这些文档中所述,这允许您在if之后使用最多四条指令成为条件。我相信上面的语法游戏(没有证据,除了它似乎是这样)是有助于人为错误。
现在,如果不是在拇指模式下,那么你绝对可以将条件应用于指令
.syntax unified
CMP R0, #0
MOVSEQ R0, #0x7
BXEQ LR
movs r0,#7
mov r0,#7
给出
00000000 <.text>:
0: e3500000 cmp r0, #0
4: 03b00007 movseq r0, #7
8: 012fff1e bxeq lr
c: e3b00007 movs r0, #7
10: e3a00007 mov r0, #7
也许这是你问题的根源,但是汇编程序很可能只是为你插入IT指令,但是汇编语言有一对一的愿望(尽管所有的伪指令都是在那里的处理器)所以我猜他们希望你明确地表明你想要If Then指令那里和/或你将在那里有一个If Then指令。汇编程序也在帮助您说您需要使用IT块而不是简单地说它是无效的指令。
进一步的实验
.cpu arm7t
.thumb
.syntax unified
CMP R0, #0
MOVSEQ R0, #0x7
BX LR
movs r0,#7
令人烦恼,因为如果你把IT留在那里它就知道这是错误的:
vectors.s:7: Error: selected processor does not support Thumb mode `it EQ'
然后在同一口气中说
vectors.s:7: Error: thumb conditional instruction should be in IT block -- `movseq R0,#0x7'
答案 1 :(得分:9)
ARM体系结构参考的ARMv7-A和ARMv7-M版本(A4.2.1“条件指令”)说:
虽然其他Thumb指令是无条件的,但所有指令都是如此 由IT指令制定的条件必须用 条件。这些条件必须符合条件规定的条件 IT指导。例如,ITTEE EQ指令强制执行EQ 前两条指令的条件和NE 在接下来的两个条件。必须写下这四条指令 分别具有EQ,EQ,NE和NE条件。
我同意dwelch,它可能以这种方式指定以帮助减少编程错误,因为条件代码未在机器操作码中编码。
此外,出于“统一汇编语言”的目的(其中相同的汇编助记符可用于32位ARM或Thumb模式),相反的操作在ARM模式下完成。即使没有为IT
指令生成机器操作码,也会检查IT
指令是否与后面的条件指令保持一致:
为了在ARM和Thumb指令集之间实现UAL汇编语言的最大可移植性,ARM建议:
IT指令是在条件指令之前以Thumb指令集的正确方式编写的。
汇编到ARM指令集时,汇编程序会检查所有IT指令是否正确,但不为它们生成任何代码。
答案 2 :(得分:2)
您需要在拇指模式下执行IT
指令,否则条件位在指令中不可用。你的第一个例子很可能是拇指代码,而不是ARM模式。
为什么MOVEQ和BXEQ需要均衡器?
您可以在IT块中使用反向条件。我认为用这种方式阅读起来也更容易。