Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LK_MashZavYP_Akchurin_2011.pdf
Скачиваний:
191
Добавлен:
10.06.2015
Размер:
8.79 Mб
Скачать

7.2. Ассемблер

Ассемблер преобразовывает (транслирует) исходные файлы ассемблера в объектные файлы в машинном коде. Эти файлы находятся в общем формате объектного файла (COFF). Исходные файлы могут содержать следующие инструкции ассемблера:

346

Директивы Ассемблера.

Макро директивы.

Команды ассемблера.

Формат инструкций исходника

Компилятор работает с исходными файлами, содержащими инструкции, метки и директивы. Инструкции и директивы, как правило, имеют один или несколько операндов.

Строка кода не должна быть длиннее 120 символов.

Строка ассемблерного кода завершается символом Enter. Строка содержит поля, разделенные пробелами. Строка может иметь одну из 4 форм:

[метка:] директива [операнды] [Комментарий]

[метка:] инструкция [операнды] [Комментарий]

Комментарий

Пустая строка

Позиции, указанные в квадратных скобках, необязательны. Ассемблер не различает регистр символов.

Любая строка может начинаться с метки, которая является набором символов, заканчивающимся двоеточием. Метки используются для указания места, в которое передаётся управление при переходах, а также для задания имён переменных.

Операнды разделяются запятыми (без пробелов).

Текст после точки с запятой (;) и до конца строки – это комментерий. Он игнорируется компилятором. Комментарий имеет следующую форму:

; [Текст]

Компилятор не требует, чтобы метки, директивы, комментарии или инструкции находились в определённой колонке строки.

Примеры:

label: .EQU var1=100 ; Устанавливает var1=100 (это помеченная директива).

.EQU var2=200 ; Устанавливает var2=200 (это директива). ; Строка с одним только комментарием

347

7.2.1. Команды ассемблера

Операнды в командах могут быть таких видов:

Rd: Результирующий (и исходный) регистр в регистровом файле

Rr: Исходный регистр в регистровом файле

b: Константа (3 бита), может быть константное выражение

s: Константа (3 бита), может быть константное выражение

P: Константа (5-6 бит), может быть константное выражение

K6; Константа (6 бит), может быть константное выражение

K8: Константа (8 бит), может быть константное выражение

k: Константа (размер зависит от инструкции), может быть константное выражение

q: Константа (6 бит), может быть константное выражение

Rdl:═ R24, R26, R28, R30. Для инструкций ADIW и SBIW

X,Y,Z: Регистры косвенной адресации (X=R27:R26, Y=R29:R28, Z=R31:R30)

Используемые обозначения:

Символика

Назначение

 

 

Комментарий

SREG

Регистр состояния

 

Адрес $3F

C

Флаг переноса

 

 

Разряд 0 в регистре SREG

Z

Флаг нулевого результата

Разряд 1 в регистре SREG

N

Флаг отрицательного результата

Разряд 2 в регистре SREG

V

Флаг переполнения

 

Разряд 3 в регистре SREG

S

Флаг знака

 

 

Разряд 4 в регистре SREG

II

Флаг половинного переноса

Разряд 5 в регистре SREG

T

Флаг копирования

 

Разряд 6 в регистре SREG

I

Флаг разрешения прерываний

Разряд 7 в регистре SREG

Rd

Регистр назначения

 

 

Rr

Регистр передающий

 

 

R

Регистр результата

 

 

Kn

n-битная константа

 

 

X, Y, Z

Указатели

при

косвенной

X = R27:R26

 

адресации

 

 

Y = R29:R28

 

 

 

 

Z = R31:R30

Rdl

Младший байт регистровой пары

Пара Rdh:Rdl

Rdh

Старший байт регистровой пары

Пара Rdh:Rdl

P

Адрес порта ввода/вывода

 

348

q

Смещение

при

косвенной

 

 

адресации

 

 

 

Стек

Область памяти для

хранения

 

 

адреса возврата или промежу-

 

 

точного значения

 

 

SP

Указатель стека

 

 

X

Обозначает разряды, устанавли-

 

 

ваемые ассемблером в 0.

 

Команды условного перехода c учетом знака.

Условие

Команда

Пояснение

 

