|
|
  |
startup asm |
|
|
|
Jan 17 2009, 21:36
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Понятно. Разбираюсь еще с ассемблером, появился вопрос, простой  , Подумал лучше спросить чем оставаться с сомнениями. команда and логическое и, с флагом S выполняется если условие истинно. Получается если: mov R1 , #0xFF ands R1 , R1, #0xFF B lab1 условие истинное будет выполняться эта команда B lab2 условие не истинное будет выполняться эта команда
|
|
|
|
|
Jan 17 2009, 22:33
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sergey sva @ Jan 18 2009, 01:29)  Если правильно понял: mov R1, #0xFF ands R1, R1, #0xFF mov ne R2 , #0xFF ; этот код выполняется, если R1 & 0xFF != 0 mov R3 , #0xFF ;этот код выполняется всегда
|
|
|
|
|
Jan 18 2009, 13:38
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Что проверяет _check_mapping: , для чего сохранять 0x12345678 в конец таблицы векторов, по адресу 0x200014 . ? Код _check_mapping: ldr r0, =0x200014 mov r1, #0x14 ldr r2, =0x12345678 str r2, [r0] ldr r0, [r1] cmp r0, r2 beq _check_mapping_end _mem_remap: @ RAM remap ldr r0, =MC_BASE mov r1, #1 str r1, [r0, #MC_RCR] _check_mapping_end: mov r0, #0x14 mov r1, #0 str r1, [r0]
|
|
|
|
|
Jan 18 2009, 16:30
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sergey sva @ Jan 18 2009, 19:08)  Объясните, пожалуйста Код AREA code1, DATA, READWRITE @ DATA эта директива как то влияет на код , или это для удобства чтения кода ?
regs_temp @метка SPACE 0x40 @указатель на структуру 0х40 ?
END @ конец AREA1, или всей страницы кода? AREA - указывает название и тип сегмента для линковки. SPACE n - резервирует n байт памяти END - конец файла Все вышеперечисленное имеет смысл только для RVCT. У GCC дериктивы будут другими (.section, .zero и т.д).
|
|
|
|
|
Jan 18 2009, 18:10
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Поправите если что не так понял. Изучаю доку, но не все же не понятно, CPSR регистр статуса и регистр сохранного статуса SPSR , SPSR это резервный регист, в него нужно программно сохранять статус или он сам сохраняет CPSR что то я не где это не нашел. Еще в программе обработки исключительной ситуации, вместе с включением прерываний ядро переключается в ABORT_MODE, а где его переводить в USER_MODE? CODE DATA_ABORT_handler: sub r14, r14, #0x04 @ регистр связи r14 = r14 - 0x04 stmfd r13!, {r14} @ Сохранить регистр R14 в Стеке stmfd r13!, {r0-r3, r12} @ Сохранить регистры r0 - r3 и r12 в Стеке ldr r0, = regs_temp @ Сохранить в r0 адрес структуры regs_temp str r14, [r0], #0x04 @ Сохранить r14 в в структуре regs_temp mov r14, r0 @ Записать в регистр связи адрес regs_temp ldr r0, [r13] @ Прочитать r0 из стека stmia r14!, {r0-r12} @ Сохранит в regs_temp регистры r0 - r12 mov r0, r14 @ Записать в r0 r14(адрес regs_temp) mrs r14, SPSR @ сохранить в r14, копию сохраненого статуса программы stmfd r13!, {r14} @ Сохранить в стеке регистр r14 orr r14, r14, #F_BIT orr r14, r14, #I_BIT @ запрет прерываний, логическое или r14 = r14 || #F_BIT || #I_BIT msr CPSR_c, r14 @ запись в регистр статуса stmia r0!, {r13-r14} @ Сохранит в regs_temp регистры r13-r14 and r0, #F_BIT and r0, #I_BIT and r0, #ABT_MODE @ логическое и, разрешение прерываний, переключение режима работы в аварийный. @ r0 = r0 && #F_BIT && #I_BIT && #ABT_MODE msr CPSR_c, r0 @ Записать в CPSR r0 ldr r0, = regs_temp @ Записать в r0 указатель на regs_temp @ bl func_obr_data_abort **** Вызов функции C ldmfd r13!, {r0} @ прочитать из стека r0 msr SPSR_c, r0 @ записать в регистр статуса r0. Возврат статуса. ldmfd r13!, {r0-r3, r12, pc}^ @ Возврат програмного счетчика, и регистров r0-r3 r12 pc @----------------------------------------------------------------------------------------
|
|
|
|
|
Jan 18 2009, 19:28
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Код sub r14, r14, #0x04 @ LR_abt = LR_abt - 0x04 stmfd r13!, {r14} @ Сохранить LR_abt на стеке ABT stmfd r13!, {r0-r3, r12} @ Сохранить r0 - r3 и r12 на стеке ABT ldr r0, = regs_temp @ Загрузить в r0 адрес структуры regs_temp str r14, [r0], #0x04 @ Сохранить LR_abt в структуре regs_temp mov r14, r0 @ Записать в LR_abt адрес regs_temp+4 ldr r0, [r13] @ Прочитать r0 из стека ABT stmia r14!, {r0-r12} @ Сохранить в regs_temp+4 регистры r0 - r12 mov r0, r14 @ Записать в r0 LR_abt (адрес regs_temp+56) mrs r14, SPSR @ Загрузить в LR_abt копию сохраненого статуса программы stmfd r13!, {r14} @ Сохранить в стеке ABT регистр LR_abt orr r14, r14, #F_BIT @ запрет прерываний, побитовое ИЛИ r14 = r14 | #F_BIT | #I_BIT orr r14, r14, #I_BIT msr CPSR_c, r14 @ запись в регистр статуса, переключение в режим XXX stmia r0!, {r13-r14} @ Сохранить в regs_temp+56 регистры SP_XXX и LR_XXX and r0, #F_BIT @ ???????? and r0, #I_BIT @ ???????? and r0, #ABT_MODE @ ???????? msr CPSR_c, r0 @ Записать в CPSR r0, переключение в режим ABT ldr r0, = regs_temp @ Записать в r0 указатель на regs_temp @ bl func_obr_data_abort @ Вызов функции C ldmfd r13!, {r0} @ прочитать r0 из стека ABT msr SPSR_c, r0 @ записать в регистр сохраненного статуса r0. Возврат статуса. ldmfd r13!, {r0-r3, r12, pc}^ @ Возврат програмного счетчика, и регистров r0-r3 r12 pc, переключение в режим XXX Вот здесь у вас что-то, мягко говоря, странное написано: Код and r0, #F_BIT and r0, #I_BIT and r0, #ABT_MODE msr CPSR_c, r0 Цитата(sergey sva @ Jan 18 2009, 21:10)  SPSR это резервный регист, в него нужно программно сохранять статус или он сам сохраняет CPSR Сам сохраняет. Цитата(sergey sva @ Jan 18 2009, 21:10)  Еще в программе обработки исключительной ситуации, вместе с выключением прерываний ядро переключается в ABORT_MODE, а где его переводить в USER_MODE? Обратите внимание на "^" в последней инструкции.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|