我有下面的ARM汇编代码。
CMP R0, #0
ITT EQ
MOVEQ R0, #0x7FFFFFFF
BXEQ LR首先,为什么在MOV和BX指令之后需要EQ?ARM reference表示,ITT之后的条件( EQ )将应用于IT块中的第一条指令(MOV),然后由于ITT中的第二个T,EQ将应用于IT块中的第二条指令(BX)。那么,如果ITT正在应用EQ,为什么MOVEQ和BXEQ中需要EQ?
第二,为甚麽要有资讯科技教学呢?为什么不直接拥有:
CMP R0, #0
MOVEQ R0, #0x7FFFFFFF
BXEQ LR它是MOV,而不是MOV,因此标志不会更新,BXEQ中的EQ仍将“引用”由CMP设置的标志值。
发布于 2014-01-03 02:54:24
你为什么不试一下呢?
.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这是显而易见的,因为在thumb模式下没有这些指令的条件版本。
所以剩下的就是:
.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在末尾或不在末尾看起来显然是汇编语法的东西,以帮助你,并确保你得到正确数量的指令绑定到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这是一种好奇心。
从指令集文档中可以明显看出需要它的原因。完全扩展的arm指令在每个指令上都有一个4位的条件字段。thumb指令不需要。一开始,你只是简单地做了传统的条件分支来避免指令,thumb没有提供每条指令都是有条件的ARM功能,也不需要刷新管道。因此,根据文档,他们使用ARMv7-M添加了If Then (IT)指令,并且如那些文档中所述,这允许您在if then之后最多生成四条指令,以成为条件指令。我认为上面的语法游戏(除了看起来是这样之外,没有其他证据)是为了帮助解决人为错误。
现在,如果不是在thumb模式下,那么您完全可以将条件应用于指令
.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'发布于 2014-01-03 16:24:32
ARM架构参考(A4.2.1“条件说明)的ARMv7-A和ARMv7-M版本说明如下:
虽然其他Thumb指令是无条件的,但IT指令使其具有条件的所有指令都必须写入一个条件。这些条件必须与IT说明书规定的条件相匹配。例如,EQ指令将EQ条件施加在前两个后续指令上,并将NE条件施加在下两个指令上。这四条指令必须分别使用EQ、EQ、NE和NE条件编写。
我同意dwelch的观点,它可能是以这种方式指定的,以帮助减少编程错误,因为条件代码不是在机器操作码中编码的。
此外,对于“统一汇编语言”(32位ARM或Thumb模式都可以使用相同的汇编助记符)而言,在ARM模式中则相反。即使没有为IT指令生成机器操作码,也会检查IT指令与后面的条件指令的一致性:
为了最大限度地提高ARM和Thumb指令集之间的汇编语言的可移植性,ARM建议:
对于Thumb指令集,
发布于 2014-01-03 00:49:42
您需要在拇指模式下使用IT指令,否则条件位在指令中不可用。您的第一个示例很可能是拇指代码,而不是ARM模式。
为什么MOVEQ和BXEQ需要EQ?
您可以在IT块中使用相反的条件。我认为这样读起来也更容易。
https://stackoverflow.com/questions/20886563
复制相似问题