Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Микропроцессорная техника / Семейство микроконтроллеров MSP430x2xx_

.pdf
Скачиваний:
94
Добавлен:
05.03.2016
Размер:
2.03 Mб
Скачать

 

 

 

 

3.4. Система команд 71

 

 

JMP

Безусловный переход

 

 

 

 

 

Синтаксис

JMP

label

 

 

 

 

 

Операция

PC + 2 смещение PC

 

 

 

Описание

Смещение (10 битное число со знаком), хранящееся в младших битах слова команды,

 

прибавляется к счётчику команд

 

 

 

Биты

Биты состояния не изменяются

 

состояния

 

 

 

 

 

 

Совет

Эта команда длиной в одно слово заменяет команду BRANCH при необходимости перехо

 

да в пределах от –511 до +512 слов относительно текущего значения счётчика команд

 

 

JN

Переход[.W], если отрицательное значение

 

 

 

 

 

Синтаксис

JN

label

 

 

 

 

Операция

Если N = 1, то PC + 2 смещение PC.

 

Если N = 0, то выполняется следующая команда.

 

 

Описание

Проверяется бит отрицательного значения (N) регистра состояния. Если он установлен,

 

то смещение (10 битное число со знаком), находящееся в младших битах слова коман

 

ды, прибавляется к счётчику команд. Если бит N сброшен, то выполняется команда,

 

следующая за командой перехода

 

 

 

Биты

Биты состояния не изменяются

 

состояния

 

 

 

 

 

 

Пример

Результат вычислений, сохранённый в регистре R5, вычитается из COUNT. Если ре

 

зультат отрицательный, то COUNT необходимо обнулить и продолжить выполнение

 

программы с другого места.

 

 

 

SUB

R5,COUNT

; COUNT – R5 $> COUNT

 

 

JN

L$1

; Если результат отрицателен, переходим к L$1

 

 

......

 

; Продолжаем работать с COUNT 0

 

 

......

 

 

 

 

......

 

 

 

 

......

 

 

 

L$1

CLR

COUNT

 

 

 

......

 

 

 

 

......

 

 

 

 

......

 

 

 

 

 

 

 

72 Глава 3. 16#битное RISC ЦПУ MSP430

JNC

Переход[.W], если нет переноса

JLO

Переход[.W], если «ниже»

 

 

 

 

 

Синтаксис

JNC

label

 

 

 

JLO

label

 

 

 

 

Операция

Если С = 0, то PC + 2 смещение PC.

 

Если С = 1, то выполняется следующая команда.

 

 

Описание

Проверяется бит переноса (C) регистра состояния. Если он сброшен, то смещение (10

 

битное число со знаком), находящееся в младших битах слова команды, прибавляется к

 

счётчику команд. Если бит C установлен, то выполняется команда, следующая за коман

 

дой перехода. Команда JNC (переход по «нет переноса»/ «ниже») используется при срав

 

нении чисел без знака (от 0 до 65535)

 

 

 

Биты

Биты состояния не изменяются

 

состояния

 

 

 

 

 

 

Пример 1

Содержимое R6 прибавляется к BUFFER. При переполнении выполняется переход к

 

обработчику ошибок ERROR.

 

 

 

ADD

R6,BUFFER

; BUFFER + R6 $> BUFFER

 

 

JNC

CONT

; Нет переноса, переходим к CONT

 

ERROR

......

 

; Начало обработчика ошибок

 

 

......

 

 

 

 

......

 

 

 

 

......

 

 

 

CONT

......

 

; Продолжаем выполнение программы

 

 

......

 

 

 

 

......

 

 

 

 

Пример 2

Если байт STATUS равен 0 или 1, то выполняется переход к метке STL2.

 

CMP.B

#2,STATUS

 

 

JLO

STL2

; STATUS < 2

 

......

 

; STATUS 2, продолжаем выполнение программы

 

 

 

 

 

JNE

Переход[.W], если «не равно»

JNZ

Переход[.W], если не ноль

 

 

 

 

Синтаксис

JNE

label

 

 

JNZ

label

 

 

 

Операция

Если Z = 0, то PC + 2 смещение PC.

 

