Ассемблер для avr

Инструментарий

Дальнейшее теоретическое изучение ассемблера может быть трудным, поэтому стоит задуматься об инструментах, используемых для разработки программ с его помощью. Здесь будет приведен лишь краткий список популярных средств:

  • 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.

Дальше думаю не стоит объяснять, вроде все понятно.

Подробнее об адресах

Адрес может передаваться несколькими способами:

  1. В виде имени переменной, которая в ассемблере является синонимом адреса.
  2. Если переменная является массивом, то обращение к элементу массива происходит через имя его переменной и смещения. Для этого существует 2 формы: и <имя>. Следует учитывать, что смещение — это не индекс в массиве, а размер в байтах. Программисту самому необходимо понимать, на сколько нужно сделать смещение в байтах, чтобы получить нужный элемент массива.
  3. Можно использовать регистры. Для обращения к памяти, в которой хранится регистр, нужно использовать квадратные скобки: , .
  4. [] — квадратные скобки допускают применение сложных выражений внутри себя для вычисления адреса: .

В ассемблере адрес передается через квадратные скобки. Ввиду того, что переменная является также адресом, она может использоваться как с квадратными скобками, так и без.

Помимо этого, в ассемблер существуют сокращения: 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
,  ATmega и ATtiny для начинающих с
нуля ! 


Быстрый и уверенный старт —
               

самые первые
шаги


Чайникам  от  Чайника !


Учимся на примерах.


  …
и 
конечно с картинками
!

 

Страницы курса :  
  
  
  
  
  
  
  
  

Задачи-упражнения курса по
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, переключаться между которыми можно в настройках на вкладке «Построение». Там же можно изменить опции ассемблера и компоновщика и выбрать, какие программы будут использоваться для ассемблирования и компоновки.

Итоги

  1. Изложенный метод вряд ли подойдет для работы над большим проектом с участием целой команды. Контроль версий, диффы и т.д. все равно придется решать на стороне.
  2. В режиме отладки очень неудобно без двух мониторов. Сама отладка ведется в студии, а блок-схема в Excel. Это разные окна, требуются переключения.
  3. Программа быстро пухнет в горизонтальном направлении. При этом в Excel прокрутка в сторону грубая и неудобная.
  4. Болезнь блок-схема как таковых – много пустого места. Для комфортной работы на одном экране разрешением 1280х1024 должно быть около 5 столбиков и 45 строк с информативными ячейками. Не более 20% от этого количества будет заполнено самими командами (это 45 команд). Остальное пространство – жертва визуальному представлению и комментариям. Примерно столько же команд помещается в окно студии на один экран.
  1. Проектирование алгоритма «сверху вниз» складывается очень естественно. Объявляем только имена и переходы.
  2. Код в Excel можно открыть в несколько окон. В Atmel Studio доступно только разделение экрана по горизонтали.
  3. Сокращение рутинных действий при работе с именованными сущностями.
  4. Контроль меток не требует внимания. Переместили или переименовали метку – все переходы автоматически получат изменения. Удаление метки приведет к ошибке, которую легко найти визуально.
  5. Excel как транслятор очень просто расширять новыми функциями. Что-то доступно через формулы, что-то – через макросы VBA.

Точки роста

Оптимизация работы с метками и переходами. Если в итоговом листинге команда «Переход на метку» расположена прямо над самой меткой, команду с переходом можно убрать. Освободим 4-5 тактов. Если конструкция вида «Переход на метку А – Метка А – Переход на метку Б – Метка Б» не содержит внутри никаких команд, то «Переход на метку Б» убираем, а «Переход на метку А» меняем на «Переход на метку Б». Также сэкономим 4-5 тактов.
Дополнительные проверки на ошибки. Макросом легко организовать проверку, нет ли «висящих» блоков, которые не кончаются переходами

Также макросом можем найти и удалить неиспользованные метки, которые при отладке отвлекают внимание.
Можно ввести собственные правила раскрашивания ячеек. Если бы табличный процессор был встроен в студию как редактор кода, то производить отладку сразу на такой блок-схеме было бы очень удобно