Перейти к содержанию
    

О, чудо!

Добрый день. Тут я начал разбираться детально с ARM7TDMI и у меня возник один вопрос...

Имеется SAM7X256, есть асемблерный startUp, который начинается вот так:

 

__iar_init$$done; The interrupt vector is not needed
                    ; until after copy initialization is done
; ORG     0x00
__iar_program_start:
    LDR    PC, [PC,#24]; Absolute jump can reach 4 GByte
; ORG     0x04       
    LDR     PC, [PC,#24]; Branch to undef_handler
; ORG     0x08
    LDR     PC, [PC,#24]; Branch to swi_handler
; ORG     0x0C    
    LDR     PC, [PC,#24]; Branch to prefetch_handler
; ORG     0x10
    LDR     PC, [PC,#24]; Branch to data_handler
; ORG     0x14
    DC32    0; Reserved
; ORG     0x18    
    LDR        PC, [PC,#24]; Branch to irq_handler
; ORG     0x1C    
    LDR        PC, [PC,#24]; Branch to fiq_handler

; ORG     0x20
    DC32    ?cstartup
; ORG     0x24    
    DC32    OS_CPU_ARM_ExceptUndefInstrHndlr
; ORG     0x28    
    DC32    OS_CPU_ARM_ExceptSwiHndlr
; ORG     0x2C    
    DC32    OS_CPU_ARM_ExceptPrefetchAbortHndlr
; ORG     0x30    
    DC32    OS_CPU_ARM_ExceptDataAbortHndlr
; ORG     0x34
    DC32    0
; ORG     0x38    
    DC32    OS_CPU_ARM_ExceptIrqHndlr
; ORG     0x3C    
    DC32    OS_CPU_ARM_ExceptFiqHndlr

 

После сброса в счетчике команда загрузиться команда, которая находится по нулевому адресу, вот эта:

  LDR        PC, [PC,#24]

Она означает, что в счетчик команд загр. команда по адресу = текущий PC + смещение (24). Выходит адрес = 0 + 24 = 24; В hex это 0x18.

Если посмотреть высшее на код, то выполниться комманда по адресу 0x18 и перейдем у функц. Branch to irq_handler, а не загрузиться DC32 ?cstartup. Хотя в железе переходит на метку cstartup. Что же это такое ? Может я чего-то не понимаю...

Изменено пользователем promelectronshchic

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых - в РС содержится адрес не текущей, а следующей команды.

А во-торых, у вас по адресу 0х00 ничего нет кроме метки. Да и все ORG закоментарованны,

следовательно весь ваш код смещен вверх на 4 байта.

и по адресу 0x1C не LDR PC, [PC,#24]; Branch to fiq_handler, а

DC32 ?cstartup

 

И загрузится адрес не PC+24, а значение, которое храниться в PC + 24.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PC + #24 = PC + 0x18 = 0x08 + 0x18 = 0x20

А на 0x20 как раз и находится "DC32 ?cstartup"

http://www.keil.com/forum/16417/

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это чудо от не знания архитектуры вашего процессора, конкретнее - читайте про трехступенчатый конвейер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это чудо от не знания архитектуры вашего процессора, конкретнее - читайте про трехступенчатый конвейер.

Согласен, но не согласен со следующим:

 

А во-торых, у вас по адресу 0х00 ничего нет кроме метки. Да и все ORG закоментарованны,

следовательно весь ваш код смещен вверх на 4 байта.

 

Я в отладчике смотрю:

__iar_program_start:

LDR PC, [PC,#24]; Absolute jump can reach 4 GByte

 

Инструкция LDR... размещена по 0 - му адресу, а вверху пустое место и метки не считаются!

 

Спасибо ребята, понял. Трехступенчатый конвеер : выполнение-декодирование-извлечение. Следовательно декодирование PC+4, извлечение следующей команды pc+8.

 

Изменено пользователем promelectronshchic

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...