Arm 为什么重置被指定为start+;1立方英寸

Arm 为什么重置被指定为start+;1立方英寸,arm,microcontroller,cortex-m,microprocessors,cortex-m3,Arm,Microcontroller,Cortex M,Microprocessors,Cortex M3,我正在学习cortex m3的汇编语言,我不明白为什么重置为start+1,它应该是start,只知道什么时候应该从start开始执行重置,是否有特殊原因将sp指定为0x200 .thumb .syntax unified sp: .word 0x200 reset: .word start + 2 start: mov r0, #5 mov r1, #4 add r2, r0, r1 stop: b stop 这是一个以多种方式编写的小错

我正在学习cortex m3的汇编语言,我不明白为什么重置为start+1,它应该是start,只知道什么时候应该从start开始执行重置,是否有特殊原因将sp指定为0x200

    .thumb
    .syntax unified

sp: .word 0x200
reset:  .word start +  2

start:
    mov r0, #5
    mov r1, #4
    add r2, r0, r1

stop:   b stop

这是一个以多种方式编写的小错误。arm文档明确指出,向量是设置了lsbit的地址,因此可以认为加1,但使用1或加1更安全

cortex-m3如果/当您阅读它时,它是基于armv7-m的,并且在armv7-m文档中,您在进行任何类型的编程之前也应该拥有它,那么:

通电或复位时,处理器使用偏移量0处的条目作为SP_main的初始值。。。所有其他条目的位[0]必须设置为1

在异常条目上,若相关向量表条目的位[0]设置为0,则执行第一条指令会导致INVSTATE UsageFault

(是的,这意味着所有异常向量不只是重置)

让语言为您工作,您就不必对这些内容进行黑客攻击,工具将为您提供:

.thumb
.syntax unified

sp: .word 0x200
reset:  .word start

.thumb_func
start:
    mov r0, #5
    mov r1, #4
    add r2, r0, r1

stop:   b stop
一旦链接(在链接且链接器知道label是一个函数以便生成正确的值之前,无法填写表格)

节的反汇编。文本:
00000000 :
0:00000200安第克r0、r0、r0、lsl#4
00000004 :
4:00000009andeq r0,r0,r9
00000008 :
8:f04f 0005移动带r0,#5
c:f04f 0104移动带r1,#4
10:eb00 0201增补w r2、r0、r1
00000014 :
14:e7fe b.n 14

您可以看到向量表是正确的,并且会起作用,重置向量指向重置处理程序的起始点:ORRed with 1(0x00000008 | 1=0x00000009)

是否有必要为堆栈指针指定值0x200,或者我可以指定任何其他值。我假设它永远不会是0x200。您必须查看芯片的文档(arm不生产芯片,所以st、nxp、ti等等),它会告诉您ram的位置和数量,您可以从中进行选择,通常它从地址0x20000000开始,所以可能是0x20000000之类的值,或者您有多少内存。或者你可以做一些链接器的事情,为堆栈分配一块内存(除了YMMV,对我来说没什么意义)。0x200几乎总是闪存,所以不读/写sram,所以不能用作堆栈。我只是简单地剪切和粘贴了您的代码,并调整了一件事。说arm对地址空间有建议,这就是为什么0x00000000是闪存,sram通常在芯片供应商之间以0x20000000开始。
Disassembly of section .text:

00000000 <sp>:
   0:   00000200    andeq   r0, r0, r0, lsl #4

00000004 <reset>:
   4:   00000009    andeq   r0, r0, r9

00000008 <start>:
   8:   f04f 0005   mov.w   r0, #5
   c:   f04f 0104   mov.w   r1, #4
  10:   eb00 0201   add.w   r2, r0, r1

00000014 <stop>:
  14:   e7fe        b.n 14 <stop>