Почему сбросу присваивается значение start + 1 в cortex m3 - PullRequest
1 голос
/ 04 августа 2020

Я изучаю ассемблер cortex m3, я не понимаю, почему сброс равен start + 1, он должен быть запущен, только знаю, когда сброс должен выполняться с самого начала, и есть ли какая-то особая причина, по которой 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

1 Ответ

1 голос
/ 04 августа 2020

Это небольшая ошибка, написанная более чем одним способом. В документации на руку четко указано, что векторы - это адрес с установленным lsbit, поэтому можно думать плюс один, но безопаснее ИЛИ с одним.

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

После связывания (таблица не может быть заполнена до тех пор, пока не будет связана, и компоновщик знает, что метка является функцией, поэтому генерирует правильное значение) .

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>

И вы можете видеть, что таблица векторов правильна и будет работать, вектор сброса указывает на начало обработчика сброса: ORRed с 1 (0x00000008 | 1 = 0x00000009)

...