ДЕРЖАВНИЙ
УНІВЕРСИТЕТ ТЕЛЕКОМУНІКАЦІЙ
Кафедра системного аналізу
Для викладачів
|
ЗАТВЕРДЖУЮ В.о. завідувача кафедри системного аналізу ______________________В.П. ЯРЦЕВ “ _____ ” _______________ 2016 року |
МЕТОДИЧНА РОЗРОБКА
для проведення лабораторної роботи
зі студентами ННІ Телекомунікацій та інформатизації
(назва факультету)
з навчальної дисципліни: Обчислювальна техніка та мікропроцесори
(назва навчальної дисципліни)
Тема: 6. Програмування мікропроцесорів
(номер і назва теми в програмі навчальної дисципліни)
Заняття: 1. Система команд мікропроцесора
(номер і назва заняття в робочій програмі)
Час: 90 хв.
Навчальна та виховна мета
1. Ознайомитись з синтаксисом команд МП, які найчастіше частіше всього використовуються при створенні програм для задач обчислювального характеру.
2. Навчитись записувати операнди у регістри та у пам’ять, записувати вміст регістрів у пам’ять і навпаки.
Навчально-матеріальне забезпечення
1. Комп’ютер з ОС Windows.
2. Інтегроване середовище SASM для розробки на асемблері.
3. Методичний посібник кафедри СА.
|
Обговорено та схвалено на засіданні кафедри СА “___” __________ 2016 року Протокол №____ |
|
|
План проведення заняття:
Вступ.................................................................................................................5 хв.
1. Ключові питання..........................................................................................25 хв.
2. Лабораторне завдання..................................................................................55 хв.
Завершальна частина........................................................................................5 хв.
Вступ
– контроль присутності студентів;
– оголошення теми та мети заняття;
– оголошення плану заняття.
Ключові положення
Вступ
Алгоритм — однозначна чітко визначена послідовність дій, виконання якої забезпечує отримання конкретного результату.
Властивості алгоритму:
- скінченність;
- дискретність;
- детермінованість (визначеність);
- зрозумілість;
- масовість (застосовність до різних наборів вихідних даних);
- результативність (завершення алгоритму супроводжується конкретними результатами).
Програма — запис алгоритму в зрозумілому для сприйняття комп'ютером вигляді.
Знайомство із SASM та NASM
Для роботи із мовою Assembler ми будемо використовувати діалект NASM у інтегрованому середовищі IDE SASM.
SASM — просте кросплатформене (Windows, Linux) середовище розробки для мов асемблера NASM, MASM, GAS, FASM із підсвіченням синтаксису та відлагоджувачем. Поширюється за вільною ліцензією GNU GPL v3.0.
NASM (Netwide Assembler) – вільний (LGPL та ліцензія BSD) асемблер архітектури Intel x86, який підтримує написання 8-, 16-, 32- та 64-розрядних програм.
Відлагоджувач дозволяє продивлятися регістри, пам’ять, покроково виконувати програму тощо.
Бібліотека макросів для уведення/виведення io.inc дозволяє виводити дані не замислюючись над домовленостями та правилами виклику функцій і є дує корисною на початковому етапі вивчення мови Assembler. Наприклад, для виведення вмісту регістру EAX достатньо написати:
Print_dec 4, eax ; 4 – кількість байт
замість:
section .data
format db "%d", 0
section .text
push eax
push format
call printf
add esp, 8
Бібліотека макросів для NASM:
Имя макроса |
Описание макроса |
PRINT_UDEC size, data PRINT_DEC size, data |
Вывод числовых данных заданных параметром data в 10-чном представлении. Параметр size – число, указывающее размерность данных в байтах; допускаются значения 1, 2, 4, 8 (x64). В качестве параметра data может выступать числовая константа, символьная константа, имя переменной, имя регистра или адресное выражение (без спецификатора размера данных в памяти). Если задается регистр большего размера, то берется заданное параметром size количество младших разрядов. PRINT_UDEC интерпретирует число как беззнаковое, PRINT_DEC — как знаковое. |
PRINT_HEX size, data |
Аналогично предыдущему, но данные выводятся в 16-чном представлении. |
PRINT_CHAR ch |
Печатается символ, заданный параметром ch. В качестве параметра может выступать численная константа, символьная константа, имя переменной, имя регистра или адресное выражение (без спецификатора размера данных в памяти). Печатается всегда содержимое 8 младших разрядов. |
PRINT_STRING data |
Печать строки текста, оканчивающейся символом с кодом 0. В качестве параметра можно передавать строковую константу, имя переменной или адресное выражение (без спецификатора размера данных в памяти). В случае печати строковой константы, наличие символа с кодом 0 в конце строки необязательно. |
NEWLINE |
Макрос переводит печать на новую строку. |
GET_UDEC size, data GET_DEC size, data |
Ввод числовых данных в 10-чном представлении с клавиатуры. Размер вводимых данных ограничен параметром size, который задается числом (1, 2, 4, 8 (x64)). Введенные данные обрезаются соответствующим образом. Параметр data – либо имя переменной, либо имя регистра, либо адресное выражение (без спецификатора размера данных в памяти). Если задается регистр большего размера, то старшие разряды заполняются знаковым битом в случае GET_DEC и нулями в случае GET_UDEC. GET_UDEC считывает беззнаковое число, GET_DEC — знаковое. Запрещается использовать в качестве параметра регистр esp. |
GET_HEX size, data |
Аналогично предыдущему, но данные задаются в 16-чном представлении с префиксом 0x. |
GET_CHAR data |
Аналогично предыдущему, но происходит считывание одного символа, нажатие Enter не требуется. Более того, нажатие Enter будет расцениваться как ввод управляющих символов перевода строки: 0xD 0xA в ОС Windows, 0xA в ОС *nix. Если параметр – регистр, размер которого больше 1 байта, значение считанного символа будет дополнено нулями. |
GET_STRING data, maxsz |
Ввод последовательности символов длиной не более чем (maxsz-1). Чтение последовательности останавливается на EOF или переводе строки, причем перевод строки сохраняется в буфере. В конец считанной строки добавляется символ с кодом 0. Параметр data – либо имя переменной, либо адресное выражение (без спецификатора размера данных в памяти). Параметр maxsz – регистр или числовая константа. |
Деякі відмінності NASM від інших асемблерів:
– регістрочутливість для таких міток, як foo, Foo та FOO;
– NASM вимагає квадратні дужки для посилань на пам’ять;
– NASM не зберігає типи змінних, а отже, не підтримує інструкції LODS, MOVS, STOS, SCAS, CMPS, INS та OUTS (підтримуються тільки їхні форми LODSB, MOVSW та SCASD, де явно заданий розмір компонентів рядка, який обробляється);
– NASM не підтримує директиву ASSUME;
– NASM не підтримує моделі пам’яті (програміст повинен самостійно слідкувати, які функції передбачається викликати ближнім RETN або RET, а які дальнім викликом RETF);
– особливості обробки чисел із плаваючою крапкою (NASM посилається на регістри співпроцесора за іменами st0, st1, ...);
– за історичними причинами NASM використовує ключове слово TWORD там, де MASM та сумісні з ним асемблери використовують TBYTE;
– NASM не підтримує синтаксис резервування неініціалізованого простору типу «DW ?», як у TASM/MASM.
Синтаксис NASM. Кожний рядок NASM (якщо це не макрос, препроцесорна чи асемблерна директива), може містити комбінацію чотирьох полів:
мітка : інструкція операнди ; коментар
Як правило, більшість цих полів необов’язкові.
Директиви визначення цілочисельних даних
db (define byte) – 1 байт;
dw (define word) – 2 байти (слово);
dd (define double word) – 4 байти (подвійне слово);
dq (define quad word) – 8 байт (почетверене слово);
Сегменти (секції, області)
Директива section вказує, в яку секцію вихідного файлу буде асембльований написаний код. Об’єктні формати Unix та bin підтримують стандартизовані імена секцій: .text, .data, .bss. Область коду доступна тільки для читання, секції .data та .bss доступні також і для запису. Області ініціалізованих даних (section .data), неініціалізованих даних (section .bss) та коду (section .text) можна розташовувати у довільному порядку одна відносно одної.
Система команд мікропроцесора
Системою команд мікропроцесора називають сукупність команд, яку він здатний виконувати.
Створення операндів у пам’яті. Ініціалізовані операнди створюються в області даних (section .data), неініціалізовані – в області .bss. Створимо ініціалізовані операнди (змінні var1, var2, var3, var4, message та сталу cnst), а також неініціалізовані змінні:
Якщо створити неініціалізовані змінні в області ініціалізованих даних (section .data), то буде видано помилку на кшталт такої:
Це означає, що ці змінні автоматично ініціалізуються шляхом запису в них нулів.
Команди передавання даних. Загальний синтаксис пересилання даних:
