Добрый день. Тут я начал разбираться детально с 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 - Mar 12 2012, 11:05