为什么reset在cortex m3中赋值为start + 1

Why the reset is assigned value of start + 1 in cortex m3

我正在学习cortex m3的汇编语言,我不明白为什么reset是start + 1,应该是start 只知道什么时候reset应该从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 的地址,因此可以考虑加一但与一进行或运算更安全。

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

On powerup or reset, the processor uses the entry at offset 0 as the initial value for SP_main, ... All other entries must have bit[0] set to 1

On exception entry, if bit[0] of the associated vector table entry is set to 0, execution of the first instruction causes an 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

一旦链接(table 无法填写,直到链接并且链接器知道标签是一个函数所以生成正确的值)。

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>

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