Если Z = 1, то выполняется следующая команда.

 

 

Описание

Проверяется бит нуля (Z) регистра состояния. Если он сброшен, смещение (10 битное

 

число со знаком), то находящееся в младших битах слова команды, прибавляется к счёт

 

чику команд. Если бит Z установлен, то выполняется команда, следующая за командой

 

перехода

 

 

 

Биты

Биты состояния не изменяются

состояния

 

 

 

 

 

Пример

Если содержимое R7 не равно R8, выполняется переход к метке TONI.

 

CMP

R7,R8 ; Сравниваем R7 и R8

 

JNE

TONI

; Если не равны, то переходим

 

......

 

; Если равны, то продолжаем

 

 

 

 

3.4. Система команд 73

MOV[.W], MOV.B Пересылка операнда

Синтаксис

MOV

src,dst или MOV.W

src,dst

 

MOV.B

src,dst

 

 

 

 

 

 

 

Операция

src dst

 

 

 

 

 

Описание

Операнд источник пересылается в операнд приёмник. Содержимое операнда источни

 

ка не изменяется. Предыдущее содержимое операнда приёмника теряется

 

 

 

 

Биты

Биты состояния не изменяются

 

 

состояния

 

 

 

 

 

 

 

Биты

OSCOFF, CPUOFF и GIE не изменяются

 

режима

 

 

 

 

 

 

Пример 1

Содержимое 2 байтной таблицы EDE копируется в таблицу TOM. Размер таблиц —

 

020h элементов.

 

 

 

 

MOV #EDE,R10

;

Инициализируем указатель

 

 

MOV #020h,R9

;

Инициализируем счетчик

 

Loop

MOV @R10+,TOM$EDE$2(R10) ;

Используем указатель в R10

 

 

 

;

для обеих таблиц

 

 

DEC R9

;

Декрементируем счетчик

 

 

JNZ Loop

;

Счётчик 0, продолжаем

 

 

 

;

копирование

 

 

......

;

Копирование завершено

 

 

......

 

 

 

 

......

 

 

 

 

Пример 2

Содержимое 1 байтной таблицы EDE копируется в таблицу TOM. Размер таблиц —

 

020h элементов.

 

 

 

 

MOV #EDE,R10

 

; Инициализируем указатель

 

 

MOV #020h,R9

 

; Инициализируем счетчик

 

Loop

MOV.B @R10+,TOM$EDE$1(R10)

; Используем указатель в R10

 

 

 

 

; для обеих таблиц

 

 

DEC R9

 

; Декрементируем счетчик

 

 

JNZ Loop

 

; Счётчик 0, продолжаем

 

 

 

 

; копирование

 

 

......

 

; Копирование завершено

 

 

......

 

 

 

 

......

 

 

 

 

 

 

 

74 Глава 3. 16#битное RISC ЦПУ MSP430

* NOP

Нет операции

Синтаксис

NOP

 

 

 

 

Операция

Нет

 

 

 

 

Эмуляция

MOV

#0,R3

 

 

Описание

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

 

команд при отладке программы или для формирования задержек

 

 

Биты

Биты состояния не изменяются

состояния

 

 

 

 

Биты

OSCOFF, CPUOFF и GIE не изменяются

режима

 

 

 

 

 

Команда NOP используется, главным образом, в двух случаях:

 

 

Для заполнения 1, 2 или 3 слов в памяти.

 

 

Для корректировки времени выполнения программы.

 

 

 

Примечание. Эмуляция команды NOP

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

MOV

#0,R3

; 1 такт, 1

слово

MOV

0(R4),0(R4) ; 6 тактов,

3

слова

MOV

@R4,0(R4)

; 5

тактов,

2

слова

BIC

#0,EDE(R4)

; 4

такта, 2

 

слова

JMP

$+2

; 2

такта, 1

 

слово

BIC

#0,R5

; 1

такт, 1

слово

Однако при использовании этих примеров нужно соблюдать осторожность, чтобы избежать непредсказуемых результатов. Например, если использовать команду MOV 0(R4),0(R4) при R4 = 120h, то произойдет нарушение защиты сторожевого таймера (адрес 120h), поскольку ключ защиты не был указан.

