Assembly IT点指示臂组件

Assembly IT点指示臂组件,assembly,arm,Assembly,Arm,我有下面的ARM组装代码 CMP R0, #0 ITT EQ MOVEQ R0, #0x7FFFFFFF BXEQ LR 首先,为什么在MOV和BX指令之后需要EQ?表示ITT后的条件(EQ)将应用于IT块中的第一条指令(MOV),然后由于ITT中的第二条T,EQ将应用于IT块中的第二条指令(BX)。那么,如果ITT正在应用EQ,为什么MOVEQ和BXEQ中需要EQ 第二,为什么需要IT指导?为什么不干脆: CMP

我有下面的ARM组装代码

CMP             R0, #0
ITT EQ
MOVEQ           R0, #0x7FFFFFFF
BXEQ            LR
首先,为什么在MOV和BX指令之后需要EQ?表示ITT后的条件(EQ)将应用于IT块中的第一条指令(MOV),然后由于ITT中的第二条T,EQ将应用于IT块中的第二条指令(BX)。那么,如果ITT正在应用EQ,为什么MOVEQ和BXEQ中需要EQ

第二,为什么需要IT指导?为什么不干脆:

CMP             R0, #0
MOVEQ           R0, #0x7FFFFFFF
BXEQ            LR

它是MOV而不是MOV,因此不会更新标志,BXEQ中的EQ仍将“引用”CMP设置的标志值。

您需要thumb模式下的
It
指令,否则指令中的条件位不可用。您的第一个示例很可能是thumb代码,而不是ARM模式

为什么MOVEQ和BXEQ中需要EQ


可以在IT块中使用反向条件。我认为这样读起来也更容易。

你为什么不试试呢

.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
给予

请注意,bx lr是同一条指令0x4770,端上的eq或端上的not显然是一种汇编程序语法,可以帮助您解决问题,并确保获得与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
给予

令人烦恼的是,如果你把它放在那里,它就会知道那是错误的:

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'

ARM体系结构参考(A4.2.1“条件说明”)的ARMv7-A和ARMv7-M版本说明如下:

尽管其他Thumb指令是无条件的,但所有指令 由IT指令设置条件的,必须使用 条件。这些条件必须与 IT指令。例如,ITTE EQ指令强制使用EQ 根据以下前两条说明进行调节,然后 下两个条件。必须编写这四条指令 分别使用EQ、EQ、NE和NE条件

我同意dwelch的观点,它可能是以这种方式指定的,以帮助减少编程错误,因为条件代码没有编码在机器操作码中

此外,为了“统一汇编语言”(其中相同的汇编助记符可用于32位ARM或Thumb模式),在ARM模式下则相反。检查
IT
指令是否与随后的条件指令一致,即使没有为
IT
指令生成机器操作码:

为了在ARM和Thumb指令集之间实现UAL汇编语言的最大可移植性,ARM建议:

  • IT指令以Thumb指令集的正确方式写在条件指令之前

  • 当汇编到ARM指令集时,汇编程序会检查所有IT指令是否正确,但不会为它们生成任何代码


有不同的ARM体系结构,条件代码对它们的作用也不同。请澄清您所指的体系结构。它来自iOS,因此ARMV7可能与前导的
It
重复的是manditory。然后我们有可选的
t
e
条件。在Thumb2中,a
t
为正条件,a为正条件de>e是否定的。对于纯ARM,这一点被忽略。关键是您可以编写(一个很好的搜索短语)。我使用的是gnu汇编程序,您的链接指向ARM汇编程序的特定部分,因此语法可以/将有所不同(为什么gnu as会这样做?),在本例中,gas对您的代码序列没有问题。如果您在arm引用中花多一点时间,您会发现这些指令没有条件,并找到了IT指令的定义。答案的细节很好。我不确定我是否理解您的“令人烦恼的好奇”的意思-在
IT
block opcode
0x2007
对应于
MOV
而不是
MOVS
指令。或者这就是点吗?如果要使用逆运算,则在IT指令中使用E而不是T
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
.cpu arm7t
.thumb
.syntax unified

    CMP             R0, #0
    MOVSEQ           R0, #0x7
    BX            LR

    movs r0,#7
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'