SergeyVas 0 14 января, 2009 Опубликовано 14 января, 2009 · Жалоба Объясните как работает этот кот, с ассемблером плохо знаком, сейчас читаю, но не совсем все понятно. А именно инструкция ldr записывает значение находящееся по адресу RESET_ADDR , в регистр pc, переменная RESET_ADDR не где не объявляется так же как и pc ? код взят отсюда : http://electronix.ru/forum/index.php?act=a...st&id=16569 ldr pc, RESET_ADDR ldr pc, UNDEF_ADDR ldr pc, SWI_ADDR ldr pc, PREFETCH_ABORT_ADDR ldr pc, DATA_ABORT_ADDR .word 0 ldr pc, IRQ_ADDR ldr pc, FIQ_ADDR RESET_ADDR: .word RESET_handler UNDEF_ADDR: .word UNDEF_handler SWI_ADDR: .word SWI_handler PREFETCH_ABORT_ADDR: .word PREFETCH_ABORT_handler DATA_ABORT_ADDR: .word DATA_ABORT_handler .word 0 IRQ_ADDR: .word IRQ_handler FIQ_ADDR: .word FIQ_handler Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 14 января, 2009 Опубликовано 14 января, 2009 · Жалоба RESET_ADDR - это метка, зачем ее объявлять еще? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
msalov 0 14 января, 2009 Опубликовано 14 января, 2009 · Жалоба Предположу что это тааблица векторов прерываний :) и что куда загружается думаю понять не сложно из имён ссылок и регистра Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 14 января, 2009 Опубликовано 14 января, 2009 · Жалоба В один регистр PC, по очереди запишутся адреса меток, или pc это счетчик и при каждой последующей записи он инкриминируется ? Еще простой вопрос, что означает .word 0 ? Где можно прочитать по ассемблеру для арм, здесь есть, но не подробно http://www.gaw.ru/html.cgi/txt/doc/micros/..._arm/survey.htm ldr pc, RESET_ADDR ldr pc, UNDEF_ADDR ldr pc, SWI_ADDR ldr pc, PREFETCH_ABORT_ADDR ldr pc, DATA_ABORT_ADDR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 14 января, 2009 Опубликовано 14 января, 2009 · Жалоба В один регистр PC, по очереди запишутся адреса меток.... :( да уж.... а что такое у нас PC? И что произойдет после первой-же в него записи? У Вас проблемы не с ASM а много более глубокие :( Где можно прочитать по ассемблеру для арм, Базовые понятия на http://arm.com Нюансы - в документации на конкретный ассемблер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 14 января, 2009 Опубликовано 14 января, 2009 · Жалоба В один регистр PC, по очереди запишутся адреса меток, или pc это счетчик и при каждой последующей записи он инкриминируется ? В регистр PC (Program Counter) пишется один раз, после чего процессор уходит на исполнение программы по записанному в PC адресу. Как уже писали, это таблица векторов исключений. Еще простой вопрос, что означает .word 0 ? Где можно прочитать по ассемблеру для арм .word резервирует в памяти 32-х битное слово, надо полагать. Особенности синтаксиса ассемблера в вашей среде лучше всего описаны в ее документации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 14 января, 2009 Опубликовано 14 января, 2009 (изменено) · Жалоба :( да уж.... а что такое у нас PC? И что произойдет после первой-же в него записи? У Вас проблемы не с ASM а много более глубокие :( Базовые понятия на http://arm.com Нюансы - в документации на конкретный ассемблер. Да это верно, проблема гораздо глубже чем думал, не пойму как работает директива "Align 4" :) нашел такой текст прочел : не совсем понятно как выравнивается, к примеру если в pc 0x000000ff после align 4 какое значение там будет? http://www.lib.kiev.ua/books/7/40n42.html вот отрывок где эта директива используется: .align 4 UNDEF_string: .asciz "\r\nUNDEFINED INSTRUCTION Exception!!!" .align 4 SWI_string: .asciz "\r\nSWI Exception!!!" .align 4 PREFETCH_ABORT_string: .asciz "\r\nPREFETCH ABORT Exception!!!" .align 4 DATA_ABORT_string: .asciz "\r\nDATA ABORT Exception!!!\r\n" .align 4 STOPPED_string: .asciz "\r\nStopped!!!" .align 4 eclipse + yagarto Изменено 14 января, 2009 пользователем sergey sva Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 14 января, 2009 Опубликовано 14 января, 2009 · Жалоба не совсем понятно как выравнивается, к примеру если в pc 0x000000ff после align 4 какое значение там будет? 0x000000ff, ибо align к PC ну никак не относится. Это просто указание ассемблеру, что следующий после align обект будет иметь соответствующее выравнивание. ldr r0, [r0] DCB "ab" ALIGN 4 ldr r0, [r0] 0x0000006c: e5900000 .... LDR r0,[r0,#0] $d 0x00000070: 00006261 ab.. DCD 25185 <---- ассемблер добавил два байта для выравнивания $a 0x00000074: e5900000 .... LDR r0,[r0,#0] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 14 января, 2009 Опубликовано 14 января, 2009 · Жалоба Если правильно понял, код: .align 4 UNDEF_string: .asciz "abcdef" строка abcdef занимает 6 байт но если использовать выравнивание align 4 то она будет размещена в 8 байтах ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 14 января, 2009 Опубликовано 14 января, 2009 · Жалоба строка abcdef занимает 6 байт Нет. Cемь. но если использовать выравнивание align 4 то она будет размещена в 8 байтах ? Нет. Семь или в зависимости от нюансов конткретного ассемблера, но совершенно вне зависимости от одиночного align перед этой строкой. P.S. Так и будете заниматься гаданиями? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 14 января, 2009 Опубликовано 14 января, 2009 · Жалоба Так и будете заниматься гаданиями? с удовольствием бы прочел мануал на asm, но пока найти не смог. :( Использую eclips + yagarto Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 14 января, 2009 Опубликовано 14 января, 2009 · Жалоба Описание ассемблера: http://infocenter.arm.com/help/index.jsp?t...rm.doc.dui0068b Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 15 января, 2009 Опубликовано 15 января, 2009 · Жалоба Наверно опять будет глупый вопрос, для чего нужно переключать режим ядра? откуда брать указатель на стек pstack ? ldr r0, = pstack @ запись указателя на стек msr cpsr_c, #(UNDEF_MODE | I_BIT | F_BIT) @ переключение режима ядра в UNDEF_MODE mov sp, r0 @ запись в регистр sp указателя на стек sub r0, r0, #UNDEF_STACK_SIZE @ вычисление размера стека msr cpsr_c, #(ABT_MODE | I_BIT | F_BIT) @ переключение режима ядра в Abort Mode выключение irq fiq mov sp, r0 @ запись в регистр sp размер стека Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 15 января, 2009 Опубликовано 15 января, 2009 · Жалоба для чего нужно переключать режим ядра... Забудьте пока про ассемблеры и ознакомьтесь для начала с собственно с микроконтроллером. Сколько у него режимов, стеков... Хотя на вопрос "откуда брать..." ответ надо искать еще более издалека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 15 января, 2009 Опубликовано 15 января, 2009 (изменено) · Жалоба С этим кажется разобрался, ядро настраивается отдельно, для каждого режима и стек тоже для каждого режима свой. Другой вопрос: правильно я распределил адреса, для стеков. Ремап не используется. Начала адреса озу с 0x20000000 (at91sam7). Где нужно настраивать компоновщик ( в makefile ? )что бы не записать в стек переменные которые будут использоваться в программе? ldr r0, #0x20000900 msr cpsr_c, #(UNDEF_MODE | I_BIT | F_BIT) mov sp, r0 sub r0, r0, #0x00000100 msr cpsr_c, #(ABT_MODE | I_BIT | F_BIT) mov sp, r0 sub r0, r0, #0x00000100 msr cpsr_c, #(FIQ_MODE | I_BIT | F_BIT) mov sp, r0 sub r0, r0, #0x00000100 msr cpsr_c, #(IRQ_MODE | I_BIT | F_BIT) mov sp, r0 sub r0, r0, #0x00000100 msr cpsr_c, #(SVC_MODE | I_BIT | F_BIT) mov sp, r0 sub r0, r0, #0x00000100 msr cpsr_c, #USR_MODE mov sp, r0 sub sl, sp, #0x00000400 Изменено 15 января, 2009 пользователем sergey sva Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться