gpt4 book ai didi

assembly - IT指令点ARM汇编

转载 作者:行者123 更新时间:2023-12-04 01:36:29 25 4
gpt4 key购买 nike

我有以下 ARM 汇编代码。

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

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

其次,为什么需要 IT 指导?为什么不只是有:
CMP             R0, #0
MOVEQ R0, #0x7FFFFFFF
BXEQ LR

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

最佳答案

你为什么不试试呢?

.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

那是一种好奇心。

从指令集文档中可以明显看出需要它的原因。完整的 arm 指令在每条指令上都有一个 4 位条件字段。拇指指示没有。起初,您只是简单地在条件下进行传统分支以避免指令,拇指没有提供每条指令都是有条件的且不需要刷新管道的 ARM 功能。因此,根据文档,他们在 ARMv7-M 中添加了 If Then (IT) 指令,并且如这些文档中所述,这允许您在 if then 之后最多制作四个指令以成为有条件的。我相信上述语法游戏(除了看起来如此之外没有其他证据)可以帮助解决人为错误。

现在,如果不在拇指模式下,那么您绝对可以将条件应用于指令
.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 block 而不是简单地说它是无效指令来帮助您。

进一步的实验
.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'

关于assembly - IT指令点ARM汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20886563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com