Rd ≥ Rr ?

brge

Переход, если Rd ≥Rr (S=0)

 

Rd = Rr ?

breq

Переход, если Rd = Rr (Z=1)

 

Rd < Rr ?

brlt

Переход, если Rd < Rr (S=1)

 

Команды прямого опроса флагов.

 

 

 

 

 

Условие

 

Команда

 

Пояснение

C ?

 

brcs

 

Переход по переносу (C = 1)

C ?

 

brcc

 

Переход, если переноса нет (C = 0)

Z ?

 

breq

 

Переход по нулю (Z = 1)

Z ?

 

brne

 

Переход по не нулю (Z = 0)

N ?

 

brmi

 

Переход по минусу (N = 1)

N ?

 

brpl

 

Переход по плюсу(N = 0)

V ?

 

brvs

 

Переход по переполнению (V = 1)

V ?

 

brvc

 

Переход, если переполнения нет (V = 0)

Арифметические и логические команды.

Мнемоника

Описание

Действие

Циклы

Примеч.

ADD Rd,Rr

Сложить

Rd < Rd+Rr

1

 

 

ADDI Rd,K

Сложить

Rd < Rd+K

1

 

 

 

с константой

 

 

 

 

ADС Rd,Rr

Сложить с переносом

Rd < Rd+Rr+С

1

 

 

ADСI Rd,Rr

Сложить константу

Rd < Rd+K+С

1

 

 

 

с переносом

 

 

 

 

ADW Rdl,Rr

Сложить слово

Rdh,l < Rdh,l+K

2

Rdl

-

 

с константой

 

 

парный

 

SUB Rd,Rr

Вычесть

Rd < Rd-Rr

1

 

 

349

SUBI Rd,K

Вычесть константу

Rd <- Rd-K

1

 

 

 

 

 

SBС Rd,Rr

Вычесть с переносом

Rd < Rd-Rr-С

1

 

 

 

 

 

SBСI Rd,Rr

Вычесть константу

Rd < Rd-K-С

1

 

 

 

 

 

 

с переносом

 

 

 

 

 

 

 

 

SBW Rdl,Rr

Вычесть слово

Rdh,l <- Rdh,l-K

2

 

Rdl

-

 

 

с константой

 

 

 

 

парный

 

 

AND Rd,Rr

Логическое И

Rd < Rd AND Rr

1

 

 

 

 

 

ANDI Rd,K

Логическое И

Rd < Rd AND K

1

 

 

 

 

 

 

с константой

 

 

 

 

 

 

 

 

OR Rd,Rr

Логическое ИЛИ

Rd < Rd OR Rr

1

 

 

 

 

 

ORI Rd,K

Логическое ИЛИ

Rd < Rd OR K

1

 

 

 

 

 

 

с константой

 

 

 

 

 

 

 

 

EOR Rd,Rr

Исключающее ИЛИ

Rd < Rd XOR Rr

1

 

 

 

 

 

COM Rd

Дополнение до 1

Rd < $FF-Rd

1

 

 

 

 

 

NEG Rd

Дополнение до 2

Rd < $00-Rd

1

 

 

 

 

 

SBR Rd,K

Установить биты

Rd < Rd OR K

1

 

 

 

 

 

CBR Rd,K

Сбросить биты

Rd < Rd AND K

1

 

 

 

 

 

INC Rd

Увеличить на 1

Rd < Rd+1

1

 

 

 

 

 

DEC Rd

Уменьшить на 1

Rd < Rd-1

1

 

 

 

 

 

TST Rd

Проверить на 0

Rd < Rd AND Rd

1

 

 

 

 

 

 

или 1

 

 

 

 

 

 

 

 

CLR Rd

Очистить

Rd < Rd XOR Rd

1

 

Все 0

 

 

ER Rd

Установить

Rd < $FF

1

 

Все 1

 

 

Команды ветвления.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Мнемоника

Описание

 

Действие

Флаги

 

Циклы

 

RJMP k

Относительный переход

PC < PC+k+1

Нет

 

2

 

 

LJMP k

Переход по адресу (Z)

 

PC < Z

Нет

 

2

 

 

RCALL k

Относительный вызов

PC < PC+k+1

Нет

 

3

 

 

 

