Инструментарий
Дальнейшее теоретическое изучение ассемблера может быть трудным, поэтому стоит задуматься об инструментах, используемых для разработки программ с его помощью. Здесь будет приведен лишь краткий список популярных средств:
- Borland Turbo Assembler (TASM) — один из самых популярных инструментов. Хорошо подходит для разработки под DOS и плохо — под Windows.
- Microsoft Macro Assembler (MASM) — это пакет для разработки на ассемблере в среде Windows. Существует как отдельно, так и в виде встроенной функции в среде Visual Studio. Ассемблер и языки высокого уровня часто совместимы. В том смысле, что последние могут использовать ассемблер напрямую. Например, С++.
- Netwide Assembler (NASM) — популярный свободный ассемблер для архитектуры Intel.
Существует множество инструментов. При этом следует сделать особую пометку о том, что нет единого стандарта синтаксиса ассемблера. Есть 2 наиболее применимых: AT&T-синтаксис, ориентированный на процессоры производства не Intel, и, соответственно, Intel-синтаксис.
Несмотря на кажущуюся сложность, ассемблер является простым языком программирования, понять который не составляет труда. Поэтому можно смело использовать учебную литературу на подобии «ассемблер для чайников» и изучать этот замечательный язык.
Язык ассемблер. Команды и основы ассемблера на News4Auto.ru.
Наша жизнь состоит из будничных мелочей, которые так или иначе влияют на наше самочувствие, настроение и продуктивность. Не выспался — болит голова; выпил кофе, чтобы поправить ситуацию и взбодриться — стал раздражительным. Предусмотреть всё очень хочется, но никак не получается. Да ещё и вокруг все, как заведённые, дают советы: глютен в хлебе — не подходи, убьёт; шоколадка в кармане — прямой путь к выпадению зубов. Мы собираем самые популярные вопросов о здоровье, питании, заболеваниях и даем на них ответы, которые позволят чуть лучше понимать, что полезно для здоровья.
Предпосылки
Фича редактора кода | Как реализовать в Excel | Как реализовано в Atmel Studio |
---|---|---|
Подсветка синтаксиса | Условное форматирование ячеек в зависимости от содержания | Подсветка команд |
Автодополнение | Пользовательские функции VBA; Именованные диапазоны; Ячейка как миниконсоль с макросом на cобытие Change; |
Нет |
Отступы | Вручную переход в соседний столбец | Вручную |
Проверка правильности расстановки скобок | Есть встроенный контроль | Только при сборке |
Контекстная помощь по коду | Нет | Есть список имен меток |
Сворачивание блока кода | Функция группировки столбцов и строк | Нет |
Статический анализатор | На ходу показывает ошибки в ссылках | Нет |
Different registers
.DEF AnotherRegister = R15
LDI AnotherRegister, 150
There is one exception from that rule: setting a register to Zero. This command CLR MyPreferredRegister
- ANDI Rx,K ; Bit-And of register Rx with a constant value K,
-
CBR Rx,M ; Clear all bits in register Rx that are set to one
within the constant mask value M, -
CPI Rx,K ; Compare the content of the register Rx with a
constant value K, -
SBCI Rx,K ; Subtract the constant K and the current value
of the carry flag from the content of register Rx and store the result in register Rx, -
SBR Rx,M ; Set all bits in register Rx to one, that are one
in the constant mask M, -
SER Rx ; Set all bits in register Rx to one (equal to
LDI Rx,255), -
SUBI Rx,K ; Subtract the constant K from the content of
register Rx and store the result in register Rx.
Команды передачи данных
Группа команд передачи данных предназначена для организации обмена между регистрами стека, вершиной стека сопроцессора и ячейками оперативной памяти. Команды этой группы имеют такое же значение для процесса программирования сопроцессора, как и команда mov основного процессора. С помощью этих команд осуществляются все перемещения значений операндов в сопроцессор и из него. По этой причине для каждого из трех типов данных, с которыми может работать сопроцессор, существует своя подгруппа команд передачи данных. Собственно на этом уровне все его умения по работе с различными форматами данных и заканчиваются. Главной функцией всех команд загрузки данных в сопроцессор является преобразование их к единому представлению в виде вещественного числа расширенного формата. Это же касается и обратной операции — сохранения в памяти данных из сопроцессора.
Команды передачи данных можно разделить на следующие группы:
- команды передачи данных в вещественном формате;
- команды передачи данных в целочисленном формате;
- команды передачи данных в двоично-десятичном формате.
Основными командами передачи данных являются
- команда FLD (загрузка данных в вершину стека сопроцессора);
- команда FST (сохранение вершины стека сопроцессора в память)
и их модификации.Команды передачи данных вещественного типа
Используются в случае если операнд, применяемый в команде, имеет вещественный тип (4, 8 или 10-байтный).
Команда | Операнды | Пояснение | Описание |
FLD | src | TOPSWR-=1; ST(0)=src; | Загрузка операнда в вершину стека |
FST | dst | dst=ST(0); | Сохранение вершины стека в память |
FSTP | dst | dst=ST(0); TOPSWR+=1; | Сохранение вершины стека в память с выталкиванием |
FXCH | ST(i) | ST(0) ST(i) | Обмен значений ST(0) и ST(i) |
Команды передачи данных целого типа Используются в случае если операнд, применяемый в команде, имеет целый тип (1, 2, 4 или 8-байтный).
Команда | Операнды | Пояснение | Описание |
FILD | src | TOPSWR-=1; ST(0)=src; | Загрузка операнда в вершину стека |
FIST | dst | dst=ST(0); | Сохранение вершины стека в память |
FISTP | dst | dst=ST(0); TOPSWR+=1; | Сохранение вершины стека в память с выталкиванием |
Команды передачи данных двоично-десятичного типа Используются в случае если операнд, применяемый в команде, представлен в двоично-десятичной системе счисления (1, 2, 4 или 8-байтный).
Команда | Операнды | Пояснение | Описание |
FBLD | src | TOPSWR-=1; ST(0)=src; | Загрузка операнда в вершину стека |
FBSTP | dst | dst=ST(0); TOPSWR+=1; | Сохранение вершины стека в память с выталкиванием |
Команды загрузки констант Команды загрузки констант не имеют операндов и загружают соответствующее константное значение в вершину стека сопроцессора.
Команда | Пояснение | Описание |
FLDZ | TOPSWR-=1; ST(0)=0; | Загрузка 0 |
FLD1 | TOPSWR-=1; ST(0)=1; | Загрузка 1 |
FLDPI | TOPSWR-=1; ST(0)=3.1415926535; | Загрузка π |
FLDL2T | TOPSWR-=1; ST(0)=3.3219280948; | Загрузка log210 |
FLDL2E | TOPSWR-=1; ST(0)=1.4426950408; | Загрузка log2e |
FLDLG2 | TOPSWR-=1; ST(0)=0.3010299956; | Загрузка lg 2 |
FLDLN2 | TOPSWR-=1; ST(0)=0.6931471805; | Загрузка ln 2 |
Разбор: что значат этот весь текст?
На 1 строчке: «format PE Console» — это строчка говорит FASM-у какой файл скомпилировать, точнее 1 слово, все остальные слова это аргументы (можно так сказать).
PE — EXE файл, программа.
Console — говорим что это у нас консольная программа, но вам некто не мешает сделать из консольной программы оконную и наоборот.
Но есть кроме это остальные:
-
format MZ — EXE-файл НО под MS-DOS
-
format PE — EXE-файл под Windows, аналогично format PE GUI 4.0
-
format PE64 — EXE-файл под Windows, 64 битное приложение.
-
format PE GUI 4.0 — EXE-файл под Windows, графическое приложение.
-
format PE Console — EXE-файл под Windows, консольная программа. (просто подключается заранее консоль)
-
format PE Native — драйвер
-
format PE DLL — DLL-файл Windows, поясню позднее.
-
format COFF — OBJ-файл Linux
-
format MS COFF — аналогично предыдущему
-
format ELF — OBJ-файл для gcc (Linux)
-
format ELF64 — OBJ-файл для gcc (Linux), 64-bit
Сразу за командой (для компилятора) идет это значит комментарий. К сожалению он есть только однострочный.
3 строка:
Говорим windows-у где\в каком месте стартовать. «start» это метка, но о метках чуть позже.
5 строка:
Подключает к проекту файл, в данном случае «win32a.inc» он находиться в папке INCLUDE (в папке с FASM). этот файл создает константы и создает макросы для облегчения программирования.
8 строка:
Секция данных, то есть программа делиться на секции (части), к этим секциям мы можем дать разрешение, имя.
Флаг «data» (Флаг это бит\байт\аргумент хранившей в себе какую-то информацию) говорит то что эта секция данных.
Флаги «readable writeable» говорят то что эта секция может читаться кем-то и записываться кем-то.
Текст ‘.data’ — имя секции
10 строка:
hello — это метка, она может быть любого имени (почти, есть некоторые зарезервированные имена), эта метка хранит в себе адрес строки, это не переменная, а просто адрес, но чтобы не запоминать адреса в ручную, помогает FASM он запоминает адрес и потом когда видит эту метку снова, то он заменяет слово на адрес.
db — говорит то что под каждый символ резервируем 1 байт. То есть 1 символ храниться в одном байте.
‘hello world!’ — наша строка в кодировке ASCII
Что значит «,0» в конце строки? — это символ с номером 0 (или просто ноль), у вас на клавиатуре нет клавиши которая имела символ с номером 0, по этому этот символ используют как показатель конца строки. То есть это значит конец строки. Просто ноль записываем в байт после строки.
12 строка:
Флаг «code» — говорит то что это секция кода.
Флаг «executable» — говорит то что эта секция исполняема, то есть в этой секции может выполняться код.
Все остальное уже разобрали.
14 строка:
Это второй вид меток. Просто эта метка указывает на следующую команду
Обратите внимание на то что в 3 строке мы указали start как метку входа в программу, это она и есть. Может иметь эта метка любое имя, главное не забудьте ваше новое имя метки вписать в
15 строка:
Функция printf — выводит текст\число в консоль. В данном случае текст по адресу «hello»
Это штото на подобие команды, но это и близко не команда ассемблера, а просто макрос.
Макрос — Это макро команда для компилятора, то есть вместо имени макроса подставляется что-то другое.
Например, макро команда invoke делиться на такие команды: (взят в пример команда с 15 строки)
Не переживайте если нечего не поняли.
17 строка:
getch — функция получения нажатой кнопки, то есть просто ждет нажатия кнопки и потом возвращает нажатую кнопку.
20 строка:
ExitProcess — WinAPI функция, она завершает программу. Она принимает значение, с которым завершиться, то есть код ошибки, ноль это нет ошибок.
23 строка:
Флаг «import» — говорит то что это секция импорта библиотек.
24-25 строки:
Макро команда «library» загружает DLL библиотеки в виртуальную память (не в ОЗУ, вам ОЗУ не хватит чтоб хранить всю виртуальную память).
Что такое DLL объясню позже.
kernel — имя которое привязывается к библиотеке, оно может быть любым.
Следующий текст после запятой: — это имя DLL библиотеки который вы хотите подключить.
Дальше есть знак это значит что текст на следующей строке нужно подставить в эту строку.
То есть код:
Заменяется на:
Это нужно потому что у ассемблера 1 строка это 1 команда.
27-28 строка:
— Макро команда, которая загружает функции из DLL.
— Имя к которой привязана DLL, может быть любым.
— Как будет называться функция в программе, это имя будет только в вашей программе, и по этому имени вы будете вызывать функцию. (WinAPI функция)
— Это имя функции которое будет загружено из DLL, то есть это имя функции которое прописано в DLL.
Дальше думаю не стоит объяснять, вроде все понятно.
Подробнее об адресах
Адрес может передаваться несколькими способами:
- В виде имени переменной, которая в ассемблере является синонимом адреса.
- Если переменная является массивом, то обращение к элементу массива происходит через имя его переменной и смещения. Для этого существует 2 формы: и <имя>. Следует учитывать, что смещение — это не индекс в массиве, а размер в байтах. Программисту самому необходимо понимать, на сколько нужно сделать смещение в байтах, чтобы получить нужный элемент массива.
- Можно использовать регистры. Для обращения к памяти, в которой хранится регистр, нужно использовать квадратные скобки: , .
- [] — квадратные скобки допускают применение сложных выражений внутри себя для вычисления адреса: .
В ассемблере адрес передается через квадратные скобки. Ввиду того, что переменная является также адресом, она может использоваться как с квадратными скобками, так и без.
Помимо этого, в ассемблер существуют сокращения: r — для регистров, m — для памяти и i — для операнда. Эти сокращения используются с числами 8, 16 и 32 для указания размера операнда: r8, m16, i32 и т. д.
add i8/i16/i32, m8/m16/m32 ;суммирование операнда с ячейкой памяти
Инструкции работы с битами
Мнемоника | Операнды | Описание | Операция | Флаги | Циклы |
LSL | Rd | Логический сдвиг влево | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1 |
LSR | Rd | Логический сдвиг вправо | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1 |
ROL | Rd | Циклический сдвиг влево через C | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1 |
ROR | Rd | Циклический сдвиг вправо через C | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1 |
ASR | Rd | Арифметический сдвиг вправо | Rd(n)=Rd(n+1), n=0,…,6 | Z,C,N,V,S | 1 |
SWAP | Rd | Перестановка тетрад | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | None | 1 |
BSET═ | s | Установка флага | SREG(s) = 1 | SREG(s) | 1 |
BCLR | s | Очистка флага | SREG(s) = 0 | SREG(s) | 1 |
SBI | P,b | Установить бит в порту | I/O(P,b) = 1 | None | 2 |
CBI | P,b | Очистить бит в порту | I/O(P,b) = 0 | None | 2 |
BST | Rr,b | Сохранить бит из регистра в T | T = Rr(b) | T | 1 |
BLD | Rd,b | Загрузить бит из T в регистр | Rd(b) = T | None | 1 |
SEC | Нет | Установить флаг переноса | C =1 | C | 1 |
CLC | Нет | Очистить флаг переноса | C = 0 | C | 1 |
SEN | Нет | Установить флаг отрицательного числа | N = 1 | N | 1 |
CLN | Нет | Очистить флаг отрицательного числа | N = 0 | N | 1 |
SEZ | Нет | Установить флаг нуля | Z = 1 | Z | 1 |
CLZ | Нет | Очистить флаг нуля | Z = 0 | Z | 1 |
SEI | Нет | Установить флаг прерываний | I = 1 | I | 1 |
CLI | Нет | Очистить флаг прерываний | I = 0 | I | 1 |
SES | Нет | Установить флаг числа со знаком | S = 1 | S | 1 |
CLN | Нет | Очистить флаг числа со знаком | S = 0 | S | 1 |
SEV | Нет | Установить флаг переполнения | V = 1 | V | 1 |
CLV | Нет | Очистить флаг переполнения | V = 0 | V | 1 |
SET | Нет | Установить флаг T | T = 1 | T | 1 |
CLT | Нет | Очистить флаг T | T = 0 | T | 1 |
SEH | Нет | Установить флаг внутреннего переноса | H = 1 | H | 1 |
CLH | Нет | Очистить флаг внутреннего переноса | H = 0 | H | 1 |
NOP | Нет | Нет операции | Нет | None | 1 |
SLEEP | Нет | Спать (уменьшить энергопотребление) | Смотрите описание инструкции | None | 1 |
WDR | Нет | Сброс сторожевого таймера | Смотрите описание инструкции | None | 1 |
Операции пересылки данных
Мнемоника | Описание | Операция | Флаги |
---|---|---|---|
MOV Rd, Rr | Пересылка между регистрами | Rd ← Rr | — |
MOVW Rd, Rr | Пересылка между парами регистров | R(d +1):Rd ← R(r+1):Rr | — |
LDI Rd, K | Загрузка константы в регистр | Rd ← K | — |
LD Rd, X | Косвенное чтение | Rd ← | — |
LD Rd, X+ | Косвенное чтение с пост-инкрементом | Rd ← , X ← X + 1 | — |
LD Rd, -X | Косвенное чтение с пред-декрементом | X ← X — 1, Rd ← | — |
LD Rd, Y | Косвенное чтение | Rd ← | — |
LD Rd, Y+ | Косвенное чтение с пост-инкрементом | Rd ← , Y ← Y + 1 | — |
LD Rd, -Y | Косвенное чтение с пред-декрементом | Y ← Y — 1, Rd ← | — |
LDD Rd, Y+q | Косвенное чтение со смещением | Rd ← | — |
LD Rd, Z | Косвенное чтение | Rd ← | — |
LD Rd, Z+ | Косвенное чтение с пост-инкрементом | Rd ← , Z ← Z + 1 | — |
LD Rd, -Z | Косвенное чтение с пред-декрементом | Z ← Z — 1, Rd ← | — |
LDD Rd, Z+q | Косвенное чтение со смещением | Rd ← | — |
LDS Rd, A | Непосредственное чтение из ОЗУ | Rd ← | — |
ST X, Rr | Косвенная запись | ← Rr | — |
ST X+, Rr | Косвенная запись с пост-инкрементом | ← Rr, X ← X + 1 | — |
ST -X, Rr | Косвенная запись с пред-декрементом | X ← X — 1, ← Rr | — |
ST Y, Rr | Косвенная запись | ← Rr | — |
ST Y+, Rr | Косвенная запись с пост-инкрементом | ← Rr, Y ← Y + 1 | — |
ST -Y, Rr | Косвенная запись с пред-декрементом | Y ← Y — 1, ← Rr | — |
STD Y+q, Rr | Косвенная запись со смещением | ← Rr | — |
ST Z, Rr | Косвенная запись | ← Rr | — |
ST Z+, Rr | Косвенная запись с пост-инкрементом | ← Rr, Z ← Z + 1 | — |
ST -Z, Rr | Косвенная запись с пред-декрементом | Z ← Z — 1, ← Rr | — |
STD Z+q, Rr | Косвенная запись со смещением | ← Rr | — |
STS A, Rr | Непосредственная запись в ОЗУ | ← Rr | — |
LPM | Загрузка данных из памяти программы | R0 ← {Z} | — |
LPM Rd, Z | Загрузка данных из памяти программы в регистр | Rd ← {Z} | — |
LPM Rd, Z+ | Загрузка данных из памяти программы с пост-инкрементом Z | Rd ← {Z}, Z ← Z + 1 | — |
SPM | Запись в программную память | {Z} ← R1:R0 | — |
IN Rd, P | Пересылка из I/O-регистра в регистр | Rd ← P | — |
OUT P, Rr | Пересылка из регистра в I/O-регистр | P ← Rr | — |
PUSH Rr | Сохранение регистра в стеке | STACK ← Rr | — |
POP Rd | Извлечение регистра из стека | Rd ← STACK | — |
Идентификаторы, целые числа, символы, комментарии, эквивалентность
Идентификатор в языке программирования ассемблер имеет такой же смысл, как и в любом другом. Допускается использование латинских букв, цифр и символов «_», «.», «?», «@», «$». При этом прописные и строчные буквы эквивалентны, а точка может быть только первым символом идентификатора.
Целые числа в ассемблере можно указывать в системах отсчета с основаниями 2, 8, 10 и 16. Любая другая запись чисел будет рассматриваться компилятором ассемблера в качестве идентификатора.
В записи символьных данных допускается использовать как апострофы, так и кавычки. Если в символьной строке требуется указать один из них, то правила следующие:
- в строке, заключенной в апострофы, кавычки указываются один раз, апостроф — дважды: ‘can»t’, ‘ he said «to be or not to be» ‘;
- для строки, заключенной в кавычки, правило обратное: дублируются кавычки, апострофы указываются как есть: «couldn’t», » My favourite bar is «»Black Cat»» «.
Для указания комментирования в языке ассемблер используется символ точка с запятой — «;». Допустимо использовать комментарии как в начале строк, так и после команды. Заканчивается комментарий переводом строки.
Директива эквивалентности используется схожим образом тому, как в других языках указывают константные выражения. Эквивалентность указывается следующим способом:
<name> EQU <operand>
Таким образом в программе все вхождения <name> будут заменяться на <operand>, на месте которого допустимо указывать целое число, адрес, строку или другое имя. Директива EQU похожа по своей работе на #define в языке С++.
Команды сравнения данных
Команды данной группы выполняют сравнение значений числа в вершине стека и операнда, указанного в команде.Команды сравнения данных вещественного типа
Команда | Операнды | Пояснение | Описание |
FCOM FUCOM | src | ST(0) — src | Вещественное сравнение |
FCOMP FUCOMP | src | ST(0) — src; TOPSWR+=1; | Вещественное сравнение с выталкиванием |
FCOMPP FUCOMPP | — | ST(0) — ST(1); TOPSWR+=2; | Вещественное сравнение с двойным выталкиванием |
FCOMI FUCOMI | ST, ST(i) | ST(0) — ST(i) | Вещественное сравнение c модификацией EFLAGS |
FCOMIP FUCOMIP | ST, ST(i) | ST(0) — ST(i); TOPSWR+=1; | Вещественное сравнение c выталкиванием с модификацией EFLAGS |
FXAM | — | Анализ ST(0) |
Команды сравнения сравнивают значение в вершине стека с операндом. По умолчанию (если операнд не задан) происходит сравнение регистров ST(0) и ST(1). В качестве операнда может быть задана ячейка памяти или регистр. Команда устанавливает биты C0, C2, C3 регистра swr в соответствии с таблицей. Сбрасывает в 0 признак C1 при пустом стеке после выполнения команды.
Условие | С3 | С2 | C0 |
ST(0) > src | |||
ST(0) < src | 1 | ||
ST(0) = src | 1 | ||
Недопустимая операция (#IA) | 1 | 1 | 1 |
Особый интерес представляет команда FCOMI (FUCOMI). Она сравнивает содержимое регистра ST(0) со значением операнда ST(i) и устанавливает биты ZF, PF, CF регистра в соответствии с таблицей. Анализ выполнения сравнения осуществляет последующая команда условного перехода (команда центрального процессора).
Условие | ZF | PF | CF | Переход |
ST(0) > ST(i) | ja | |||
ST(0) < ST(i) | 1 | jb | ||
ST(0) = ST(i) | 1 | je | ||
ST(0) >= ST(i) | * | jae | ||
ST(0) <= ST(i) | * | * | jbe | |
Недопустимая операция (#IA) | 1 | 1 | 1 |
Команда FXAM проверяет содержимое регистра ST(0) и устанавливает биты C0, C2, C3 регистра swr в соответствии с таблицей. Бит C1 устанавливается равным знаковому биту ST(0).
Класс | С3 | С2 | C0 |
Неподдерживаемый формат | |||
Нечисло (NaN) | 1 | ||
Конечное число | 1 | ||
Бесконечность | 1 | 1 | |
Ноль | 1 | ||
Пустой регистр | 1 | 1 | |
Ненормированное число | 1 | 1 |
Команды сравнения данных целого типа
Команда | Операнды | Пояснение | Описание |
FICOM | src | ST(0) — src | Cравнение с целым числом src |
FICOMP | src | ST(0) — src; TOPSWR+=1; | Cравнение с целым числом src с выталкиванием |
FTST | — | ST(0)-0; | Анализ ST(0) (сравнение с нулем) |
Исходные коды
Компилятор работает с исходными файлами, содержащими инструкции,
метки и директивы. Инструкции и директивы, как правило, имеют один
или несколько операндов.
Строка кода не должна быть длиннее 120 символов.
Любая строка может начинаться с метки, которая является набором
символов заканчивающимся двоеточием. Метки используются для указания
места, в которое передаётся управление при переходах, а также для
задания имён переменных.
Входная строка может иметь одну из четырёх форм:
Комментарий имеет следующую форму:
Позиции в квадратных скобках необязательны. Текст после точки с
запятой (;) и до конца строки игнорируется компилятором. Метки,
инструкции и директивы более детально описываются ниже.
Примеры:
Компилятор не требует чтобы метки, директивы, комментарии или
инструкции находились в определённой колонке строки.
Краткий Курс AVR — Самоучитель
Микроконтроллер AVR
|
Страницы курса :
Задачи-упражнения курса по
AVR — там
Резервные адреса курса
pid.by.ru и
ProAVR.narod.ru
Страницы курса имеют
адреса типа
/02.htm /03.htm /04.htm
а задачи имеют такие адреса
/z1.htm
/z2.htm /z11.htm эти адреса следуют за адресом
курса —
avr123.nm.ru/z5.htm
Найти на
открытой странице —
Ctrl + F «что ищите»
Скачать
книги по AVR и электронике
Библиотека
Курс подробно рассказывает как
сделать самые первые шаги,
с чего начать не вообще, а конкретно — ШАГ за ШАГОМ …
— Как сделать нужное вам
электронное устройство, печатную плату
— Как написать первую, простейшую программу для МК
— Как запустить эту программу в программе-симуляторе МК и увидеть
как
она работает не покупая МК и радиодеталей,
а значит без риска
спалить что-то или испортить порт вашего ПК !
— Как загрузить программу в
реальный МК .
—
Как отладить реальное
устройство — т.е. найти причины не правильной работы
и добиться его функционирования в соответствии с поставленной
задачей.
Команды ассемблера и команды процессора.
Стоит пояснить, что если к вопросу подойти формально строго, то команды процессора и команды ассемблера — это не одно и то же. Ассеммблер — хоть и низкоуровневый язык программирования, но иногда он без спроса программиста «корректирует код под себя». Причём у каждого ассемблера (masm, tasm, fasm) это может быть по-разному. Самый яркий пример — команда ret. В ассемблерном коде мы запишем ret, а реальный ассемблер ассемблирует её как retf или retn 8. Может также изменяться код, добавлением в качестве выравнивания кода команды процессора nop (об этом ниже в статье) и т.п. Чтобы не усложнять суть вопроса, под понятиями команды процессора и команды ассемблера мы будем подразумевать одно и то же.
Команды процессора (команды ассемблера) в большинстве своём работают с аргументами, которые в ассемблере называются операндами. Система машинного кода процессоров Intel содержит более 300 команд (команды процессора, сопроцессора, MMX-расширения, XMM-расширения). С каждым новым процессором их количество растёт. Для того, чтобы профессионально программировать, не надо зубрить и разбирать все команды процессора. При необходимости можно воспользоваться справочником. В процессе чтения статей, вы поймёте, что основная суть знания ассемблера состоит не в доскональном знании всех команд, а в понимании работы системы.
Не следует забывать, что команды процессор видит в виде цифр, которые можно рассматривать как данные. Например, команда NOP занимает один байт и её машинный код — 90h.
Начиная изучать язык низкого уровня, мы будем иметь дело с ограниченным набором старых-добрых команд процессора. Иные команды ассемблера понадобятся специалистам, заинтересованным в оптимизацией кода, связанного со сложными математическими расчетами данных большого объёма.
Основные (т.н. целочисленные) команды ассемблера позволяют написать практически любую программу для операционных систем MS-DOS и Windows. Количество команд ассемблера, которыми вы будете пользоваться будет расти со временем прохождения курса. Для более детального понимания, в последствии можете обратиться к справочнику команд.
List of abbreviations
Category | Abbrev. | Means … | Value range |
---|---|---|---|
Register | r1 | Ordinary Source and Target register | R0..R31 |
r2 | Ordinary Source register | ||
rh | Upper page register | R16..R31 | |
rd | Twin register | R24(R25), R26(R27), R28(R29), R30(R31) | |
rp | Pointer register | X=R26(R27), Y=R28(R29), Z=R30(R31) | |
ry | Pointer register with displacement | Y=R28(R29), Z=R30(R31) | |
Constant | k63 | Pointer-constant | 0..63 |
c127 | Conditioned jump distance | -64..+63 | |
c255 | 8-Bit-Constant | 0..255 | |
c4096 | Relative jump distance | -2048..+2047 | |
c65535 | 16-Bit-Address | 0..65535 | |
Bit | b7 | Bit position | 0..7 |
Port | p1 | Ordinary Port | 0..63 |
pl | Lower page port | 0..31 |
2002 by http://www.avr-asm-tutorial.net
Быть или не быть?
Так, нужно ли изучать ассемблер современному программисту? Если вы уже не новичок в программировании, и у вас серьёзные амбиции, то изучение ассемблера, внутреннего устройства операционных систем и функционирования железа (особенно процессоров, памяти), а также использование различных инструментов для дизассемблирования, отладки и анализа кода полезно тем, кто хочет писать действительно эффективные программы. Иначе будет сложно в полной мере понять, что происходит «под капотом» любимого компилятора (хотя бы в общих чертах), как оптимизировать программы на любом языке программирования и какой приём стоит предпочесть. Необязательно погружаться слишком глубоко в эту тему, если вы пишете на Python или JavaScript. А вот если ваш язык – C или C++, хорошенько изучить ассемблер будет полезно.
Вместе с тем, необходимо помнить не только о «тактике», но и о «стратегии» написания кода, поэтому не менее важно изучать и алгоритмы (правильный выбор которых зачастую более важен для создания эффективных программ, нежели низкоуровневая оптимизация), шаблоны проектирования и многие другие технологии, без которых программист не может считать себя современным
О программе
В SASM Вы можете легко разрабатывать и выполнять программы, написанные на языках ассемблера NASM, MASM, GAS, FASM. Вводите код в форму и запускайте приложение. В Windows также возможен запуск приложения в отдельном окне. Входные данные указывайте в поле «Ввод». В поле «Вывод» Вы сможете увидеть результат работы программы. При этом все сообщения и ошибки компиляции будут выводиться в форму снизу. Вы можете сохранять исходный или скомпилированный (exe) код программы в файл, а также загружать свои программы из файла.
Программа поддерживает работу с несколькими проектами – новые файлы открываются и создаются в новых вкладках. При выходе из программы текущий набор открытых файлов сохраняется. При следующем запуске Вы сможете восстановить предыдущую сессию. В параметрах настраивается шрифт, цветовая схема и текст, отображающийся при создании нового файла. Интерфейс программы доступен на восьми языках (русский, английский, турецкий (спасибо Ali Goren), китайский (спасибо Ahmed Zetao Yang), немецкий (спасибо Sebastian Fischer), итальянский (спасибо Carlo Dapor), польский (спасибо Krzysztof Rossa), иврит (спасибо Elian Kamal), испанский (спасибо Mariano Cordoba)). Все окна в программе плавающие, с возможностью закрепления в одной из множества позиций. Имеется возможность переназначения горячих клавиш.
Стандартное меню «Правка» дополнено возможностью комментирования/раскомментирования выделенного куска кода и создания/удаления отступа в 4 пробела (Tab/Shift+Tab).
В SASM вы можете находить ошибки в своих программах с помощью интерфейса к отладчику gdb. В программе можно просматривать значения регистров и переменных, а также устанавливать точки останова и перемещаться по отлаживаемой программе. Дополнительно имеется возможность выполнять произвольные команды отладчика gdb, результаты которых будут отображаться в логе.
SASM полностью поддерживает работу с четырьмя ассемблерами NASM, MASM, GAS, FASM в двух режимах — x64 и x86, переключаться между которыми можно в настройках на вкладке «Построение». Там же можно изменить опции ассемблера и компоновщика и выбрать, какие программы будут использоваться для ассемблирования и компоновки.
Итоги
- Изложенный метод вряд ли подойдет для работы над большим проектом с участием целой команды. Контроль версий, диффы и т.д. все равно придется решать на стороне.
- В режиме отладки очень неудобно без двух мониторов. Сама отладка ведется в студии, а блок-схема в Excel. Это разные окна, требуются переключения.
- Программа быстро пухнет в горизонтальном направлении. При этом в Excel прокрутка в сторону грубая и неудобная.
- Болезнь блок-схема как таковых – много пустого места. Для комфортной работы на одном экране разрешением 1280х1024 должно быть около 5 столбиков и 45 строк с информативными ячейками. Не более 20% от этого количества будет заполнено самими командами (это 45 команд). Остальное пространство – жертва визуальному представлению и комментариям. Примерно столько же команд помещается в окно студии на один экран.
- Проектирование алгоритма «сверху вниз» складывается очень естественно. Объявляем только имена и переходы.
- Код в Excel можно открыть в несколько окон. В Atmel Studio доступно только разделение экрана по горизонтали.
- Сокращение рутинных действий при работе с именованными сущностями.
- Контроль меток не требует внимания. Переместили или переименовали метку – все переходы автоматически получат изменения. Удаление метки приведет к ошибке, которую легко найти визуально.
- Excel как транслятор очень просто расширять новыми функциями. Что-то доступно через формулы, что-то – через макросы VBA.
Точки роста
Оптимизация работы с метками и переходами. Если в итоговом листинге команда «Переход на метку» расположена прямо над самой меткой, команду с переходом можно убрать. Освободим 4-5 тактов. Если конструкция вида «Переход на метку А – Метка А – Переход на метку Б – Метка Б» не содержит внутри никаких команд, то «Переход на метку Б» убираем, а «Переход на метку А» меняем на «Переход на метку Б». Также сэкономим 4-5 тактов.
Дополнительные проверки на ошибки. Макросом легко организовать проверку, нет ли «висящих» блоков, которые не кончаются переходами
Также макросом можем найти и удалить неиспользованные метки, которые при отладке отвлекают внимание.
Можно ввести собственные правила раскрашивания ячеек. Если бы табличный процессор был встроен в студию как редактор кода, то производить отладку сразу на такой блок-схеме было бы очень удобно