Assembly 为什么拇指指令是;mov r0,“0”;不允许?
我试图找出一些STM32微控制器的ARM组件。当我试图汇编指令mov r0,#0时,我得到:Assembly 为什么拇指指令是;mov r0,“0”;不允许?,assembly,arm,thumb,Assembly,Arm,Thumb,我试图找出一些STM32微控制器的ARM组件。当我试图汇编指令mov r0,#0时,我得到: core.S:27: Error: cannot honor width suffix -- `mov r0,#0' 然而,当我使用movsr0、#0时,它就起作用了,它说“s”只影响是否更新条件标志 我在添加r0,r0,#1与添加r0,r0,#1之间存在类似的问题 有人能解释一下为什么mov有效而mov无效吗?因此,目前在STM32世界中,您有四种基于armv6m、armv7m和armv8m的不同指
core.S:27: Error: cannot honor width suffix -- `mov r0,#0'
然而,当我使用movsr0、#0
时,它就起作用了,它说“s”只影响是否更新条件标志
我在添加r0,r0,#1
与添加r0,r0,#1
之间存在类似的问题
有人能解释一下为什么
mov
有效而mov
无效吗?因此,目前在STM32世界中,您有四种基于armv6m、armv7m和armv8m的不同指令集。从技术上讲,目前armv8m基线与armv6m匹配,而armv8m主线扩展与armv7m匹配
因此,理论上,armv6m指令集此时适用于所有cortex ms,它使用传统的all thumb变体(回到armv4t的thumb指令集)add和mov
.cpu arm7tdmi
.thumb
.syntax unified
mov r1,#1
movs r1,#1
so.s: Assembler messages:
so.s:4: Error: cannot honor width suffix -- `mov r1,#1'
.cpu arm7tdmi
.thumb
.syntax unified
movs r1,#1
movs r1,#1
Disassembly of section .text:
00000000 <.text>:
0: 2101 movs r1, #1
2: 2101 movs r1, #1
.cpu cortex-m0
.thumb
.syntax unified
mov r1,#1
movs r1,#1
so.s: Assembler messages:
so.s:4: Error: cannot honor width suffix -- `mov r1,#1'
.cpu cortex-m3
.thumb
.syntax unified
mov r1,#1
movs r1,#1
Disassembly of section .text:
00000000 <.text>:
0: f04f 0101 mov.w r1, #1
4: 2101 movs r1, #1
所以你也不能在那里使用它
.cpu cortex-m3
.thumb
.syntax unified
itt ne
movne r1,#1
movsne r1,#2
mov r1,#3
Disassembly of section .text:
00000000 <.text>:
0: bf1c itt ne
2: 2101 movne r1, #1
4: f05f 0102 movsne.w r1, #2
8: f04f 0103 mov.w r1, #3
最后但并非最不重要的一点是,汇编语言(语法)是特定于工具(汇编程序)而不是目标(arm/thumb)的。所以以上所有内容都是gnu汇编程序,用于支持各种风格的thumb指令集的许多版本。您可以查看armasm(来自ARM而非GNU的工具),也可以查看其他工具,它们的规则可能会有所不同。因此,在armasm中,它很可能是正确的语法,如最后的示例中所示的mov r1
.arch armv5t
.thumb
mov r1,#3
movs r1,#3
add r1,r2,r3
Disassembly of section .text:
00000000 <.text>:
0: 2103 movs r1, #3
2: 2103 movs r1, #3
4: 18d1 adds r1, r2, r3
.arch armv5t
拇指
第1节,第3节
movs r1,#3
加上r1,r2,r3
第节的分解。正文:
00000000 :
0:2103 movs r1,#3
2:2103 movs r1,#3
4:18d1加上r1、r2、r3
表示。(还要注意,反汇编人员和汇编人员也不同意,我没有一个来自统一语法之前时代的binutils来查看它显示了什么)
ARM的文档将不是特定于任何工具,因为架构的作者不同于工具的创建者/维护者。或者,他们可能会试图相处融洽,让架构(architecture)文档与他们的内部工具相匹配。但这并不意味着gnu必须遵守,令人遗憾的是,gnu汇编程序的端口目标似乎有一个不完全支持处理器供应商语法的习惯,这通常是一个痛苦或恼人的转折
(如何阅读该ARM ARM,您可以使用s选项,因为它显示了与ARM等效的选项,使用s选项时,文档中定义的语法没有显示这一点,因此根据汇编程序作者的不同,他们必须选择一个或组成一些语法)。查看指令集没有mov,只有基本thumb指令集的mov。thumb2扩展可能有一个没有s的mov。在尝试使用汇编语言之前,请获取并阅读指令集文档。arm的文档比大多数.thumb16 MOV都好,除非在it区块内查看您的链接,其中显示“以下形式的指令在Thumb代码中可用”。您的mcu可能非常支持armv7-m thumb2扩展,但您尚未告知汇编程序。
.cpu cortex-m3
.thumb
.syntax unified
itt ne
movne r1,#1
movsne r1,#2
mov r1,#3
Disassembly of section .text:
00000000 <.text>:
0: bf1c itt ne
2: 2101 movne r1, #1
4: f05f 0102 movsne.w r1, #2
8: f04f 0103 mov.w r1, #3
.arch armv5t
.thumb
mov r1,#3
movs r1,#3
add r1,r2,r3
adds r1,r2,r3
so.s: Assembler messages:
so.s:6: Error: instruction not supported in Thumb16 mode -- `adds r1,r2,r3'
.arch armv5t
.thumb
.syntax unified
mov r1,#3
movs r1,#3
add r1,r2,r3
adds r1,r2,r3
so.s: Assembler messages:
so.s:4: Error: cannot honor width suffix -- `mov r1,#3'
so.s:6: Error: cannot honor width suffix -- `add r1,r2,r3'
.arch armv5t
.thumb
mov r1,#3
movs r1,#3
add r1,r2,r3
Disassembly of section .text:
00000000 <.text>:
0: 2103 movs r1, #3
2: 2103 movs r1, #3
4: 18d1 adds r1, r2, r3