подпрограммы

 

 

 

 

 

 

 

 

ICALL

Вызов подпрограммы по

PC < Z

Нет

 

3

 

 

 

адресу (Z)

 

 

 

 

 

 

 

 

RET

Выход

 

PC < STACK

Нет

 

4

 

 

 

из подпрограммы

 

 

 

 

 

 

 

 

RETI

Выход из прерывания

 

PC < STACK

I

 

4

 

 

CPSE Rd,Rr

Сравнить, пропуск

 

If(Rd=Rr)

Z,N,V,C,H

 

1/2

 

 

 

при равно

 

PC<PC+2 или 3

 

 

 

 

 

 

CP Rd,Rr

Сравнить

 

Rd-Rr

Z,N,V,C,H

 

1

 

 

350

CPC Rd,Rr

Сравнить

 

 

Rd-Rr-C

Z,N,V,C,H

1

 

с прерыванием

 

 

 

 

CPI Rd,K

Сравнить с константой

Rd-C

Z,N,V,C,H

1

SBRC Rr,b

Пропуск, если в Rr

If(Rr(b)=0)

Нет

1/2

 

бит b сброшен

 

PC<PC+2 или 3

 

 

SBRS Rr,b

Пропуск, если в Rr

If(Rr(b)=1)

Нет

1/2

 

бит b установлен

PC<PC+2 или 3

 

 

SBIC P,b

Пропуск, если в регист-

If(P(b)=0)

Нет

1/2

 

ре ввода/вывода P бит b

PC<PC+2 или 3

 

 

 

сброшен

 

 

 

 

 

SBIS P,b

Пропуск, если в регист-

If(P(b)=1)

Нет

1/2

 

ре ввода/вывода P бит b

PC<PC+2 или 3

 

 

 

установлен

 

 

 

 

BRBS s,k

Переход, если в SREG

If(SREG(s)=1)

Нет

1/2

 

установлен флаг s

PC<PC+1+k

 

 

BRBS s,k

Переход, если в SREG

If(SREG(s)=0)

Нет

1/2

 

сброшен флаг s

 

PC<PC+1+k

 

 

BREQ k

Переход, если равно

If(Z=1)

Нет

1/2

 

 

 

 

PC<PC+1+k

 

 

BRNE k

Переход, если не равно

If(Z=0)

Нет

1/2

 

 

 

 

PC<PC+1+k

 

 

BRCS k

Переход,

если

перенос

If(C=1)

Нет

1/2

 

установлен

 

PC<PC+1+k

 

 

BRCC k

Переход,

если

перенос

If(C=0)

Нет

1/2

 

сброшен

 

 

PC<PC+1+k

 

 

BRSH k

Переход,

если

равно

If(C=0)

Нет

1/2

 

или больше

 

PC<PC+1+k

 

 

BRLO k

Переход, если меньше

If(C=1)

Нет

1/2

 

 

 

 

PC<PC+1+k

 

 

BRMI k

Переход, если минус

If(N=1)

Нет

1/2

 

 

 

 

PC<PC+1+k

 

 

BRPL k

Переход, если плюс

If(N=0)

Нет

1/2

 

 

 

 

PC<PC+1+k

 

 

BRGE k

Переход,

если

больше

If(N XOR V=0)

Нет

1/2

 

или равно

 

 

PC<PC+1+k

 

 

BRLT k

Переход,

 

 

If(N XOR V=1)

Нет

1/2

 

если меньше 0

 

PC<PC+1+k

 

 

BRHS k

Переход,

если

флаг H

If(H=1)

Нет

1/2

351

 

установлен

 

 

PC<PC+1+k

 

 

 

 

BRHC k

Переход,

если

флаг

H

If(H=0)

 

 

Нет

1/2

 

сброшен

 

 

 

PC<PC+1+k

 

 

 

 

BRTS k

Переход,

если

флаг

T

If(H=1)

 

 

Нет

1/2

 

установлен

 

 

PC<PC+1+k

 

 

 

 

BRTC k

Переход,

если

флаг

T

If(H=0)

 

 

Нет

1/2

 

сброшен

 

 

 

PC<PC+1+k

 

 

 

 

BRVS k

Переход,

если

флаг

V

