我有以下ARM汇编代码.
CMP R0, #0
ITT EQ
MOVEQ R0, #0x7FFFFFFF
BXEQ LR
Run Code Online (Sandbox Code Playgroud)
首先,为什么MOV和BX指令后需要均衡器?所述ARM参考说,ITT后的状态(EQ)将被应用到在IT块中的第一指令(MOV),然后在ITT第二T的,因为均衡器将被应用到在所述第二指令(BX) IT块.因此,如果ITT正在应用EQ,为什么MOVEQ和BXEQ需要均衡器?
其次,为什么需要IT指令呢?为什么不只是:
CMP R0, #0
MOVEQ R0, #0x7FFFFFFF
BXEQ LR
Run Code Online (Sandbox Code Playgroud)
它是MOV而不是MOVS所以标志不会更新,BXEQ中的EQ仍将"引用"CMP设置的标志值.
old*_*mer 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
Run Code Online (Sandbox Code Playgroud)
第一次尝试
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
Run Code Online (Sandbox Code Playgroud)
这是显而易见的,因为在拇指模式下没有这些指令的条件版本.
叶子:
.cpu cortex-m3
.thumb
.syntax unified
CMP R0, #0
ITT EQ
MOVEQ R0, #0x7FFFFFFF
BXEQ LR
Run Code Online (Sandbox Code Playgroud)
工具很满意
0: 2800 cmp r0, #0
2: bf04 itt eq
4: f06f 4000 mvneq.w r0, #2147483648 ; 0x80000000
8: 4770 bxeq lr
Run Code Online (Sandbox Code Playgroud)
所以我们尝试没有eq
.cpu cortex-m3
.thumb
.syntax unified
CMP R0, #0
ITT EQ
MOV R0, #0x7FFFFFFF
BX LR
Run Code Online (Sandbox Code Playgroud)
不开心
vectors.s:8: Error: instruction not allowed in IT block -- `mov R0,#0x7FFFFFFF'
vectors.s:9: Error: incorrect condition in IT block -- `bx LR'
Run Code Online (Sandbox Code Playgroud)
我认为它必须只是一个语法的东西来帮助你,并确保你得到你真正想要的东西.
.cpu cortex-m3
.thumb
.syntax unified
CMP R0, #0
IT EQ
MOVEQ R0, #0x7FFFFFFF
BX LR
Run Code Online (Sandbox Code Playgroud)
给
0: 2800 cmp r0, #0
2: bf08 it eq
4: f06f 4000 mvneq.w r0, #2147483648 ; 0x80000000
8: 4770 bx lr
Run Code Online (Sandbox Code Playgroud)
请注意,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
Run Code Online (Sandbox Code Playgroud)
在这种情况下,使用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
Run Code Online (Sandbox Code Playgroud)
这是一种好奇心.
从指令集文档中可以明显看出它需要的原因.完整的臂指令在每条指令上都有一个4位的条件字段.拇指说明没有.起初你只是在条件上做了传统分支以避免指令,拇指没有提供每条指令的ARM特性是有条件的而不需要冲洗管道.因此,根据文档,他们使用ARMv7-M添加了If Then(IT)指令,并且正如这些文档中所述,这允许您在if之后使用最多四条指令成为条件.我相信上面的语法游戏(没有证据,除了它似乎是这样)是有助于人为错误.
现在,如果不是在拇指模式下,那么你绝对可以只将条件应用于指令
.syntax unified
CMP R0, #0
MOVSEQ R0, #0x7
BXEQ LR
movs r0,#7
mov r0,#7
Run Code Online (Sandbox Code Playgroud)
给
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
Run Code Online (Sandbox Code Playgroud)
也许这是你问题的根源,但是汇编程序很可能只是为你插入IT指令,但是汇编语言需要一对一(尽管所有处理器的所有伪指令都是所以我猜他们希望你明确地表明你想要If Then指令那里和/或你将要在那里有一个If Then指令.汇编程序也在帮助您说您需要使用IT块而不是简单地说它是无效的指令.
另一个实验
.cpu arm7t
.thumb
.syntax unified
CMP R0, #0
MOVSEQ R0, #0x7
BX LR
movs r0,#7
Run Code Online (Sandbox Code Playgroud)
很麻烦,因为如果你把IT留在那里它就知道这是错的:
vectors.s:7: Error: selected processor does not support Thumb mode `it EQ'
Run Code Online (Sandbox Code Playgroud)
但是,然后在同一口气中说
vectors.s:7: Error: thumb conditional instruction should be in IT block -- `movseq R0,#0x7'
Run Code Online (Sandbox Code Playgroud)
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指令是否正确,但不为它们生成任何代码.
您需要IT拇指模式下的指令,否则指令中条件位不可用。您的第一个示例很可能是拇指代码,而不是 ARM 模式。
为什么MOVEQ和BXEQ中需要EQ?
您可以在 IT 块中使用逆条件。我认为这样阅读也更容易。