promelectronshchic 0 12 марта, 2012 Опубликовано 12 марта, 2012 (изменено) · Жалоба Добрый день. Тут я начал разбираться детально с 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. Что же это такое ? Может я чего-то не понимаю... Изменено 12 марта, 2012 пользователем promelectronshchic Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 12 марта, 2012 Опубликовано 12 марта, 2012 · Жалоба Во-первых - в РС содержится адрес не текущей, а следующей команды. А во-торых, у вас по адресу 0х00 ничего нет кроме метки. Да и все ORG закоментарованны, следовательно весь ваш код смещен вверх на 4 байта. и по адресу 0x1C не LDR PC, [PC,#24]; Branch to fiq_handler, а DC32 ?cstartup И загрузится адрес не PC+24, а значение, которое храниться в PC + 24. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 12 марта, 2012 Опубликовано 12 марта, 2012 · Жалоба PC + #24 = PC + 0x18 = 0x08 + 0x18 = 0x20 А на 0x20 как раз и находится "DC32 ?cstartup" http://www.keil.com/forum/16417/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sparcmaster 0 12 марта, 2012 Опубликовано 12 марта, 2012 · Жалоба Это чудо от не знания архитектуры вашего процессора, конкретнее - читайте про трехступенчатый конвейер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
promelectronshchic 0 12 марта, 2012 Опубликовано 12 марта, 2012 (изменено) · Жалоба Это чудо от не знания архитектуры вашего процессора, конкретнее - читайте про трехступенчатый конвейер. Согласен, но не согласен со следующим: А во-торых, у вас по адресу 0х00 ничего нет кроме метки. Да и все ORG закоментарованны, следовательно весь ваш код смещен вверх на 4 байта. Я в отладчике смотрю: __iar_program_start: LDR PC, [PC,#24]; Absolute jump can reach 4 GByte Инструкция LDR... размещена по 0 - му адресу, а вверху пустое место и метки не считаются! Спасибо ребята, понял. Трехступенчатый конвеер : выполнение-декодирование-извлечение. Следовательно декодирование PC+4, извлечение следующей команды pc+8. Изменено 12 марта, 2012 пользователем promelectronshchic Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться