Микропроцессорная техника / Семейство микроконтроллеров MSP430x2xx_
.pdf4.6. Описание набора команд 151
* DADC[.W], * DADC.B
Сложение переноса с операндом (BCDCарифметика)
Синтаксис |
DADC |
dst или |
DADC.W dst |
|
DADC.B |
dst |
|
|
|
||
Операция |
dst + C dst (BCD арифметика) |
||
|
|
|
|
Эмуляция |
DADD |
#0,dst |
|
|
DADD.B #0,dst |
|
|
|
|
||
Описание |
Бит переноса (C) прибавляется к операнду приёмнику по правилам двоично десяти |
||
|
чной арифметики |
|
|
|
|
||
Биты |
N: Устанавливается, если MSB результата равен 1, иначе сбрасывается. |
||
состояния |
Z: Устанавливается, если результат нулевой, иначе сбрасывается. |
||
|
C: Устанавливается, если dst изменился с 9999h до 0000, иначе сбрасывается. |
||
|
Устанавливается, если dst изменился с 99h до 00, иначе сбрасывается. |
||
|
V: Не определён. |
|
|
|
|
||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||
режима |
|
|
|
|
|
||
Пример 1 |
4 разрядное двоично десятичное число, находящееся в R5, прибавляется к 8 разрядно |
||
|
му числу, на которое указывает R8. |
||
|
CLRC |
|
; Сбрасываем бит переноса, задавая начальные |
|
|
|
; условия для следующей команды |
|
DADD |
R5,0(R8) |
; Складываем младшие разряды + C |
|
DADC |
2(R8) |
; Прибавляем перенос к старшим разрядам |
|
|
||
Пример 2 |
2 разрядное двоично десятичное число, находящееся в R5, прибавляется к 4 разрядно |
||
|
му числу, на которое указывает R8. |
||
|
CLRC |
|
; Сбрасываем бит переноса, задавая начальные |
|
|
|
; условия для следующей команды |
|
DADD.B |
R5,0(R8) ; Складываем младшие разряды + C |
|
|
DADC.B |
1(R8) |
; Прибавляем перенос к старшим разрядам |
|
|
|
|
152 Глава 4. 16#битное RISC ЦПУ MSP430X
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 (слово > 7999h, байт > 79h), иначе |
||||
состояния |
сбрасывается. |
|
|
|
|
|
Z: Устанавливается, если результат нулевой, иначе сбрасывается. |
||||
|
C: Устанавливается, если результат слишком велик (слово > 9999h, байт > 99h), иначе |
||||
|
сбрасывается. |
|
|
|
|
|
V: Не определён. |
|
|
|
|
|
|
||||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||||
режима |
|
|
|
|
|
|
|
|
|||
Пример 1 |
Двоично десятичное число |
10 прибавляется к 16 битному BCD счётчику DECCNTR. |
|||
|
DADD |
#10h,&DECCNTR |
; Прибавляем 10 к 4$разрядному BCD$счётчику |
||
|
|
||||
Пример 2 |
8 разрядное двоично десятичное число, расположенное в ОЗУ по адресам BCD и |
||||
|
BCD+2, прибавляется к 8 разрядному числу, находящемуся в R4 и R5 (старшие |
||||
|
разряды — BCD+2 и R5). |
|
|
||
|
CLRC |
|
|
; Сбрасываем бит переноса |
|
|
DADD.W |
&BCD,R4 |
|
; Складываем младшие разряды. R4.19:16 = 0 |
|
|
DADD.W |
&BCD+2,R5 |
; Складываем старшие разряды с учётом |
||
|
|
|
|
; переноса. R5.19:16 = 0 |
|
|
JC |
OVERFLOW |
|
; Результат > 9999’9999, переходим |
|
|
|
|
|
; к обработчику ошибок |
|
|
... |
|
|
; Результат нормальный |
|
|
|
||||
Пример 3 |
2 разрядное двоично десятичное число, расположенное в слове BCD, прибавляется к 2 |
||||
|
разрядному числу, находящемуся в R4. |
|
|||
|
CLRC |
|
; Сбрасываем бит переноса |
||
|
DADD.B |
&BCD,R4 |
; Складываем BCD и R4. R4: 00ddh |
||
|
|
|
|
|
|
4.6. Описание набора команд 153
* 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 |
Не используйте данную процедуру для копирования перекрывающихся блоков (Рис. 4.36).
EDE
TONI
EDE+254
TONI+254
Рис. 4.36. Перекрытие блоков.
154 Глава 4. 16#битное RISC ЦПУ MSP430X
* 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. |
||||
|
DECD |
R10 |
; R10 = R10 $ 2 |
||
|
; Копируем блок из 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 |
|
||
|
|
|
|
|
|
4.6. Описание набора команд 155
* 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.
156 Глава 4. 16#битное RISC ЦПУ MSP430X
* 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), всегда выпол няется, даже если на момент разрешения прерываний имеются отложенные за просы прерываний.
4.6. Описание набора команд 157
* 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 |
|
|
|
|
|
158 Глава 4. 16#битное RISC ЦПУ MSP430X
* 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 не изменяются |
||||
режима |
|
|
|
|
|
|
|
||||
Пример 1 |
Удаление значения с вершины стека без использования регистров. |
||||
|
...... |
|
|
|
|
|
PUSH |
R5 |
; В R5 результат вычислений, сохранённый в |
||
|
|
|
; системном стеке |
||
|
INCD |
SP |
; Удаляем значение с вершины стека, модифицируя |
||
|
|
|
; указатель стека |
||
|
|
|
; Не используйте INCD.B, так как содержимое SP |
||
|
|
|
; всегда выровнено по границе слова |
||
|
RET |
|
|
|
|
|
|
||||
Пример 2 |
Байт, расположенный на вершине стека, увеличиваем на 2. |
||||
|
INCD.B |
0(SP) |
; Увеличиваем на 2 верхний байт в стеке |
||
|
|
|
|
|
|
4.6. Описание набора команд 159
* 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 |
|
|
|
|
|
|
|
160 Глава 4. 16#битное RISC ЦПУ MSP430X
* JC |
Переход[.W], если бит переноса установлен |
||
* JHS |
Переход, если «выше или равно» (беззнаковое сравнение) |
||
|
|
|
|
Синтаксис |
JC |
label |
|
|
JHS |
label |
|
|
|
||
Операция |
Если C = 1, то PC + (2 смещение) PC. |
||
|
Если C = 0, то выполняется следующая команда. |
||
|
|
||
Описание |
Проверяется бит переноса (C) регистра состояния. Если он установлен, то смещение |
||
|
(10 битное число со знаком), содержащееся в слове команды, умножается на 2, расши |
||
|
ряется до 20 битного значения и прибавляется к счётчику команд. Это позволяет осу |
||
|
ществлять переход в диапазоне от –511 до +512 слов относительно текущего значения |
||
|
счётчика команд в пределах всего адресного пространства. Если бит C сброшен, то вы |
||
|
полняется команда, следующая за командой перехода. |
||
|
Команда JC используется для проверки бита переноса C. |
||
|
Команда JHS используется для сравнения чисел без знака. |
||
|
|
||
Биты |
Биты состояния не изменяются |
||
состояния |
|
|
|
|
|
||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||
режима |
|
|
|
|
|
||
Пример 1 |
Сигнал P1IN.1 используется для управления ходом выполнения программы. |
||
|
BIT.B |
#02h,&P1IN |
; Состояние бита порта $> бит переноса C |
|
JC |
Label1 |
; Если C = 1, переходим к Label1 |
|
... |
|
; C = 0, продолжаем выполнение |
|
|
||
Пример 2 |
Если R5 R6 (беззнаковое содержимое), то выполнение программы продолжается |
||
|
с метки Label2. |
|
|
|
CMP |
R6,R5 |
; R5 >= R6? Признак – бит C |
|
JHS |
Label2 |
; Да, C = 1 |
|
... |
|
; Нет, R5 < R6. Продолжаем |
|
|
|
|