Assembly IT点指示臂组件
我有下面的ARM组装代码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
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中,at
为正条件,aIT
block opcode0x2007
对应于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'