Микропроцессорная техника / Семейство микроконтроллеров MSP430x2xx_
.pdf3.4. Система команд 61
DADD[.W], DADD.B
Сложение двух операндов с учётом переноса (BCDCарифметика)
Синтаксис |
DADD |
src,dst |
или DADD.W |
src,dst |
|
DADD.B |
src,dst |
|
|
|
|
|
||
Операция |
src + dst + C dst (BCD арифметика) |
|
||
|
|
|||
Описание |
Операнд источник и бит переноса (C) прибавляются к операнду приёмнику по прави |
|||
|
лам двоично десятичной арифметики. Содержимое операнда источника не изменяется. |
|||
|
Предыдущее содержимое операнда приёмника теряется. Для не BCD чисел результат |
|||
|
операции не определён |
|
||
|
|
|||
Биты |
N: Устанавливается, если MSB результата равен 1, иначе сбрасывается |
|||
состояния |
Z: Устанавливается, если результат нулевой, иначе сбрасывается. |
|||
|
C: Устанавливается, если результат больше 9999, иначе сбрасывается. |
|||
|
Устанавливается, если результат больше 99, иначе сбрасывается. |
|||
|
V: Не определён. |
|
|
|
|
|
|||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
|||
режима |
|
|
|
|
|
|
|||
Пример 1 |
8 разрядное двоично десятичное число, находящееся в R5 и R6, прибавляется к 8 раз |
|||
|
рядному числу, находящемуся в R3 и R4 (старшие разряды — в R6 и R4). |
|||
|
CLRC |
|
; Сбрасываем бит переноса |
|
|
DADD |
R5,R3 |
; Складываем младшие разряды |
|
|
DADD |
R6,R4 |
; Складываем старшие разряды с учётом переноса |
|
|
JC |
OVERFLOW |
; При переполнении переходим |
|
|
|
|
; к обработчику ошибок |
|
|
|
|||
Пример 2 |
2 разрядный двоично десятичный счётчик, расположенный в байте CNT, инкременти |
|||
|
руется на 1. |
|
|
|
|
CLRC |
|
; Сбрасываем бит переноса |
|
|
DADD.B |
#1,CNT |
; Инкрементируем BCD$счётчик |
|
|
или |
|
|
|
|
SETC |
|
|
|
|
DADD.B |
#0,CNT |
; DADC.B |
CNT |
|
|
|
|
|
62 Глава 3. 16#битное RISC ЦПУ MSP430
* DEC[.W], * DEC.B Декрементирование операнда
Синтаксис |
DEC |
dst или DEC.W |
dst |
|
DEC.B |
dst |
|
|
|
|
|
Операция |
dst – 1 dst |
|
|
|
|
|
|
Эмуляция |
SUB |
#1,dst |
|
|
SUB.B |
#1,dst |
|
|
|
||
Описание |
Значение операнда приёмника уменьшается на 1. Предыдущее содержимое операнда |
||
|
приёмника теряется |
|
|
|
|
||
Биты |
N: Устанавливается, если результат отрицательный, сбрасывается — если положитель |
||
состояния |
ный. |
|
|
|
Z: Устанавливается, если dst содержал 1, иначе сбрасывается. |
||
|
C: Сбрасывается, если dst содержал 0, иначе устанавливается. |
V:Устанавливается, если произошло переполнение, иначе сбрасывается. Устанавливается, если исходное значение dst было 08000h, иначе сбрасывается. Устанавливается, если исходное значение dst было 080h, иначе сбрасывается.
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||
режима |
|
|
|
|
|
||
Пример |
Содержимое регистра R10 уменьшается на 1. |
||
|
DEC |
R10 |
; Декрементируем R10 |
;Копируем 255$байтный блок с начальным адресом EDE в ОЗУ,
;начиная с адреса TONI. Исходный и конечный блоки не должны
;перекрываться: адрес TONI должен находиться вне диапазона
;EDE...EDE + 0FEh
; |
|
|
|
MOV |
#EDE,R6 |
|
MOV |
#255,R10 |
L$1 |
MOV.B |
@R6+,TONI$EDE$1(R6) |
|
DEC |
R10 |
|
JNZ |
L$1 |
;Не используйте данную процедуру для копирования
;перекрывающихся блоков (Рис. 3.12)
EDE
TONI
EDE+254
TONI+254
Рис. 3.12. Перекрытие блоков.
3.4. Система команд 63
* DECD[.W], * DECD.B Уменьшение операнда на 2
Синтаксис |
DECD |
dst |
или DECD.W |
dst |
|
DECD.B |
dst |
|
|
|
|
|
|
|
Операция |
dst – 2 dst |
|
|
|
|
|
|
|
|
Эмуляция |
SUB |
#2,dst |
|
|
|
SUB.B |
#2,dst |
|
|
|
|
|||
Описание |
Значение операнда приёмника уменьшается на 2. Предыдущее содержимое операнда |
|||
|
приёмника теряется |
|
||
|
|
|||
Биты |
N: Устанавливается, если результат отрицательный, сбрасывается — если положитель |
|||
состояния |
ный. |
|
|
|
|
Z: Устанавливается, если dst содержал 2, иначе сбрасывается. |
|||
|
C: Сбрасывается, если dst содержал 0 или 1, иначе устанавливается. |
|||
|
V: Устанавливается, если произошло переполнение, иначе сбрасывается. |
|||
|
Устанавливается, если начальное значение dst было 08001h или 08000h, иначе сбра |
|||
|
сывается. |
|
|
|
|
Устанавливается, если начальное значение dst было 081h или 080h, иначе сбрасыва |
|||
|
ется. |
|
|
|
|
|
|||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
|||
режима |
|
|
|
|
|
|
|||
Пример 1 |
Содержимое регистра R10 уменьшается на 2. |
|||
|
|
DEC |
R10 |
; Декрементируем R10 |
|
; Копируем блок из 255 слов с начальным адресом EDE в другое |
|||
|
; место, начиная с адреса TONI. Исходный и конечный блоки |
|||
|
; не должны перекрываться: адрес TONI должен находиться вне |
|||
|
; диапазона EDE...EDE + 01FСh |
|||
|
; |
|
|
|
|
|
MOV |
#EDE,R6 |
|
|
|
MOV |
#510,R10 |
|
|
L$1 |
MOV |
@R6+,TONI$EDE$2(R6) |
|
|
|
DECD |
R10 |
|
|
|
JNZ |
L$1 |
|
|
|
|||
Пример 2 |
Содержимое ячейки памяти с адресом LEO уменьшается на 2. |
|||
|
DECD.B |
LEO |
; Декрементируем MEM(LEO) |
|
|
Cодержимое байта STATUS уменьшается на 2. |
|||
|
DECD.B |
STATUS |
|
|
|
|
|
|
|
64 Глава 3. 16#битное RISC ЦПУ MSP430
* DINT
Общее запрещение прерываний
Синтаксис |
DINT |
|
|
|
|
Операция |
0 GIE |
|
|
или |
|
|
(0FFF7h .AND. SR SR / .NOT.src .AND. dst dst) |
|
|
|
|
Эмуляция |
BIC |
#8,SR |
|
|
|
Описание |
Запрещаются все прерывания. |
|
|
Константа 08h инвертируется и логически умножается (AND) на содержимое регистра |
|
|
состояния SR. Результат сохраняется в регистре состояния |
|
|
|
|
Биты |
Биты состояния не изменяются |
|
состояния |
|
|
|
|
|
Биты |
GIE сбрасывается, OSCOFF и CPUOFF не изменяются |
|
режима |
|
|
|
|
|
Пример |
Бит общего разрешения прерываний регистра SR сбрасывается для осуществления ато |
|
|
марного копирования 32 битного счётчика. Это гарантирует, что состояние счётчика не |
|
|
будет изменено в процессе копирования каким либо прерыванием. |
|
|
DINT |
; Запрещаем генерацию прерываний |
|
NOP |
|
|
MOV |
COUNTHI,R5 ; Копируем счётчик |
|
MOV |
COUNTLO,R6 |
|
EINT |
; Разрешаем прерывания |
|
|
|
Примечание. Запрещение прерываний
При необходимости исключить прерывание какой либо секции кода, между ко мандой DINT и началом этой секции должна располагаться как минимум одна ко манда. Обычно для этой цели после команды DINT ставят команду NOP.
3.4. Система команд 65
* EINT
Общее разрешение прерываний
Синтаксис |
EINT |
|
|
|
|
|
|
|
|
Операция |
1 GIE |
|
|
|
|
или |
|
|
|
|
(0008h .OR. SR SR / src .OR. dst dst) |
|||
|
|
|
|
|
Эмуляция |
BIS |
#8,SR |
|
|
|
|
|
||
Описание |
Разрешаются все прерывания. |
|
||
|
Константа 08h логически складывается (OR) с содержимым регистра состояния SR. |
|||
|
Результат сохраняется в регистре SR |
|
||
|
|
|
||
Биты |
Биты состояния не изменяются |
|
||
состояния |
|
|
|
|
|
|
|||
Биты |
GIE устанавливается, OSCOFF и CPUOFF не изменяются |
|||
режима |
|
|
|
|
|
|
|||
Пример |
Бит общего разрешения прерываний (GIE) регистра состояния устанавливается. |
|||
|
; Обработчик прерываний от линий порта ввода/вывода P1.2...P1.7 |
|||
|
; P1IN – адрес регистра, из которого считывается состояние битов |
|||
|
; порта. P1IFG – адрес регистра, в котором хранятся флаги |
|||
|
; прерываний по линиям порта. |
|
||
|
|
PUSH.B |
&P1IN |
; Сбрасываем только взведённые флаги |
|
|
BIC.B |
@SP,&P1IFG |
; Маску для флагов прерываний |
|
|
|
|
; сохраняем в стеке |
|
|
EINT |
|
; Разрешаем прочие прерывания |
|
|
BIT |
#Mask,@SP |
|
|
|
JEQ |
MaskOK |
; Установленные флаги совпадают |
|
|
|
|
; с маской $ переходим |
|
|
...... |
|
|
|
MaskOK |
BIC |
#Mask,@SP |
|
|
|
...... |
|
|
|
|
INCD |
SP |
; Служебная операция, обратная |
|
|
|
|
; команде PUSH, расположенной в |
|
|
|
|
; начале обработчика. Корректирует |
|
|
|
|
; значение указателя стека |
|
|
RETI |
|
|
|
|
|
|
|
Примечание. Разрешение прерываний
Команда, следующая за командой разрешения прерываний (EINT), выполняется всегда, даже если на момент разрешения прерываний имеются отложенные запро сы прерываний.
66 Глава 3. 16#битное RISC ЦПУ MSP430
* INC[.W], * INC.B Инкрементирование операнда
Синтаксис |
INC |
dst или INC.W |
dst |
|
INC.B |
dst |
|
|
|
|
|
Операция |
dst + 1 dst |
|
|
|
|
|
|
Эмуляция |
ADD |
#1,dst |
|
|
ADD.B |
#1,dst |
|
|
|
||
Описание |
Значение операнда приёмника увеличивается на 1. Предыдущее содержимое операнда |
||
|
приёмника теряется |
|
|
|
|
||
Биты |
N: Устанавливается, если результат отрицательный, сбрасывается — если положитель |
||
состояния |
ный. |
|
|
|
Z: Устанавливается, если dst содержал 0FFFFh, иначе сбрасывается. |
||
|
Устанавливается, если dst содержал 0FFh, иначе сбрасывается. |
||
|
C: Устанавливается, если dst содержал 0FFFFh, иначе сбрасывается. |
||
|
Устанавливается, если dst содержал 0FFh, иначе сбрасывается. |
||
|
V: Устанавливается, если dst содержал 07FFFh, иначе сбрасывается. |
||
|
Устанавливается, если dst содержал 07Fh, иначе сбрасывается. |
||
|
|
||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||
режима |
|
|
|
|
|
||
Пример |
Байт состояния процесса STATUS инкрементируется. Когда он становится равным 11, |
||
|
выполняется переход к метке OVFL. |
||
|
INC.B |
STATUS |
|
|
CMP.B |
#11,STATUS |
|
|
JEQ |
OVFL |
|
|
|
|
|
3.4. Система команд 67
* INCD[.W], * INCD.B Увеличение операнда на 2
Синтаксис |
INCD |
dst |
или INCD.W dst |
|
INCD.B |
dst |
|
|
|
|
|
Операция |
dst + 2 dst |
|
|
|
|
|
|
Эмуляция |
ADD |
#2,dst |
|
|
ADD.B |
#2,dst |
|
|
|
||
Описание |
Значение операнда приёмника увеличивается на 2. Предыдущее содержимое операнда |
||
|
приёмника теряется |
||
|
|
||
Биты |
N: Устанавливается, если результат отрицательный, сбрасывается — если положитель |
||
состояния |
ный. |
|
|
|
Z: Устанавливается, если dst содержал 0FFFEh, иначе сбрасывается. |
||
|
Устанавливается, если dst содержал 0FEh, иначе сбрасывается. |
||
|
C: Устанавливается, если dst содержал 0FFFEh или 0FFFFh, иначе сбрасывается. |
||
|
Устанавливается, если dst содержал 0FEh или 0FFh, иначе сбрасывается. |
||
|
V: Устанавливается, если dst содержал 07FFEh или 07FFFh, иначе сбрасывается. |
||
|
Устанавливается, если dst содержал 07FEh или 07Fh, иначе сбрасывается. |
||
|
|
||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||
режима |
|
|
|
|
|
||
Пример |
Удаление значения с вершины стека без использования регистров. |
||
|
...... |
|
|
|
PUSH |
R5 |
; В R5 результат вычислений, сохранённый в |
|
|
|
; системном стеке |
|
INCD |
SP |
; Удаляем значение с вершины стека, модифицируя |
|
|
|
; указатель стека |
|
|
|
; Не используйте INCD.B, так как содержимое SP |
|
|
|
; всегда выровнено по границе слова |
|
RET |
|
|
|
|
|
|
68 Глава 3. 16#битное RISC ЦПУ MSP430
* INV[.W], * INV.B Инвертирование операнда
Синтаксис |
INV |
dst или INV.W |
dst |
|
|
|
INV.B |
dst |
|
|
|
|
|
|
|
|
|
Операция |
.NOT.dst dst |
|
|
|
|
|
|
|
|
|
|
Эмуляция |
XOR |
#0FFFFh,dst |
|
|
|
|
XOR.B |
#0FFh,dst |
|
|
|
|
|
||||
Описание |
Значение операнда приёмника инвертируется. Предыдущее содержимое теряется |
||||
|
|
||||
Биты |
N: Устанавливается, если результат отрицательный, сбрасывается — если положительный. |
||||
состояния |
Z: Устанавливается, если dst содержал 0FFFFh, иначе сбрасывается. |
||||
|
Устанавливается, если dst содержал 0FFh, иначе сбрасывается. |
||||
|
C: Устанавливается, если результат не равен нулю, иначе сбрасывается (= .NOT. Zero). |
||||
|
V: Устанавливается, если операнд имел отрицательное значение, иначе сбрасывается. |
||||
|
|
|
|||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
|
|||
режима |
|
|
|
|
|
|
|
||||
Пример 1 |
Вычисляется дополнительный код содержимого регистра R5. |
||||
|
MOV |
#00AEh,R5 |
; |
|
R5 = 000AEh |
|
INV |
R5 |
; Инвертируем R5 |
R5 = 0FF51h |
|
|
INC |
R5 |
; В R5 – доп. код |
R5 = 0FF52h |
|
|
|
|
|||
Пример 2 |
Вычисляется дополнительный код байта LEO в ОЗУ. |
|
|||
|
MOV.B |
#00AEh,LEO |
; |
|
MEM(LEO) = 0AEh |
|
INV.B |
LEO |
; Инвертируем LEO |
MEM(LEO) = 051h |
|
|
INC.B |
LEO |
; В LEO – доп. код |
MEM(LEO) = 052h |
|
|
|
|
|
|
|
* JC |
Переход[.W], если бит переноса установлен |
||
* JHS |
Переход[.W], если «выше или равно» |
||
|
|
|
|
Синтаксис |
JC |
label |
|
|
JHS |
label |
|
|
|
||
Операция |
Если C = 1, то PC + 2 смещение PC. |
||
|
Если C = 0, то выполняется следующая команда. |
||
|
|
||
Описание |
Проверяется бит переноса (C) регистра состояния. Если он установлен, то смещение |
||
|
(10 битное число со знаком), находящееся в младших битах слова команды, прибавляет |
||
|
ся к счётчику команд. Если бит C сброшен, то выполняется команда, следующая за ко |
||
|
мандой перехода. Команда JC (переход по «перенос»/«выше или равно») используется |
||
|
при сравнении чисел без знака (от 0 до 65535) |
||
|
|
||
Биты |
Биты состояния не изменяются |
||
состояния |
|
|
|
|
|
||
Пример 1 |
Сигнал P1IN.1 используется для управления ходом выполнения программы. |
||
|
BIT.B |
#02h,&P1IN |
; Состояние бита порта $> бит переноса C |
|
JC |
PROGA |
; Если C = 1, выполняем блок A программы |
|
...... |
|
; C = 0, продолжаем выполнение отсюда |
|
|
||
Пример 2 |
Содержимое R5 сравнивается с числом 15. Если содержимое регистра больше или равно |
||
|
константе, выполняется переход к метке LABEL. |
||
|
CMP |
#15,R5 |
|
|
JHS |
LABEL |
; Переходим, если R5 >= 15 |
|
...... |
|
; Остаёмся здесь, если R5 < 15 |
|
|
|
|
3.4. Система команд 69
JEQ |
Переход[.W], если «равно» |
||
JZ |
Переход[.W], если ноль |
||
|
|
|
|
Синтаксис |
JEQ |
label |
|
|
JZ |
label |
|
|
|
||
Операция |
Если Z = 1, то PC + 2 смещение PC. |
||
|
Если Z = 0, то выполняется следующая команда. |
||
|
|
||
Описание |
Проверяется бит нуля (Z) регистра состояния. Если он установлен, то смещение (10 |
||
|
битное число со знаком), находящееся в младших битах слова команды, прибавляется к |
||
|
счётчику команд. Если бит Z сброшен, то выполняется команда, следующая за коман |
||
|
дой перехода |
|
|
|
|
||
Биты |
Биты состояния не изменяются |
||
состояния |
|
|
|
|
|
||
Пример 1 |
Если содержимое R7 равно нулю, то выполняется переход к метке TONI. |
||
|
TST |
R7 |
; Проверяем R7 |
|
JZ |
TONI |
; Если ноль, то переходим |
|
|
||
Пример 2 |
Если содержимое R6 равно значению заданного элемента таблицы, то выполняется пе |
||
|
реход к метке LEO. |
|
|
|
CMP |
R5,Table(R5) |
; Сравниваем содержимое R6 с элементом |
|
|
|
; таблицы по адресу |
|
|
|
; (базовый адрес + содержимое R5) |
|
JEQ |
LEO |
; Переходим, если значения равны |
|
...... |
|
; Не равны, продолжаем выполнение программы |
|
|
||
Пример 3 |
Если содержимое R5 равно нулю, то выполняется переход к метке LABEL. |
||
|
TST |
R5 |
|
|
JZ |
LABEL |
|
|
...... |
|
|
|
|
|
|
70 Глава 3. 16#битное RISC ЦПУ MSP430
JGE |
Переход[.W], если «больше или равно» |
||
|
|
|
|
Синтаксис |
JGE |
label |
|
|
|
||
Операция |
Если (N .XOR. V) = 0, то PC + 2 смещение PC. |
||
|
Если (N .XOR. V) = 1, то выполняется следующая команда. |
||
|
|
||
Описание |
Проверяются биты переполнения (V) и отрицательного значения (N) регистра состоя |
||
|
ния. Если установлены или сброшены оба бита, то смещение (10 битное число со зна |
||
|
ком), находящееся в младших битах слова команды, прибавляется к счётчику команд. |
||
|
Если установлен только один бит, то выполняется команда, следующая за командой пе |
||
|
рехода. Эта команда используется при сравнении чисел со знаком |
||
|
|
||
Биты |
Биты состояния не изменяются |
||
состояния |
|
|
|
|
|
||
Пример |
Если содержимое регистра R6 больше или равно значению, адресуемому регистром R7, |
||
|
то выполняется переход к метке EDE. |
||
|
CMP |
@R7,R6 |
; R6 (R7)? – сравниваем числа со знаком |
|
JGE |
EDE |
; Да, R6 (R7) |
|
...... |
|
; Нет, продолжаем выполнение программы |
|
|
||
JL |
Переход[.W], если «меньше» |
||
|
|
|
|
Синтаксис |
JL |
label |
|
|
|
||
Операция |
Если (N .XOR. V) = 1, то PC + 2 смещение PC. |
||
|
Если (N .XOR. V) = 0, то выполняется следующая команда. |
||
|
|
||
Описание |
Проверяются биты переполнения (V) и отрицательного значения (N) регистра состоя |
||
|
ния. Если установлен только один из битов, то смещение (10 битное число со знаком), |
||
|
находящееся в младших битах слова команды, прибавляется к счётчику команд. Если ус |
||
|
тановлены или сброшены оба бита, то выполняется команда, следующая за командой |
||
|
перехода. Эта команда используется при сравнении чисел со знаком |
||
|
|
||
Биты |
Биты состояния не изменяются |
||
состояния |
|
|
|
|
|
||
Пример |
Если содержимое регистра R6 меньше значения, адресуемого регистром R7, то выпол |
||
|
няется переход к метке EDE. |
||
|
CMP |
@R7,R6 |
; R6 < (R7)? – сравниваем числа со знаком |
|
JL |
EDE |
; Да, R6 < (R7) |
|
...... |
|
; Нет, продолжаем выполнение программы |
|
|
|
|