If(H=1)

 

 

Нет

1/2

 

установлен

 

 

PC<PC+1+k

 

 

 

 

BRVC k

Переход,

если

флаг

V

If(H=0)

 

 

Нет

1/2

 

сброшен

 

 

 

PC<PC+1+k

 

 

 

 

BRIE k

Переход, если

 

 

If(I=1)

 

 

Нет

1/2

 

прерывания азрешены

PC<PC+1+k

 

 

 

 

BRID k

Переход, если

 

 

If(I=0)

 

 

Нет

1/2

 

прерывания запрещены

PC<PC+1+k

 

 

 

 

Команды пересылок.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Мнемоника

Описание

 

 

 

 

Действие

 

Флаги

Циклы

MOV Rd,Rr

Пересылка между регистрами

Rd < Rr

 

Нет

1

LDI Rd,K

Загрузить константу

 

 

Rd < K

 

Нет

1

LD Rd,X

Загрузить регистр

 

 

Rd < (X)

 

Нет

2

 

непосредственно

 

 

 

 

 

 

 

LD Rd,X+

Загрузить

регистр

непосредст-

Rd < (X)

 

Нет

2

 

венно с постинкрементом

 

X < X+1

 

 

 

LD Rd,-X

Загрузить

регистр

непосредст-

X < X-1

 

Нет

2

 

венно с предварительным декре-

Rd < (X)

 

 

 

 

ментом

 

 

 

 

 

 

 

 

 

LD Rd,Y

Загрузить регистр

 

 

Rd < (Y)

 

Нет

2

 

непосредственно

 

 

 

 

 

 

 

LD Rd,Y+

Загрузить

регистр

непосредст-

Rd < (Y)

 

Нет

2

 

венно с постинкрементом

 

Y < Y+1

 

 

 

LD Rd,-Y

Загрузить

регистр

непосредст-

Y < Y-1

 

Нет

2

 

венно с предварительным декре-

Rd < (Y)

 

 

 

 

ментом

 

 

 

 

 

 

 

 

 

LDD Rd,Y+q

Загрузить

регистр

непосредст-

Rd < (Y+k)

Нет

2

 

венно по адресу в Y со смещени-

 

 

 

 

 

 

ем q

 

 

 

 

 

 

 

 

 

LD Rd,Z

Загрузить регистр

 

 

Rd < (Z)

 

Нет

2

352

 

непосредственно

 

 

 

 

LD Rd,Z+

Загрузить

регистр

непосредст-

Rd < (Z)

Нет

2

 

венно с постинкрементом

Z < Z+1

 

 

LD Rd,-Z

Загрузить

регистр

непосредст-

Z < Z-1

Нет

2

 

венно с предварительным декре-

Rd < (Z)

 

 

 

ментом

 

 

 

 

 

LDD Rd,Z+q

Загрузить

регистр

непосредст-

Rd < (Z+k)

Нет

2

 

венно со смещением

 

 

 

 

LDS Rd,k

Загрузить регистр из ОЗУ по ад-

Rd < (k)

Нет

3

 

ресу (k)

 

 

 

 

 

ST X,Rr

Сохранить

регистр

непосредст-

(X) < Rr

Нет

2

 

венно по адресу в X

 

 

 

 

ST X+,Rr

Сохранить

регистр

непосредст-

(X) < Rr

Нет

2

 

венно по адресу в X с постинкре-

X < X+1

 

 

 

ментом

 

 

 

 

 

ST -X,Rr

Сохранить

регистр

непосредст-

X < X-1

Нет

2

 

венно по адресу в X с предвари-

(X) < Rr

 

 

 

тельным декрементом

 

 

 

STD X+q,Rr

Сохранить

регистр

непосредст-

(X+q) < Rr

Нет

2

 

венно по адресу в X со смещени-

 

 

 

 

ем q

 

 

 

 

 

ST Y,Rr

Сохранить

регистр

непосредст-

(Y) < Rr

Нет

2

 

венно по адресу в Y

 

 

 

 

ST Y+,Rr

Сохранить

регистр

непосредст-

(Y) < Rr

Нет

2

 

венно по адресу в Y с постинкре-

Y < Y+1

 

 

 

ментом

 

 

 

 

 

