close

Вход

Забыли?

вход по аккаунту

?

Otchet 2 Basov E A 71-4

код для вставкиСкачать
Пример оформления отчета о лабораторной работе
Санкт-Петербургский государственный политехнический университет
Факультет ЦНИИ РТК, кафедра Телематики
Курс: "Организация ЭВМ"
Отчет о лабораторной работе "Способы адресации в архитектуре ARM"
Выполнил студент Басов Евгений Александрович
Группа 3171/4
20 октября 2012 г.
Преподаватель: А.П.Новицкий
Программа работы и методика выполнения.
Я выполнял данную работу по следующей программе.
1.Подготовка к работе
1.1. Написать исходный текст (или отредактировать шаблон) программы на языке Си в соответствии с индивидуальным заданием.
1.2. Последующие пункты задания выполнять для системы кодирования ARM либо Thumb в соответствии с исходными данными, которые задаются преподавателем в дополнение к индивидуальному заданию. Исходный режим трансляции программы: "без оптимизации".
1.3 Оттранслировать программу. При подготовке дома - использовать режим отладки на симуляторе. Тема 2. СПОСОБЫ АДРЕСАЦИИ В АРХИТЕКТУРЕ ARM
3. Найти в оттранслированной программе все команды, в которых так или иначе задано обращение к памяти и отметьте эти команды
3. Добавьте в текст операторы присваивания переменным значений, которые лежат в диапазонах а) один байт, б) 12 битов, в) 32 бита 4. Разберите четыре способа задания непосредственных констант в архитектуре ARM:
- в однобайтовой сетке
- формируемые только одним байтом со сдвигом
- формируемые с помощью добавочных арифметических команд
- загрузкой из программной памяти с использованием относительной адресации
Оттранслируйте программу в вариантах "No Optimisation" . Исследуйте дизассемблированный текст программы.
4. Найдите последовательности команд, обеспечивающих присваивание значений переменным. Разберите и опишите приемы, которые можно использовать для задания различных числовых значений в командах копирования этих значений в переменные.
5. В какие команды транслируется инструкция Си-программы, выполняющая копирование значения одной переменной в другую? Как реализуется Си-инструкция, содержащая цепочку присваиваний?
6. Как компилятор организовал доступ к переменным через указатель. Разберите и опишите последовательность команд, в которой используется указатель.
7. Как может быть организован доступ к элементам массива подряд внутри циклической конструкции.
Индивидуальное задание студента Басова Е.А.
Выполнение задания
1. Для изучения особенностей разных способов адресации в архитектуре ARM написана следующая программа на языке Си.
// Объявление переменных
unsigned short usMasEA1[7] = {0,1,2,3,4,5,6}; // Массив элементов short
signed char scMasEA2[5] = {0,1,2,3,4}; // Массив элементов char
signed short ssEA1;
volatile unsigned int uiEA1;
signed char cEA1, cEA2, cEA3;
unsigned short * puiEA1;
2. После трансляции и перехода в режим отладки на симуляторе получен дизассемблированный дамп кода, включающий команды процессора ARM:
В некоторых местах дампа дизассемблер среды программирования Keil uVision3 неверно указывает соответствие между строками исходного текста и командами процессора, там приходится немного переставить строки, чтобы ассемблерный эквивалент следовал за соответствующей Си-строкой.
В приведенном разборе мои комментарии (подчеркнуты) по большей части помещены непосредственно за комментируемой строчкой.
Распределение памяти для моего варианта.
Переменная Адрес
usMasEA1
[0] 0x00010000
[1] 0x00010002
[2] 0x00010004
[3] 0x00010006
[4] 0x00010008
[5] 0x0001000A
[6] 0x0001000C
scMasEA2
[0] 0x0001000E
[1] 0x0001000F
[2] 0x00010010
[3] 0x00010011
[4] 0x00010012
cEA1 0x00010040
uiEA1 0x00010060 puiEA1 0x00010080 cEA3 0x00010088
cEA2 0x00010090 ssEA1 0х000100A0
Видим, что транслятор оставил для неизвестных целей свободными ряд байтов, память для переменных занята не подряд, а с промежутками.
Видим, что многобайтовые переменные выровнены по адресам, кратным длине переменных.
==== Команды ARM, без оптимизации. Начало дизассемблерного дампа с комментариями====
Фрагмент кода, скопированный из окна дизассемблера
25: cEA1=120; // Целое положительное в пределах байта 0x00080114 E59F20F4 LDR R2,[PC,#0x00F4]
0x00080118 E3A03078 MOV R3,#0x00000078
0x0008011C E5C23000 STRB R3,[R2]
В данном случае заданный программистом константный операнд-источник помещается в байтовую разрядную сетку. Транслятор поместил константу 120=0x78 в последний байт команды.
26: cEA2=cEA3= -120; // Целое отрицательное в пределах байта 0x00080120 E59F10EC LDR R1,[PC,#0x00EC]
0x00080124 E59F20EC LDR R2,[PC,#0x00EC]
0x00080128 E3E03077 MVN R3,#0x00000077
0x0008012C E5C23000 STRB R3,[R2]
0x00080130 E3E03077 MVN R3,#0x00000077
0x00080134 E5C13000 STRB R3,[R1]
Чтобы получить целое отрицательное из положительного нужно инвертировать двоичную запись константы и прибавить 1. LDR грузит в регистр R1 и R2 слово, находящееся по адресу PC+0x00EC , MVN пишет в регистр R3 #0x00000077, STRB R3, [R2] сохраняет байт из R3 в тот адрес, который лежит в [R2].Постфикс В команды STRB - означает "Байт".
27: uiEA1=0x134000; // Целое, которое можно получить сдвигом байтовой величины 0x00080138 E59F20DC LDR R2,[PC,#0x00DC]
0x0008013C E3A0394D MOV R3,#0x00134000
0x00080140 E5823000 STR R3,[R2]
LDR грузит в регистр R2 слово, находящееся по адресу PC+0x00DC, команда MOV грузит константу 0х00134000 в R3 , и эта же команда осуществляет сдвиг , команда STR загружает 32-битовое слово в память, она сохраняет 32-бит. Слово, находящееся в R3 по адресу R2.
28: uiEA1=0x6888; // Целое, которое можно вычислить малым количеством команд 0x00080144 E59F20D0 LDR R2,[PC,#0x00D0]
0x00080148 E3A03B1A MOV R3,#0x00006800
0x0008014C E2833088 ADD R3,R3,#0x00000088
0x00080150 E5823000 STR R3,[R2]
LDR загружает в регистр R2 слово, из адреса PC+0x00D0, MOV загружает константу 0х00006800 в R3, ADD пишет в R3 сумму R3 и 0x00000088. STR пишет слово из R3 в адрес R2.
40: puiEA1 = usMasEA1; 0x00080160 E59F20BC LDR R2,[PC,#0x00BC]
0x00080164 E59F30BC LDR R3,[PC,#0x00BC]
0x00080168 E5823000 STR R3,[R2]
LDR загружает в регистр R2 слово из адреса PC+0x00BC потом в R3 слово, из адреса PC+0x00BC, STR все что лежит в регистре R3 пишет в память по адресу, лежащему в регистре R2
41: *puiEA1 = 0x4321; 0x0008016C E59F30B0 LDR R3,[PC,#0x00B0]
0x00080170 E5932000 LDR R2,[R3]
0x00080174 E3A03C43 MOV R3,#0x00004300
0x00080178 E2833021 ADD R3,R3,#0x00000021
0x0008017C E1C230B0 STRH R3,[R2]
LDR грузит в регистр R3 слово из адреса PC+0x00B0, LDR грузит в регистр R1 загружается слово из адреса R2. MOV грузит константу 0х00004300 в регистр R3. ADD пишет в R3 сумму R3 и 0x00000021, R2 используется как адрес результата.
Причем постфикс Н к последней команде означает передачу полуслова(16 бит)
42: puiEA1 = (unsigned short *) ((unsigned int)usMasEA1 + 1); 0x00080180 E59F209C LDR R2,[PC,#0x009C]
0x00080184 E59F30A0 LDR R3,[PC,#0x00A0]
0x00080188 E5823000 STR R3,[R2]
LDR грузитт в регистр R2 слово, из адреса PC+0x009С а также в R3 из адреса PC+0x00A0.
STR все что лежит в регистре R3 пишет в память по адресу, лежащему в регистре R2.
Цикл FOR:
45: for (uiEA1=2;uiEA1<18;uiEA1+=3) { // Цикл // Тут заданы условия. Если они не выполняются, то возвращаем "0" в 50-м пункте: 50: return 0;
0x000801A0 E59F2074 LDR R2,[PC,#0x0074]
0x000801A4 E3A03002 MOV R3,#0x00000002
0x000801A8 E5823000 STR R3,[R2]
0x000801AC E59F3068 LDR R3,[PC,#0x0068]
0x000801B0 E5933000 LDR R3,[R3]
0x000801B4 E3530011 CMP R3,#0x00000011
0x000801B8 9A000000 BLS 0x000801C0
0x000801BC EA00000F B 0x00080200
Команда LDR загружает в R2 слово, которое лежит по адресу PC,#0x0074.
MOV загружает константу 0x00000002 в регистр R3.
STR записывает слово из R3 в адрес R2.
LDR загружает в R3 слово, которое лежит по адресу PC,#0x0068.
LDR R3,[R3] - кладет в R3 значение лежащее в памяти по адресу из этого регистра.
CMP R3,#0x00000011 - Команда сравнения (compare),выдает результат для следующей команды.
BLS 0x000801C0 - Эта (Перейти, если меньше или равно) --- команда условного перехода после получения результата от выполнения операции сравнения. Как вы видим, переход двухкомпонентый...
B 0x00080200. ...потому что эта команда осуществляет безусловный переход.(Branch)
46: usMasEA1[uiEA1]=(uiEA1>>1)+13; // Арифметика 47: } 0x000801C0 E59F2060 LDR R2,[PC,#0x0060]
0x000801C4 E59F3050 LDR R3,[PC,#0x0050]
0x000801C8 E5933000 LDR R3,[R3]
0x000801CC E1A03083 MOV R3,R3,LSL #1
0x000801D0 E0832002 ADD R2,R3,R2
0x000801D4 E59F3040 LDR R3,[PC,#0x0040]
0x000801D8 E5933000 LDR R3,[R3]
0x000801DC E1A030A3 MOV R3,R3,LSR #1
0x000801E0 E283300D ADD R3,R3,#0x0000000D
0x000801E4 E1C230B0 STRH R3,[R2]
0x000801E8 E59F202C LDR R2,[PC,#0x002C]
0x000801EC E59F3028 LDR R3,[PC,#0x0028]
0x000801F0 E5933000 LDR R3,[R3]
0x000801F4 E2833003 ADD R3,R3,#0x00000003
0x000801F8 E5823000 STR R3,[R2]
0x000801FC EAFFFFEA B 0x000801AC
LDR грузит в R2 слово, которое лежит по адресу PC,#0x0060.
LDR грузит в R3 слово, которое лежит по адресу PC,#0x0050.
LDR кладет в R3 значение лежащее в памяти по адресу из него.
MOV делает логический сдвиг R3 на 1 влево.
ADD пишет в R2 сумму R3 и R2.
LDR загружает в R3 слово по адресу PC,#0x0040.
LDR кладет в R3 значение лежащее в памяти по адресу из него..
MOV логически сдвигает R3 на 1 вправо.
ADD пишет в R3, сумму R3 и #0x0000000D, а R2 использует как адрез для значения.(STRH)
Причем постфикс Н означает передачу полуслова ( 16 бит)
LDR загружает в R2 слово по адресу PC,#0x002C
LDR загружает в R3 слово по адресу PC,#0x0028
LDR кладет в R3 значение лежащее в памяти по адресу из него.
ADD пишет в R3, сумму R3 и #0x00000003, а R2 использует как адрес для значения.
.
48: return 0; 0x00080200 E3A03000 MOV R3,#0x00000000 MOV пишет в регистр R3 константу 0. 49: } Конец цикла.
Небольшая добавочка по поводу копирования значений :
(То, что нужно было вписать вместо "???". Она была сделана после, потому номер не вписывается в общую картину)
41: cEA1=cEA2; 0x00080170 E59F20BC LDR R2,[PC,#0x00BC]
0x00080174 E59F30BC LDR R3,[PC,#0x00BC]
0x00080178 E5823000 STR R3,[R2]
Команда LDR загружает в R2 слово, которое лежит по адресу PC+0x00BC.
Потом то же самое с R3. И все что там есть записывает в память по адресу в регистре R2.
Ответы на вопросы:
2) Приемы, которые использовал транслятор, чтобы сформировать "длинные" константы:
0x00080138 E59F207C LDR R2,[PC,#0x007C]
0x0008013C E3A0394D MOV R3,#0x00134000
0x00080140 E5823000 STR R3,[R2]
Константа больше,чем 1 байт, а MOV может только использовать 1 байт.
E3A0394D:
94D- кусок, который отвечает за значение константы. 4D- использование побитового сдвига.
9 - тип сдвига
Получается, что для формирования длинных констант программа получает из однобайтовой константы и побитового сдвига исходное значение.
3) Копирование значения из одной переменной в другую. Какая последовательность команд
для этого используется, какие способы адресации использовал транслятор и для какой цели
каждый из этих способов.
Ответ с последовательностью команд есть чуть выше, в комментариях к коду, там встретился такой пример. Там используется всего 2 команды: последовательно 2 раза LDR и затем STR.
Способы адресации: относительная, многокомпонентная и регистровая.
4) Доступ к переменным через указатель.
Откуда транслятор берет значения адресов переменных для инициализации указателей.
Как реализовано обращение через указатель?
Насколько длиннее фрагмент кода при использовании доступа через указатель, и
насколько дольше выполняется доступ?
В 41-м пункте рассмотрен пример такого доступа.
Фрагмент кода длиннее на 1-2 команды, в зависимости от того с какой операцией сравнивать.
(например, п.27 или п.28)
Фрагменты кода для 5,6,7 вопросов рассмотрены в работе цикла.
Документ
Категория
Рефераты
Просмотров
20
Размер файла
64 Кб
Теги
basov, otchet
1/--страниц
Пожаловаться на содержимое документа