3.4. Система команд 75

* POP[.W], * POP.B Извлечение операнда из стека

Синтаксис

POP

dst или

POP.W

dst

 

POP.B

dst

 

 

 

 

 

 

Операция

@SP temp

 

 

 

SP + 2 SP

 

 

 

temp dst

 

 

 

 

 

 

 

Эмуляция

MOV

@SP+,dst

или

MOV.W @SP+,dst

 

MOV.B

@SP+,dst

 

 

 

 

Описание

Элемент стека, адресуемый указателем стека (TOS), извлекается в операнд приёмник.

 

После этого указатель стека увеличивается на 2

 

 

Биты

Биты состояния не изменяются

состояния

 

 

 

 

 

 

Биты

OSCOFF, CPUOFF и GIE не изменяются

режима

 

 

 

 

 

 

Пример 1

Содержимое R7 и регистра состояния восстанавливаются из стека.

 

POP

R7

; Извлекаем R7

 

POP

SR

; Извлекаем регистр состояния

 

 

Пример 2

Содержимое байта LEO в ОЗУ восстанавливается из стека.

 

POP.B

LEO

; Копируем младший байт из стека в LEO

 

 

Пример 3

Содержимое R7 восстанавливается из стека.

 

POP.B

R7

; Копируем младший байт из стека в R7

 

 

 

; Старший байт R7 = 0

 

 

Пример 4

Содержимое ячейки памяти, на которую указывает R7, и регистра состояния восстанав

 

ливается из стека.

 

 

 

POP.B

0(R7)

; Копируем младший байт с вершины стека в ОЗУ

 

 

 

; по адресу, хранящемуся в регистре R7

 

POP

SR

; Загружаем последнее слово из стека в регистр SR

 

 

 

 

 

Примечание. Указатель системного стека

Указатель системного стека (SP) всегда увеличивается на 2, независимо от разряд ности (байт/слово) операнда команды.

76 Глава 3. 16#битное RISC ЦПУ MSP430

PUSH[.W], PUSH.B Сохранение операнда в стеке

Синтаксис

PUSH

src или

PUSH.W src

 

PUSH.B

src

 

 

 

 

Операция

SP – 2 SP

 

 

src @SP

 

 

 

 

Описание

Указатель стека уменьшается на 2, после чего содержимое операнда источника помеща

 

ется в ОЗУ по адресу, определяемому указателем стека (TOS)

 

 

Биты

Биты состояния не изменяются

состояния

 

 

 

 

 

Биты

OSCOFF, CPUOFF и GIE не изменяются

режима

 

 

 

 

 

Пример 1

Содержимое регистра состояния и регистра R8 сохраняется в стеке.

 

PUSH

SR

; Сохраняем регистр состояния

 

PUSH

R8

; Сохраняем регистр R8

 

 

Пример 2

Содержимое регистра TCDAT периферийного модуля сохраняется в стеке.

 

PUSH.B

&TCDAT

; Сохраняем в стеке данные 8$битного

;периферийного модуля

Примечание. Указатель системного стека

Указатель системного стека (SP) всегда уменьшается на 2, независимо от разряд ности (байт/слово) операнда команды.

* RET

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

Синтаксис

RET

 

 

 

Операция

@SP PC

 

SP + 2 SP

 

 

 

Эмуляция

MOV

@SP+,PC

 

 

Описание

Адрес возврата, помещённый в стек при выполнении команды CALL, загружается в

 

счётчик команд. Выполнение программы продолжается с команды, следующей за ко

 

мандой вызова подпрограммы

 

 

Биты

Биты состояния не изменяются

состояния

 

 

 

 

Биты

OSCOFF, CPUOFF и GIE не изменяются

режима

 

 

 

 

 

3.4. Система команд 77

RETI

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

Синтаксис

RETI

 

 

Операция

TOS SR

 

SP + 2 SP

 

TOS PC

 

SP + 2 SP

 

 

Описание

Содержимое регистра состояния восстанавливается таким, каким оно было при входе в

 

процедуру обработки прерывания. Для этого значение, расположенное на вершине сте

 

ка (TOS), копируется в регистр состояния. Затем указатель стека увеличивается на 2.

 

Содержимое счётчика команд восстанавливается таким, каким оно было на момент

 

принятия запроса прерывания. Для этого значение, расположенное на вершине стека

 

(TOS), копируется в счётчик команд. Затем указатель стека увеличивается на 2

 

 

Биты

N: Восстанавливается из стека.

состояния

Z:

Восстанавливается из стека.

 

C:

Восстанавливается из стека.

 

V:

Восстанавливается из стека.

 

 

Биты

OSCOFF, CPUOFF и GIE не изменяются

режима

 

 

 

 

Пример

На Рис. 3.13 показан процесс прерывания основной программы.

PC 6

 

 

 

PC 4

Запрос

 

 

прерывания

 

 

 

 

 

PC 2

Запрос

 

 

 

 

 

PC

принят

 

 

PC +2

PC+2

PC = PCi

 

сохранено

 

PC +4

PCi +2

 

в стеке

 

PC +6

 

PCi +4

 

PC +8

 

 

 

 

 

PCi +n 4

 

 

 

PCi +n 2

 

 

 

PCi +n

RETI

Рис. 3.13. Прерывание основной программы.

78 Глава 3. 16#битное RISC ЦПУ MSP430

* RLA[.W], * RLA.B Арифметический сдвиг влево

Синтаксис

RLA

 

dst

или RLA.W

dst

 

RLA.B

 

dst

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Операция

C MSB MSB–1 … LSB+1

LSB 0

 

 

 

 

 

 

 

 

 

 

 

Эмуляция

ADD

 

dst,dst

 

 

 

 

 

ADD.B dst,dst

 

 

 

 

 

 

 

 

 

 

 

 

 

Описание

Содержимое операнда приёмника сдвигается влево на один бит, как показано на

 

Рис. 3.14. Старший бит содержимого (MSB) помещается в бит переноса (C), а младший

 

бит (LSB) обнуляется. По сути, команда RLA выполняет операцию знакового умноже

 

ния на 2.

 

 

 

 

 

 

 

 

Если перед выполнением операции значение операнда было 04000h dst < 0C000h (040h dst < 0C0h),

 

то возникает переполнение: знак результата отличается от знака операнда.

 

 

Слово

15

 

0

 

 

 

 

 

C

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Байт

7

 

0

 

 

Рис. 3.14. Операнд приёмник — арифметический сдвиг влево.

Биты

N:

Устанавливается, если результат отрицательный, сбрасывается — если положитель

состояния

 

ный.

 

 

 

Z:

Устанавливается, если результат нулевой, иначе сбрасывается.

 

C:

Загружается из MSB.

 

V:

Устанавливается, если произошло переполнение:

 

 

начальное значение 04000h dst < 0C000h; иначе сбрасывается.

 

 

Устанавливается, если произошло переполнение:

 

 

начальное значение 040h dst < 0C0h; иначе сбрасывается.

 

 

Биты

OSCOFF, CPUOFF и GIE не изменяются

режима

 

 

 

 

 

Пример 1 Содержимое регистра R7 умножается на 2.

 

RLA

R7

; Сдвигаем R7 на 1 бит влево ( 2)

 

Пример 2 Младший байт регистра R7 умножается на 4.

 

RLA.B

R7

; Сдвигаем влево младший байт R7 ( 2)

 

RLA.B

R7

; Сдвигаем влево младший байт R7 ( 4)

Примечание. Замена команды RLA

Ассемблер не распознаёт команды:

RLA @R5+, RLA.B @R5+ или RLA(.B) @R5

Они должны быть заменены командами:

ADD @R5+, –2(R5) ADD.B @R5+,–1(R5) или ADD(.B) @R5,0(R5)

3.4. Система команд 79

* RLC[.W], * RLC.B

Сдвиг влево через перенос

Синтаксис

RLC

dst или

RLC.W

dst

 

RLC.B

dst

 

 

 

 

 

Операция

C MSB MSB–1 … LSB+1

LSB C

 

 

 

 

 

Эмуляция

ADDC

dst,dst

 

 

 

ADDC.B dst,dst

 

 

 

 

Описание

Содержимое операнда приёмника сдвигается влево на один бит, как показано на

 

