Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: О, чудо!
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
promelectronshchic
Добрый день. Тут я начал разбираться детально с 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. Что же это такое ? Может я чего-то не понимаю...
dimka76
Во-первых - в РС содержится адрес не текущей, а следующей команды.
А во-торых, у вас по адресу 0х00 ничего нет кроме метки. Да и все ORG закоментарованны,
следовательно весь ваш код смещен вверх на 4 байта.
и по адресу 0x1C не LDR PC, [PC,#24]; Branch to fiq_handler, а
DC32 ?cstartup

И загрузится адрес не PC+24, а значение, которое храниться в PC + 24.
Xenia
PC + #24 = PC + 0x18 = 0x08 + 0x18 = 0x20
А на 0x20 как раз и находится "DC32 ?cstartup"
http://www.keil.com/forum/16417/


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

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

Цитата
А во-торых, у вас по адресу 0х00 ничего нет кроме метки. Да и все ORG закоментарованны,
следовательно весь ваш код смещен вверх на 4 байта.


Я в отладчике смотрю:
__iar_program_start:
LDR PC, [PC,#24]; Absolute jump can reach 4 GByte

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

Спасибо ребята, понял. Трехступенчатый конвеер : выполнение-декодирование-извлечение. Следовательно декодирование PC+4, извлечение следующей команды pc+8.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.