Загрузите справочные статьи и сопутствующие материалы для этого блога. :
Справочное руководство :
Определение исключения :
Тип исключения : ARM Архитектура поддерживать Семь типов исключений,
Обработка исключений Введение :
Start.S Ассемблерный анализ :
.text
Макрос указатьассемблерный кодчасть;.global _start
Объявите _start как глобальный символ.; использовать _start:
Метка записи, указывающая программу, — _start.; этикетка:
, Например irq:
;
irq : nop
;nop
выражать Никакая операция не выполняется; этикетка: .word хранит содержимое значения
;
_irq: .word irq
, определение _irq этикетка, .word
выражать Этикетка магазинов - это 32 место значения, этот Размер значениято есть irq
адрес;б{условие} адрес
, если①Если условия выполнены, перейдите к указанному адресу., если②Если условие не выполнено, выполните следующую инструкцию., ③Если условий нет, оно будет выполнено на 100%.;b reset
, При возникновении аномалии Перейти непосредственно к reset
этикеткавосуществлятькод;ldr зарегистрироваться, адрес
, Воля адрес данные, хранящиеся в нагрузка приезжать в реестре; irq
, Прямо Теперь перейдите к метке. Просто начните с следующих инструкций, irq : nop
; _irq
, используется дляХранит 32-битное значение,Это используется для хранения выше определениеизэтикетка адрес, _irq .word irq
ldr pc, _irq
, Воля _irq
Значение, хранящееся в этикетке, это значение irq
этикеткаизадрес, то естьПерейдите по этому адресу, чтобы выполнить инструкцию; @****************************
@File:start.S
@
@Обработка исключенийрамка
@****************************
.text @ Макрос Укажите часть кода
.global _start @ Директива объявляет глобальный стартовый символ
_start: @ Знак входа в программу
b reset @ reset сложный Кусочеканомальный
ldr pc,_undefined_instruction @ еще нетопределениеаномальный, Воля _undefined_instruction ценитьнагрузкаприезжать pc в указателе
ldr pc, _software_interrupt @ мягкое прерываниеаномальный
ldr pc,_prefetch_abort @ предварительная выборкаинструкцияаномальный
ldr pc, _data_abort @ Чтение данных аномальное
ldr pc, _not_used @ занимать 0x00000014 адрес
ldr pc, _irq @ Обычное прерываниеаномальный
ldr pc, _fiq @ мягкое прерываниеаномальный
_undefined_instruction: .word undefined_instruction @ _undefined_instruction этикетка хранит ценность, Значение 32 Кусочекадрес undefined_instruction, undefined_instruction это адрес
_software_interrupt: .word software_interrupt @ мягкое прерываниеаномальный
_prefetch_abort: .word prefetch_abort @ предварительная выборкаинструкцияаномальный иметь дело с
_data_abort: .word data_abort @ Чтение данных аномальное
_not_used: .word not_used @ нулевой Кусочекиметь дело с
_irq: .word irq @ Обычное прерываниеиметь дело с
_fiq: .word fiq @ быстрое прерываниеиметь дело с
undefined_instruction: @ undefined_instruction адрес хранит контент, который вы хотите изучить
nop
software_interrupt: @ software_interrupt адрес хранит контент, который вы хотите изучить
nop
prefetch_abort: @ prefetch_abort адрес хранит контент, который вы хотите изучить
nop
data_abort: @ data_abort адрес хранит контент, который вы хотите изучить
nop
not_used: @ not_used адрес хранит контент, который вы хотите изучить
nop
irq: @ irq адрес хранит контент, который вы хотите изучить
nop
fiq: @ fiq адрес хранит контент, который вы хотите изучить
nop
reset: @ reset адрес хранит контент, который вы хотите изучить
nop
gboot.lds скрипт компоновщика Анализ кода :
OUTPUT_ARCH(Архитектураимя)
указатьвыходной формат, Прямо сейчасиметь дело сустройствоиз Архитектура,вот arm Архитектураиз, OUTPUT_ARCH(arm)
;ENTRY(Вход Расположение)
, в выше Start.S Установленная запись программы _start
, Код ENTRY(_start)
;.text :
Установить фрагмент кода; .data :
Установить сегмент данных;.bss :
настраивать BSS часть;
bss_start = .;
;bss_end = .;
;. = ALIGN(4);
настройки четырехбайтовое выравнивание Прямой сейчас Может;OUTPUT_ARCH(arm) /*указатьиметь дело сустройствоструктура*/
ENTRY(_start) /*Указать запись программы существовать _start этикеткав*/
SECTIONS {
. = 0x50008000; /*Отправная точка всей ссылки программы Расположение, Определяется по данным совета по развитию, Адреса на разных макетах несовместимы */
. = ALIGN(4); /*Выровнять дело с, Выполняется перед началом каждой части 4 Выравнивание байтов */
.text : /*кодчасть*/
{
start.o (.text) /*start.S Преобразованная часть кода*/
*(.text) /*Другие коды*/
}
. = ALIGN(4); /*Выровнять дело с, Выполняется перед началом каждой части 4 Выравнивание байтов */
.data : /*данныечасть*/
{
*(.data)
}
. = ALIGN(4); /*Выровнять дело с, Выполняется перед началом каждой части 4 Выравнивание байтов */
bss_start = .; /*Записывать bss частьначинать Расположение*/
.bss : /*bss часть*/
{
*(.bss)
}
bss_end = .; /*Записывать bss часть Заканчивать Расположение*/
}
makefile Написание документов :
%.o : %.S
, Производственный процесс arm-linux-gcc -g -c $^
, в ^
Идентичность — это документ всех зависимостей, по этому правилу start.S будет мутировать в start.o ; %.o : %.c
, Производственный процесс arm-linux-gcc -g -c $^
; all: start.o #зависит от start.o
arm-linux-ld -Tgboot.lds -o gboot.elf $^ #использоватьскрипт компоновщика, Воля start.o конвертировать в gboot.elf
arm-linux-objcopy -O binary gboot.elf gboot.bin #Воля gboot.elf преобразован в Можетпрямойсуществоватьна доскеосуществлятьиз gboot.bin документ
%.o : %.S #общие правила, нравиться start.o сделан из start.S компилировать Приходитьиз, -c только компилировать, не связано
arm-linux-gcc -g -c $^
%.o : %.c #общие правила, нравиться start.o сделан из start.c компилировать Приходитьиз, -c только компилировать, не связано
arm-linux-gcc -g -c $^
.PHONY: clean
clean: #clearкомпилировать информацию
rm *.o *.elf *.bin
Процесс компиляции :
make
; Загрузите справочные статьи и сопутствующие материалы для этого блога. :