CMPS 是有效的 ARM/THUMB 指令吗?
Is CMPS a valid ARM/THUMB instruction?
我知道 CMP
指令更新条件标志。在我大学的一些 material 中,我看到了一条 CMPS
指令。对我来说这似乎毫无意义,因为无论如何都设置了条件标志(我猜他们试图混淆我们......)。我想知道 CMPS
是否甚至是有效指令,即标准 ARM 汇编器是否接受它?
我在网上找不到关于此类说明的任何信息。没提到here and this网上assembler/emulator也不接受
提前致谢
你说的都对,cmps
连指导都算不上
.thumb
add r0,r1
and r0,r1
orr r0,r1
sub r0,r1
cmp r0,r1
assemble 和 disassemble
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, r0, r1
8: 4288 cmp r0, r1
这可能就是人们会假设存在 cmps 的原因。这是一个不错的假设, cmp 确实会更改标志,并且对于 thumb 来说,标志的更改是隐含的(thumb 不是 thumb2 扩展,它是可选的)。很明显使用这样的助记符意味着什么。但是你需要一个接受它的 assembler:
.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 至少代表一个 assembler,这意味着它是 arm 汇编语言的有效助记符。
您需要仔细理解汇编语言和指令集之间的区别。许多指令集有许多不同的、不兼容的汇编语言。在 arm 为其目标创建的工具中,您将看到这一点。 x86 因同一指令集的数十年不兼容汇编语言(与 att 与 intel 排序无关,在每个 att 和 intel 内)而众所周知。但是,对于相同的 ARM 指令集,有许多不兼容的汇编语言(并不像 x86 那样糟糕)。正如上面使用非常流行的工具轻松演示的那样。对于手臂拇指,它本身支持两种不兼容的汇编语言。
.thumb
cmps r0,r1
assemble 和 disassemble
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指令。你的大学材料是正确的。
我知道 CMP
指令更新条件标志。在我大学的一些 material 中,我看到了一条 CMPS
指令。对我来说这似乎毫无意义,因为无论如何都设置了条件标志(我猜他们试图混淆我们......)。我想知道 CMPS
是否甚至是有效指令,即标准 ARM 汇编器是否接受它?
我在网上找不到关于此类说明的任何信息。没提到here and this网上assembler/emulator也不接受
提前致谢
你说的都对,cmps
连指导都算不上
.thumb
add r0,r1
and r0,r1
orr r0,r1
sub r0,r1
cmp r0,r1
assemble 和 disassemble
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, r0, r1
8: 4288 cmp r0, r1
这可能就是人们会假设存在 cmps 的原因。这是一个不错的假设, cmp 确实会更改标志,并且对于 thumb 来说,标志的更改是隐含的(thumb 不是 thumb2 扩展,它是可选的)。很明显使用这样的助记符意味着什么。但是你需要一个接受它的 assembler:
.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 至少代表一个 assembler,这意味着它是 arm 汇编语言的有效助记符。
您需要仔细理解汇编语言和指令集之间的区别。许多指令集有许多不同的、不兼容的汇编语言。在 arm 为其目标创建的工具中,您将看到这一点。 x86 因同一指令集的数十年不兼容汇编语言(与 att 与 intel 排序无关,在每个 att 和 intel 内)而众所周知。但是,对于相同的 ARM 指令集,有许多不兼容的汇编语言(并不像 x86 那样糟糕)。正如上面使用非常流行的工具轻松演示的那样。对于手臂拇指,它本身支持两种不兼容的汇编语言。
.thumb
cmps r0,r1
assemble 和 disassemble
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指令。你的大学材料是正确的。