微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CMPS 是有效的 ARM/THUMB 指令吗?

如何解决CMPS 是有效的 ARM/THUMB 指令吗?

我知道 CMP 指令更新条件标志。在我大学的一些材料中,我看到了 CMPS 指令。这对我来说似乎毫无意义,因为无论如何都设置了条件标志(我猜他们试图混淆我们......)。我想知道 CMPS 是否甚至是有效指令,即标准 ARM 汇编程序是否接受它?

我在网上找不到有关此类说明的任何信息。没有提到 here 并且 this 在线汇编器/仿真器也不接受它。

提前致谢

解决方法

您在各个方面都是对的,cmps 甚至都不是有效的说明。

,
.thumb
add r0,r1
and r0,r1
orr r0,r1
sub r0,r1
cmp r0,r1

组装和拆卸

arm-none-eabi-as so.s -o so.o
arm-none-eabi-objdump -d so.o

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <.text>:
   0:   1840        adds    r0,r0,r1
   2:   4008        ands    r0,r1
   4:   4308        orrs    r0,r1
   6:   1a40        subs    r0,r1
   8:   4288        cmp r0,r1

这很可能是人们认为存在 cmps 的原因。这不是一个糟糕的假设,cmp 确实改变了标志,并且对于拇指来说,标志的改变是隐含的(拇指不是拇指 2 扩展,它是可选的)。很明显使用这样的助记符意味着什么。但是您需要一个接受它的汇编程序:

.thumb
adds r0,r1
ands r0,r1
orrs r0,r1
subs r0,r1
cmps r0,r1

arm-none-eabi-as so.s -o so.o
so.s: Assembler messages:
so.s:3: Error: instruction not supported in Thumb16 mode -- `adds r0,r1'
so.s:4: Error: instruction not supported in Thumb16 mode -- `ands r0,r1'
so.s:5: Error: instruction not supported in Thumb16 mode -- `orrs r0,r1'
so.s:6: Error: instruction not supported in Thumb16 mode -- `subs r0,r1'
so.s:7: s suffix on comparison instruction is deprecated

这意味着有一次至少有一个汇编器有一个 s,这意味着它是 arm 汇编语言的有效助记符。

您需要仔细理解汇编语言和指令集之间的区别。许多指令集有许多不同的、不兼容的汇编语言。在 arm 为其目标创建的工具中,您将看到这一点。 x86 以几十年来不兼容的汇编语言而闻名(与 att 与 intel 排序无关,在每个 att 和 intel 中)相同的指令集。但是对于相同的 ARM 指令集,有许多不兼容的汇编语言,不像 x86 那样糟糕。正如上面使用非常流行的工具轻松演示的那样。它本身支持两种不兼容的汇编语言,用于手臂拇指。

.thumb
cmps r0,r1

组装和拆卸

arm-none-eabi-as so.s -o so.o
so.s: Assembler messages:
so.s:3: s suffix on comparison instruction is deprecated
arm-none-eabi-objdump -d so.o

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <.text>:
   0:   4288        cmp r0,r1

所以答案显然是肯定的,ARM/thumb 有一条 CMPS 指令。你的大学材料是正确的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。