Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么拇指指令是;mov r0,“0”;不允许?_Assembly_Arm_Thumb - Fatal编程技术网

Assembly 为什么拇指指令是;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的不同指

我试图找出一些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的不同指令集。从技术上讲,目前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