ST -Y,Rr

Сохранить

регистр

непосредст-

Y < Y-1

Нет

2

 

венно по адресу в Y с предвари-

(Y) < Rr

 

 

 

тельным декрементом

 

 

 

STD Y+q,Rr

Сохранить

регистр

непосредст-

(Y+q) < Rr

Нет

2

 

венно по адресу в Y со смещени-

 

 

 

 

ем q

 

 

 

 

 

ST Z,Rr

Сохранить

регистр

непосредст-

(Z) < Rr

Нет

2

 

венно по адресу в Z

 

 

 

 

ST Z+,Rr

Сохранить

регистр

непосредст-

(Z) < Rr

Нет

2

 

венно по адресу в Z с постинкре-

Z < Z+1

 

 

 

ментом

 

 

 

 

 

ST -Z,Rr

Сохранить

регистр

непосредст-

Z < Z-1

Нет

2

353

 

 

венно по адресу в Z с предвари-

 

(Y) < Rr

 

 

 

 

 

 

 

тельным декрементом

 

 

 

 

 

 

 

 

 

STS k,Rr

Сохранить регистр в ОЗУ по ад-

 

(k) < Rr

 

 

 

Нет

3

 

 

ресу (k)

 

 

 

 

 

 

 

 

 

LPM

Загрузка из памяти программ по

 

R0 < (Z)

 

 

 

Нет

3

 

 

адресу в Z

 

 

 

 

 

 

 

 

 

IN Rd,P

Ввод в регистр из порта P

 

 

Rd < P

 

 

 

 

Нет

1

OUT P,Rr

Вывод из регистра в порт P

 

 

P < Rr

 

 

 

 

Нет

1

PUSH Rr

Сохранить регистр в стеке

 

 

STACK

<

 

Нет

2

 

 

 

 

 

Rr

 

 

 

 

 

 

POP Rd

Загрузить регистр из стека

 

 

Rd

 

<

 

Нет

2

 

 

 

 

 

STACK

 

 

 

 

 

Команды работы с битами.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Мнемоника

 

Описание

Действие

 

 

 

Флаги

Циклы

SBI P,b

 

Установить бит b в регистре

I/O (P,b) < 1

 

 

 

Нет

2

 

 

ввода/вывода P

 

 

 

 

 

 

 

 

 

CBI P,b

 

Сбросить бит b в регистре

I/O (P,b) < 0

 

 

 

Нет

2

 

 

ввода/вывода P

 

 

 

 

 

 

 

 

 

LSL Rd

 

Логический сдвиг влево на 1

Rd(n+1)

<

 

 

Z,C,N,V

1

 

 

бит в регистре

Rd(n)

 

 

 

 

 

 

 

 

 

 

Rd(0) < 0

 

 

 

 

 

 

LSR Rd

 

Логический сдвиг вправо на

Rd(n)

 

<

 

 

Z,C,N,V

1

 

 

1 бит в регистре

Rd(n+1)

 

 

 

 

 

 

 

 

 

Rd(7) < 0

 

 

 

 

 

 

ROL Rd

 

Сдвиг влево через С на 1

Rd(0) < C

 

 

 

Z,C,N,V

1

 

 

бит в регистре

Rd(n+1)

<

 

 

 

 

 

 

 

 

Rd(n)

 

 

 

 

 

 

 

 

 

 

C < Rd(7)

 

 

 

 

 

 

ROR Rd

 

Сдвиг вправо через С на 1

Rd(7) < C

 

 

 

Z,C,N,V

1

 

 

бит в регистре

Rd(n)

 

<

 

 

 

 

 

 

 

 

Rd(n+1)

 

 

 

 

 

 

 

 

 

C < Rd(0)

 

 

 

 

 

 

LSR Rd

 

Логический сдвиг вправо на

Rd(n)

 

<

 

 

Z,C,N,V

1

 

 

1 бит в регистре

Rd(n+1)

 

 

 

 

 

 

 

 

 

Rd(7) < 0

 

 

 

 

 

 

SWAP Rd

 

Обмен ниблов (полубайт) в

Rd(3…0)

<

 

 

Нет

1

 

 

регистре

Rd(7…4)

 

 

 

 

 

 

354

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]