Рис. 3.15. Бит переноса (C) вдвигается в младший бит (LSB) операнда, а старший бит

 

операнда (MSB) выдвигается в бит переноса.

 

 

Слово

15

0

C

 

 

Байт

7

0

Рис. 3.15. Операнд приёмник — сдвиг влево через перенос.

Биты

N:

Устанавливается, если результат отрицательный, сбрасывается — если положитель

состояния

 

ный.

 

Z:

Устанавливается, если результат нулевой, иначе сбрасывается.

 

C:

Загружается из MSB.

V:Устанавливается, если произошло переполнение:

начальное значение 04000h dst < 0C000h; иначе сбрасывается.

Устанавливается, если произошло переполнение: начальное значение 040h dst < 0C0h; иначе сбрасывается.

Биты

OSCOFF, CPUOFF и GIE не изменяются

режима

 

 

 

 

 

Пример

Содержимое регистра R5 сдвигается на 1 бит влево.

 

RLC

R5

; (R5 2) + C $> R5

 

 

Пример

Значение бита порта P1IN.1 вдвигается в младший бит регистра R5.

 

BIT.B

#2,&P1IN

; Информация $> бит переноса

 

RLC

R5

; C = P1IN.1 $> младший бит R5

 

 

Пример

Содержимое байта ОЗУ с адресом LEO сдвигается на 1 бит влево.

 

RLC.B

LEO

; MEM(LEO) 2 + C $> MEM(LEO)

Примечание. Замена команды RLC

Ассемблер не распознаёт команды:

RLC @R5+, RLC.B @R5+ или RLC(.B) @R5

Они должны быть заменены командами:

ADDC @R5+, –2(R5) ADDC.B @R5+,–1(R5) или ADDC(.B) @R5,0(R5)

80 Глава 3. 16#битное RISC ЦПУ MSP430

RRA[.W], RRA.B Арифметический сдвиг вправо

Синтаксис

RRA

dst или RRA.W dst

 

RRA.B

dst

 

 

Операция

MSB MSB, MSB MSB–1, … LSB+1 LSB, LSB 0

 

 

Описание

Содержимое операнда приёмника сдвигается вправо на один бит, как показано на

 

Рис. 3.16. Старший бит содержимого (MSB) вдвигается в бит MSB 1 (значение MSB ос

 

таётся неизменным), а бит LSB+1 вдвигается в младший бит (LSB). По сути, команда

 

RLA выполняет операцию знакового деления на 2.

Слово

15

0

C

 

 

Байт

 

 

 

7

0

Рис. 3.16. Операнд приёмник — арифметический сдвиг вправо.

Биты

N:

Устанавливается, если результат отрицательный, сбрасывается — если положитель

состояния

 

ный.

 

Z:

Устанавливается, если результат нулевой, иначе сбрасывается.

 

C:

Загружается из LSB.

 

V:

Сбрасывается.

 

 

Биты

OSCOFF, CPUOFF и GIE не изменяются

режима

 

 

Пример 1 Содержимое регистра R5 сдвигается вправо на один бит, состояние старшего бита не из меняется. Эта операция эквивалентна операции деления на 2.

RRA

R5

; R5/2$> R5

 

 

 

 

Пример 2 Содержимое регистра R5 умножается на 0.75.

 

PUSH

R5

; Временно сохраняем R5 в стеке

RRA

R5

; R5

0.5

$> R5

 

ADD

@SP+,R5

; R5

0.5

+

R5 = 1.5 R5

$> R5

RRA

R5

; (1.5 R5)

0.5 = 0.75

R5 $>R5

Пример 3 Младший байт регистра R5 сдвигается вправо на один бит, состояние старшего бита не изменяется. Эта операция эквивалентна операции деления на 2.

RRA.B

R5

; R5/2$> R5: операция только над младшим байтом

 

 

; Старший байт R5 обнуляется

 

PUSH.B

R5

; R5

0.5

$> TOS

 

 

RRA.B

@SP

; TOS 0.5 = 0.5 R5

0.5 =0.25

R5 $> TOS

ADD.B

@SP+,R5

; R5

0.5

+ R5 0.25

= 0.75 R5

$> R5