Микропроцессорная техника / Семейство микроконтроллеров MSP430x2xx_
.pdf4.6. Описание набора команд 191
BITX.A, BITX[.W], BITX.B Проверка битов операнда
Синтаксис |
BITX.A |
src,dst |
|
|
|
BITX |
src,dst или |
BITX.W |
src,dst |
|
BITX.B |
src,dst |
|
|
|
|
|
|
|
Операция |
src .and. dst |
|
|
|
|
|
|||
Описание |
Выполняется операция «Логическое И» между операндом источником и операндом |
|||
|
приёмником. Результат операции влияет только на биты состояния регистра SR. Оба |
|||
|
операнда могут находиться в любом месте адресного пространства |
|||
|
|
|||
Биты |
N: Устанавливается, если результат отрицательный (MSB = 1), сбрасывается — если по |
|||
состояния |
ложительный (MSB = 0). |
|
||
|
Z: Устанавливается, если результат нулевой, иначе сбрасывается. |
|||
|
C: Устанавливается, если результат ненулевой, иначе сбрасывается. С = (.not. Z) |
|||
|
V: Сбрасывается. |
|
|
|
|
|
|||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
|||
режима |
|
|
|
|
|
|
|||
Пример 1 |
Если установлен бит 16 или 15 регистра R5 (20 битное значение) или оба этих бита, то |
|||
|
выполняется переход к метке TONI. |
|
||
|
BITX.A |
#018000h,R5 |
; Проверяем биты R5.16:15 |
|
|
JNZ |
TONI |
; Хотя бы один бит установлен |
|
|
... |
|
; Оба бита сброшены |
|
|
|
|||
Пример 2 |
Слово из таблицы, адресуемое регистром R5 (20 битный адрес), используется для про |
|||
|
верки битов регистра R7. Если установлен хотя бы один бит, то выполняется переход к |
|||
|
метке TONI. |
|
|
|
|
BITX.W |
@R5,R7 |
; Проверяем биты R7 |
|
|
JC |
TONI |
; Хотя бы один бит установлен |
|
|
... |
|
; Все биты сброшены |
|
|
|
|||
Пример 3 |
Байт из таблицы, адресуемый регистром R5 (20 битный адрес), используется для про |
|||
|
верки битов порта Port1. Если все биты сброшены, то выполняется переход к метке |
|||
|
TONI. Затем указатель устанавливается на следующий байт таблицы. |
|||
|
BITX.B |
@R5+,&P1OUT |
; Проверяем биты порта 1, R5 = R5 + 1 |
|
|
JNC |
TONI |
; Все требуемые биты сброшены |
|
|
... |
|
; Хотя бы один бит установлен |
|
|
|
|
|
|
192 Глава 4. 16#битное RISC ЦПУ MSP430X
* CLRX.A, * CLRX[.W], * CLRX.B Очистка операнда
Синтаксис |
CLRX.A |
dst |
|
|
|
CLRX |
dst или |
CLRX.W |
dst |
|
CLRX.B |
dst |
|
|
|
|
|
|
|
Операция |
0 dst |
|
|
|
|
|
|
|
|
Эмуляция |
MOVX.A |
#0,dst |
|
|
|
MOVX |
#0,dst |
|
|
|
MOVX.B |
#0,dst |
|
|
|
|
|
||
Описание |
Операнд приёмник обнуляется |
|
||
|
|
|
||
Биты |
Биты состояния не изменяются |
|
||
состояния |
|
|
|
|
|
|
|||
Пример |
Обнуляется 20 битное слово TONI в ОЗУ. |
|||
|
CLRX.A |
TONI |
; 0 $> TONI |
|
|
|
|
|
|
4.6. Описание набора команд 193
CMPX.A, CMPX[.W], CMPX.B Сравнение двух операндов
Синтаксис |
CMPX.A |
src,dst |
|
|
|
CMPX |
src,dst или |
CMPX.W |
src,dst |
|
CMPX.B |
src,dst |
|
|
|
|
|
||
Операция |
.not.src + 1 + dst или (dst – src) |
|
||
|
|
|||
Описание |
Операнд источник вычитается из операнда приёмника. Для выполнения этой операции |
|||
|
обратный код операнда источника плюс 1 складывается с операндом приёмником. |
|||
|
Операция влияет только на биты состояния регистра SR |
|||
|
|
|||
Биты |
N: Устанавливается, если результат отрицательный (src > dst), сбрасывается — если по |
|||
состояния |
ложительный (src dst). |
|
|
|
|
Z: Устанавливается, если результат нулевой (src = dst), иначе сбрасывается (src dst). |
|||
|
C: Устанавливается, если был перенос из MSB результата, иначе сбрасывается. |
|||
|
V: Устанавливается, если результат вычитания отрицательного операнда источника из |
|||
|
положительного операнда приёмника отрицателен или результат вычитания поло |
|||
|
жительного операнда источника из отрицательного операнда приёмника положи |
|||
|
телен, иначе сбрасывается. |
|
||
|
|
|||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
|||
режима |
|
|
|
|
|
|
|||
Пример 1 |
Слово EDE сравнивается с 20 битной константой 18000h. В случае равенства выполня |
|||
|
ется переход к метке TONI. |
|
|
|
|
CMP |
#18000h,EDE |
; Сравниваем EDE с 18000h |
|
|
JEQ |
TONI |
; EDE = 18000h |
|
|
... |
|
|
|
|
|
|||
Пример 2 |
Слово из таблицы, адресуемое регистром R5 (20 битный адрес), сравнивается с содер |
|||
|
жимым регистра R7. Если число в R7 меньше табличного значения (сравниваются 16 |
|||
|
битные числа со знаком), то выполняется переход к метке TONI. |
|||
|
CMPX.W |
@R5,R7 |
; Сравниваем два числа со знаком |
|
|
JL |
TONI |
; R7 < @R5 |
|
|
... |
|
; R7 >= @R5 |
|
|
|
|||
Пример 3 |
Байт из таблицы, адресуемый регистром R5 (20 битный адрес), сравнивается с входным |
|||
|
значением порта Port1. Если значения равны, то выполняется переход к метке TONI. За |
|||
|
тем указатель устанавливается на следующий байт таблицы. |
|||
|
CMPX.B |
@R5+,&P1IN |
; Сравниваем биты порта с таблицей, |
|
|
|
|
; R5 = R5 + 1 |
|
|
JEQ |
TONI |
; Значения одинаковы |
|
|
... |
|
; Значения разные |
|
|
|
|
|
|
Замечание. Для увеличения плотности кода и скорости выполнения программы используйте коман ду CMPA в следующих случаях:
CMPA Rsrc,Rdst или CMPA #imm20,Rdst
194 Глава 4. 16#битное RISC ЦПУ MSP430X
* DADCX.A, * DADCX[.W], * DADCX.B
Сложение переноса с операндом (BCDCарифметика)
Синтаксис |
DADCX.B |
dst |
|
|
|
DADCX |
dst или DADCX.W |
dst |
|
|
DADCX.B |
dst |
|
|
|
|
|
||
Операция |
dst + C dst (BCD арифметика) |
|
||
|
|
|
|
|
Эмуляция |
DADDX.A #0,dst |
|
|
|
|
DADDX |
#0,dst |
|
|
|
DADDX.B #0,dst |
|
|
|
|
|
|||
Описание |
Бит переноса (C) прибавляется к операнду приёмнику по правилам двоично десяти |
|||
|
чной арифметики |
|
|
|
|
|
|||
Биты |
N: Устанавливается, если MSB результата равен 1 (20 битное значение > 79999h, |
|||
состояния |
16 битное значение > 7999h, 8 битное значение > 79h), иначе сбрасывается. |
|||
|
Z: Устанавливается, если результат нулевой, иначе сбрасывается. |
|||
|
C: Устанавливается, если результат слишком велик (20 битное значение > 99999h, |
|||
|
16 битное значение > 9999h, 8 битное значение > 99h), иначе сбрасывается. |
|||
|
V: Не определён. |
|
|
|
|
|
|||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
|||
режима |
|
|
|
|
|
|
|||
Пример |
40 битный BCD счётчик, находящийся в регистрах R12 и R13, инкрементируется. |
|||
|
DADDX.A |
#1,0(R12) |
; Инкрементируем младшие разряды |
|
|
DADCX.A |
0(R13) |
; Прибавляем перенос к старшим разрядам |
|
|
|
|
|
|
4.6. Описание набора команд 195
DADDX.A, DADDX[.W], DADDX.B
Сложение двух операндов с учётом переноса (BCDCарифметика)
Синтаксис |
DADDX.A |
src,dst |
|
|
|
DADDX |
src,dst |
или DADD.W |
src,dst |
|
DADDX.B |
src,dst |
|
|
|
|
|
||
Операция |
src + dst + C dst (BCD арифметика) |
|
||
|
|
|||
Описание |
Операнды интерпретируются как 2 , 4 и 5 разрядные (суффиксы .B, .W и .A соответ |
|||
|
ственно) положительные BCD числа. Операнд источник и бит переноса (C) прибавля |
|||
|
ются к операнду приёмнику по правилам двоично десятичной арифметики. Содержи |
|||
|
мое операнда источника не изменяется. Предыдущее содержимое операнда приёмника |
|||
|
теряется. Для не BCD чисел результат операции не определён. Оба операнда могут нахо |
|||
|
диться в любом месте адресного пространства |
|||
|
|
|||
Биты |
N: Устанавливается, если MSB результата равен 1 (20 битное значение > 79999h, |
|||
состояния |
16 битное значение > 7999h, 8 битное значение > 79h), иначе сбрасывается. |
|||
|
Z: Устанавливается, если результат нулевой, иначе сбрасывается. |
|||
|
C: Устанавливается, если результат слишком велик (20 битное значение > 99999h, |
|||
|
16 битное значение > 9999h, 8 битное значение > 99h), иначе сбрасывается. |
|||
|
V: Не определён. |
|
|
|
|
|
|||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
|||
режима |
|
|
|
|
|
|
|||
Пример 1 |
Двоично десятичное число 10 прибавляется к 20 битному BCD счётчику DECCNTR. |
|||
|
DADDX.A |
#10h,&DECCNTR ; Прибавляем 10 к 5$разрядному |
||
|
|
|
; BCD$счётчику |
|
|
|
|||
Пример 2 |
8 разрядное двоично десятичное число, расположенное в ОЗУ по адресам BCD и |
|||
|
BCD+2, прибавляется к 8 разрядному числу, находящемуся в R4 и R5 (старшие |
|||
|
разряды — BCD+2 и R5). |
|
||
|
CLRC |
|
; Сбрасываем бит переноса |
|
|
DADDX.W |
BCD,R4 |
; Складываем младшие разряды |
|
|
DADDX.W |
BCD+2,R5 |
; Складываем старшие разряды с учётом переноса |
|
|
JC |
OVERFLOW |
; Результат > 9999’9999, переходим |
|
|
|
|
; к обработчику ошибок |
|
|
... |
|
; Результат нормальный |
|
|
|
|||
Пример 3 |
2 разрядное двоично десятичное число, расположенное в слове BCD (20 битный ад |
|||
|
рес), прибавляется к 2 разрядному числу, находящемуся в R4. |
|||
|
CLRC |
|
; Сбрасываем бит переноса |
|
|
DADDX.B |
BCD,R4 |
; Складываем BCD и R4. R4: 000ddh |
|
|
|
|
|
|
196 Глава 4. 16#битное RISC ЦПУ MSP430X
* DECX.A, * DECX[.W], * DECX.B Декрементирование операнда
Синтаксис |
DECX.A |
dst |
|
|
|
DECX |
dst или |
DECX.W |
dst |
|
DECX.B |
dst |
|
|
|
|
|
|
|
Операция |
dst – 1 dst |
|
|
|
|
|
|
|
|
Эмуляция |
SUBX.A |
#1,dst |
|
|
|
SUBX |
#1,dst |
|
|
|
SUBX.B |
#1,dst |
|
|
|
|
|||
Описание |
Значение операнда приёмника уменьшается на 1. Предыдущее содержимое операнда |
|||
|
приёмника теряется |
|
|
|
|
|
|||
Биты |
N: Устанавливается, если результат отрицательный, сбрасывается — если положитель |
|||
состояния |
ный. |
|
|
|
|
Z: Устанавливается, если dst содержал 1, иначе сбрасывается. |
|||
|
C: Сбрасывается, если dst содержал 0, иначе устанавливается. |
|||
|
V: Устанавливается, если произошло переполнение, иначе сбрасывается. |
|||
|
|
|||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
|||
режима |
|
|
|
|
|
|
|||
Пример |
20 битное значение TONI уменьшается на 1. |
|||
|
DECX.A |
TONI |
; Декрементируем TONI |
|
|
|
|
|
|
* DECDX.A, * DECDX[.W], * DECDX.B Уменьшение операнда на 2
Синтаксис |
DECDX.A |
dst |
|
|
|
DECDX |
dst или |
DECDX.W |
dst |
|
DECDX.B |
dst |
|
|
|
|
|
|
|
Операция |
dst – 2 dst |
|
|
|
|
|
|
|
|
Эмуляция |
SUBX.A |
#2,dst |
|
|
|
SUBX |
#2,dst |
|
|
|
SUBX.B |
#2,dst |
|
|
|
|
|||
Описание |
Значение операнда приёмника уменьшается на 2. Предыдущее содержимое операнда |
|||
|
приёмника теряется |
|
|
|
|
|
|||
Биты |
N: Устанавливается, если результат отрицательный, сбрасывается — если положитель |
|||
состояния |
ный. |
|
|
|
|
Z: Устанавливается, если dst содержал 2, иначе сбрасывается. |
|||
|
C: Сбрасывается, если dst содержал 0 или 1, иначе устанавливается. |
|||
|
V: Устанавливается, если произошло переполнение, иначе сбрасывается. |
|||
|
|
|||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
|||
режима |
|
|
|
|
|
|
|||
Пример |
20 битное значение TONI уменьшается на 2. |
|||
|
DECDX.A |
TONI |
; Уменьшаем TONI на 2 |
|
|
|
|
|
|
4.6. Описание набора команд 197
* INCX.A, * INCX[.W], * INCX.B Инкрементирование операнда
Синтаксис |
INCX.A |
dst |
|
|
|
INCX |
dst или |
INCX.W dst |
|
|
INCX.B |
dst |
|
|
|
|
|
||
Операция |
dst + 1 dst |
|
||
|
|
|
|
|
Эмуляция |
ADDX.A |
#1,dst |
|
|
|
ADDX |
#1,dst |
|
|
|
ADDX.B |
#1,dst |
|
|
|
|
|||
Описание |
Значение операнда приёмника увеличивается на 1. Предыдущее содержимое операнда |
|||
|
приёмника теряется |
|
||
|
|
|||
Биты |
N: Устанавливается, если результат отрицательный, сбрасывается — если положитель |
|||
состояния |
|
ный. |
|
|
|
Z: |
Устанавливается, если dst содержал 0FFFFFh, иначе сбрасывается. |
||
|
|
Устанавливается, если dst содержал 0FFFFh, иначе сбрасывается. |
||
|
|
Устанавливается, если dst содержал 0FFh, иначе сбрасывается. |
||
|
C: |
Устанавливается, если dst содержал 0FFFFFh, иначе сбрасывается. |
||
|
|
Устанавливается, если dst содержал 0FFFFh, иначе сбрасывается. |
||
|
|
Устанавливается, если dst содержал 0FFh, иначе сбрасывается. |
||
|
V: |
Устанавливается, если dst содержал 07FFFFh, иначе сбрасывается. |
||
|
|
Устанавливается, если dst содержал 07FFFh, иначе сбрасывается. |
||
|
|
Устанавливается, если dst содержал 07Fh, иначе сбрасывается. |
||
|
|
|||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
|||
режима |
|
|
|
|
|
|
|||
Пример |
20 битное значение TONI увеличивается на 1. |
|||
|
INCX.A |
TONI |
; Инкрементируем TONI |
|
|
|
|
|
|
198 Глава 4. 16#битное RISC ЦПУ MSP430X
* INCDX.A, * INCDX[.W], * INCDX.B Увеличение операнда на 2
Синтаксис |
INCDX.A |
dst |
|
|
|
|
INCDX |
dst или |
INCDX.W |
dst |
|
|
INCDX.B |
dst |
|
|
|
|
|
|
|
||
Операция |
dst + 2 dst |
|
|
||
|
|
|
|
|
|
Эмуляция |
ADDX.A |
#2,dst |
|
|
|
|
ADDX |
#2,dst |
|
|
|
|
ADDX.B |
#2,dst |
|
|
|
|
|
||||
Описание |
Значение операнда приёмника увеличивается на 2. Предыдущее содержимое операнда |
||||
|
приёмника теряется. |
|
|
||
|
|
||||
Биты |
N: Устанавливается, если результат отрицательный, сбрасывается — если положитель |
||||
состояния |
|
ный. |
|
|
|
|
Z: |
Устанавливается, если dst содержал 0FFFFEh, иначе сбрасывается. |
|||
|
|
Устанавливается, если dst содержал 0FFFEh, иначе сбрасывается. |
|||
|
|
Устанавливается, если dst содержал 0FEh, иначе сбрасывается. |
|||
|
C: Устанавливается, если dst содержал 0FFFFEh или 0FFFFFh, иначе сбрасывается. |
||||
|
|
Устанавливается, если dst содержал 0FFFEh или 0FFFFh, иначе сбрасывается. |
|||
|
|
Устанавливается, если dst содержал 0FEh или 0FFh, иначе сбрасывается. |
|||
|
V: |
Устанавливается, если dst содержал 07FFFEh или 07FFFFh, иначе сбрасывается. |
|||
|
|
Устанавливается, если dst содержал 07FFEh или 07FFFh, иначе сбрасывается. |
|||
|
|
Устанавливается, если dst содержал 07FEh или 07Fh, иначе сбрасывается. |
|||
|
|
||||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||||
режима |
|
|
|
|
|
|
|
||||
Пример |
Байт LEO в ОЗУ увеличивается на 2. Счётчик команд указывает на верхнюю область |
||||
|
памяти. |
|
|
|
|
|
INCDX.B |
LEO |
; Увеличиваем LEO на 2 |
||
|
|
|
|
|
|
4.6. Описание набора команд 199
* INVX.A, * INVX[.W], * INVX.B Инвертирование операнда
Синтаксис |
INVX.A |
dst |
|
|
INVX |
dst или |
INVX.W dst |
|
INVX.B |
dst |
|
|
|
|
|
Операция |
.NOT.dst dst |
|
|
|
|
|
|
Эмуляция |
XORX.A |
#0FFFFFh,dst |
|
|
XORX |
#0FFFFh,dst |
|
|
XORX.B |
#0FFh,dst |
|
|
|
||
Описание |
Значение операнда приёмника инвертируется. Предыдущее содержимое теряется |
||
|
|
||
Биты |
N: Устанавливается, если результат отрицательный, сбрасывается — если положитель |
||
состояния |
ный. |
|
|
|
Z: Устанавливается, если dst содержал 0FFFFFh, иначе сбрасывается. |
||
|
Устанавливается, если dst содержал 0FFFFh, иначе сбрасывается. |
||
|
Устанавливается, если dst содержал 0FFh, иначе сбрасывается. |
||
|
C: Устанавливается, если результат не равен нулю, иначе сбрасывается (C = .NOT. Z). |
||
|
V: Устанавливается, если операнд имел отрицательное значение, иначе сбрасывается. |
||
|
|
||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||
режима |
|
|
|
|
|
||
Пример 1 |
Вычисляется дополнительный код 20 битного содержимого регистра R5. |
||
|
INVX.A |
R5 |
; Инвертируем R5 |
|
INCX.A |
R5 |
; В R5 – дополнительный код |
|
|
||
Пример 2 |
Вычисляется дополнительный код байта LEO в ОЗУ. Счётчик команд указывает на верх |
||
|
нюю область памяти. |
|
|
|
INVX.B |
LEO |
; Инвертируем LEO |
|
INCX.B |
LEO |
; В LEO – дополнительный код |
|
|
|
|
200 Глава 4. 16#битное RISC ЦПУ MSP430X
MOVX.A, MOVX[.W], MOVX.B Пересылка операнда
Синтаксис |
MOVX.A |
src,dst |
|
|
|
|
MOVX |
src,dst или MOVX.W |
src,dst |
||
|
MOVX.B |
src,dst |
|
|
|
|
|
|
|
|
|
Операция |
src dst |
|
|
|
|
|
|
||||
Описание |
Операнд источник пересылается в операнд приёмник. Содержимое операнда источни |
||||
|
ка не изменяется |
|
|
|
|
|
|
|
|
||
Биты |
Биты состояния не изменяются |
|
|
||
состояния |
|
|
|
|
|
|
|
|
|||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
|
|||
режима |
|
|
|
|
|
|
|
||||
Пример 1 |
20 битная константа 18000h загружается в слово EDE. |
||||
|
MOVX.A #018000h,&EDE |
|
; 18000h $> EDE |
||
|
|
||||
Пример 2 |
Содержимое таблицы EDE (2 байтные элементы, 20 битная адресация) копируется |
||||
|
в таблицу TOM. Размер таблиц — 030h слов. |
|
|||
|
|
MOVA |
#EDE,R10 |
|
; Инициализируем указатель |
|
Loop |
MOVX.W |
@R10+,TOM$EDE$2(R10) |
; Используем указатель в R10 |
|
|
|
|
|
|
; для обеих таблиц. R10 + 2 |
|
|
CMPA |
#EDE+60h,R10 |
|
; Достигли конца таблицы? |
|
|
JLO |
Loop |
|
; Ещё нет |
|
|
... |
|
|
; Копирование завершено |
|
|
||||
Пример 3 |
Содержимое таблицы EDE (1 байтные элементы, 20 битная адресация) копируется |
||||
|
в таблицу TOM. Размер таблиц — 020h байтов. |
|
|||
|
|
MOVA |
#EDE,R10 |
|
; Инициализируем указатель |
|
|
MOV |
#020h,R9 |
|
; Инициализируем счетчик |
|
Loop |
MOVX.B |
@R10+,TOM$EDE$1(R10) |
; Используем указатель в R10 |
|
|
|
|
|
|
; для обеих таблиц. R10 + 1 |
|
|
DEC |
R9 |
|
; Декрементируем счетчик |
|
|
JNZ |
Loop |
|
; Счётчик 0, продолжаем |
|
|
|
|
|
; копирование |
|
|
... |
|
|
; Копирование завершено |
|
|
|
|
|
|
Из 28 возможных сочетаний режимов адресации операндов в десяти случаях вместо команды MOVX.A можно использовать команду MOVA. При этом экономит ся два слова памяти и несколько тактов. Речь идёт о сочетаниях:
MOVX.A Rsrc,Rdst |
MOVA Rsrc,Rdst |
; Регистровый/Регистровый |
MOVX.A #imm20,Rdst |
MOVA #imm20,Rdst |
; Непосредственный/Регистровый |
MOVX.A &abs20,Rdst |
MOVA &abs20,Rdst |
; Абсолютный/Регистровый |
MOVX.A @Rsrc,Rdst |
MOVA @Rsrc,Rdst |
; Косвенный/Регистровый |
MOVX.A @Rsrc+,Rdst |
MOVA @Rsrc+,Rdst |
; Косвенный с автоинкр./Регистровый |
MOVX.A Rsrc,&abs20 |
MOVA Rsrc,&abs20 |
; Регистровый/Абсолютный |
Следующие четыре замены применимы только в том случае, если для адреса ции операндов можно использовать 16 битные смещения.
MOVX.A z20(Rsrc),Rdst |
MOVA z16(Rsrc),Rdst |
; Индексный/Регистровый |
|||
MOVX.A Rsrc,z20(Rdst) |
MOVA Rsrc,z16(Rdst) |
; Регистровый/Индексный |
|||
MOVX.A |
symb20,Rdst |
MOVA |
symb16,Rdst |
; |
Относительный/Регистровый |
MOVX.A |
Rsrc,symb20 |
MOVA |
Rsrc,symb16 |
; |
Регистровый/Относительный |