Микропроцессорная техника / Семейство микроконтроллеров MSP430x2xx_
.pdf4.6. Описание набора команд 161
JEQ |
Переход[.W], если «равно» |
||
JZ |
Переход, если ноль |
||
|
|
|
|
Синтаксис |
JEQ |
label |
|
|
JZ |
label |
|
|
|
||
Операция |
Если Z = 1, то PC + (2 смещение) PC. |
||
|
Если Z = 0, то выполняется следующая команда. |
||
|
|
||
Описание |
Проверяется бит нуля (Z) регистра состояния. Если он установлен, смещение (10 бит |
||
|
ное число со знаком), содержащееся в слове команды, умножается на 2, расширяется до |
||
|
20 битного значения и прибавляется к счётчику команд. Это позволяет осуществлять |
||
|
переход в диапазоне от –511 до +512 слов относительно текущего значения счётчика ко |
||
|
манд в пределах всего адресного пространства. Если бит Z сброшен, то выполняется ко |
||
|
манда, следующая за командой перехода. |
||
|
Команда JZ используется для проверки бита нуля Z. |
||
|
Команда JEQ используется для сравнения операндов |
||
|
|
||
Биты |
Биты состояния не изменяются |
||
состояния |
|
|
|
|
|
||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||
режима |
|
|
|
|
|
||
Пример 1 |
Сигнал P2IN.0 используется для управления ходом выполнения программы. |
||
|
BIT.B |
#1,&P2IN |
; Бит 0 порта 2 сброшен? |
|
JZ |
Label1 |
; Да, переходим к Label1 |
|
... |
|
; Нет, продолжаем выполнение |
|
|
||
Пример 2 |
Если R5 = 15000h (20 битное число), то выполнение программы продолжается с метки |
||
|
Label2. |
|
|
|
CMPA |
#15000h,R5 |
; R5 = 15000h? Признак – бит Z |
|
JEQ |
Label2 |
; Да, R5 = 15000h, Z = 1 |
|
... |
|
; Нет, R5 15000h. Остаёмся здесь |
|
|
||
Пример 3 |
Содержимое регистра R7 (20 битный счётчик) инкрементируется. Если оно становится |
||
|
равным нулю, то выполняется переход к метке Label4. |
||
|
ADDA |
#1,R7 |
; Инкрементируем R7 |
|
JZ |
Label4 |
; Достигли нуля? Переходим к Label4 |
|
... |
|
; R7 0. Остаёмся здесь |
|
|
|
|
162 Глава 4. 16#битное RISC ЦПУ MSP430X
JGE |
Переход[.W], если «больше или равно» (сравнение со знаком) |
||
|
|
|
|
Синтаксис |
JGE |
label |
|
|
|
||
Операция |
Если (N .xor. V) = 0, то PC + (2 смещение) PC. |
||
|
Если (N .xor. V) = 1, то выполняется следующая команда. |
||
|
|
||
Описание |
Проверяются биты переполнения (V) и отрицательного значения (N) регистра состояния. |
||
|
Если установлены или сброшены оба бита, то смещение (10 битное число со знаком), со |
||
|
держащееся в слове команды, умножается на 2, расширяется до 20 битного значения и |
||
|
прибавляется к счётчику команд. Это позволяет осуществлять переход в диапазоне от |
||
|
–511 до +512 слов относительно текущего значения счётчика команд в пределах всего ад |
||
|
ресного пространства. Если установлен только один бит, то выполняется команда, следу |
||
|
ющая за командой перехода. Эта команда используется при сравнении чисел со знаком. |
||
|
Команда JGE используется для сравнения операндов со знаком: даже в случае некоррек |
||
|
тного результата, вызванного переполнением, результат сравнения будет корректным. |
||
|
Примечание. Команда JGE эмулирует нереализованную команду JP (переход, если ре |
||
|
зультат положителен) при использовании после команд AND, BIT, RRA, SXTX и TST. Эти |
||
|
команды сбрасывают бит V регистра состояния |
||
|
|
||
Биты |
Биты состояния не изменяются |
||
состояния |
|
|
|
|
|
||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||
режима |
|
|
|
|
|
||
Пример 1 |
Если байт EDE (нижние 64 КБ) содержит положительное число, то выполняется пере |
||
|
ход к метке Label1. Этот пример может выполняться в любом месте адресного про |
||
|
странства. |
|
|
|
TST.B |
&EDE |
; EDE > 0? V <$ 0 |
|
JGE |
Label1 |
; Да, JGE эмулирует команду JP |
|
... |
|
; Нет, 80h <= EDE <= FFh |
|
|
||
Пример 2 |
Если содержимое регистра R6 больше или равно содержимому ячейки памяти, адресуе |
||
|
мой регистром R7, то выполняется переход к метке Label5. Сравниваются числа со |
||
|
знаком. Данные и программа могут располагаться в любом месте адресного пространс |
||
|
тва. |
|
|
|
CMP |
@R7,R6 |
; R6 >= @R7? |
|
JGE |
Label5 |
; Да, переходим к Label5 |
|
... |
|
; Нет, остаёмся здесь |
|
|
||
Пример 3 |
Если R5 12345h (операнд со знаком), то выполнение программы продолжается с метки |
||
|
Label2. Программа может располагаться в любом месте адресного пространства. |
||
|
CMPA |
#12345h,R5 |
; R5 >= 12345h |
|
JGE |
Label2 |
; Да, 12344h < R5 <=7FFFFh |
|
... |
|
; Нет, 80000h <= R5 < 12345h |
|
|
|
|
|
|
|
4.6. Описание набора команд 163 |
|
|
||
JL |
Переход, если «меньше» (сравнение со знаком) |
||
|
|
|
|
Синтаксис |
JL |
label |
|
|
|
||
Операция |
Если (N .xor. V) = 1, то PC + (2 смещение) PC. |
||
|
Если (N .xor. V) = 0, то выполняется следующая команда. |
||
|
|
||
Описание |
Проверяются биты переполнения (V) и отрицательного значения (N) регистра состоя |
||
|
ния. Если установлен только один из битов, то смещение (10 битное число со знаком), |
||
|
содержащееся в слове команды, умножается на 2, расширяется до 20 битного значения |
||
|
и прибавляется к счётчику команд. Это позволяет осуществлять переход в диапазоне от |
||
|
–511 до +512 слов относительно текущего значения счётчика команд в пределах всего |
||
|
адресного пространства. Если установлены или сброшены оба бита, то выполняется ко |
||
|
манда, следующая за командой перехода. |
||
|
Команда JL используется для сравнения операндов со знаком: даже в случае некоррект |
||
|
ного результата, вызванного переполнением, результат сравнения будет корректным |
||
|
|
||
Биты |
Биты состояния не изменяются |
||
состояния |
|
|
|
|
|
||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||
режима |
|
|
|
|
|
||
Пример 1 |
Если содержимое байта EDE меньше, чем байта TONI, то выполняется переход к метке |
||
|
Label1. Байт EDE находится в пределах области PC ±32 КБ. |
||
|
CMP.B |
&EDE,TONI |
; EDE < TONI |
|
JL |
Label1 |
; Да |
|
... |
|
; Нет, TONI <= EDE |
|
|
||
Пример 2 |
Если содержимое регистра R6 меньше содержимого ячейки памяти, адресуемой регист |
||
|
ром R7 (20 битный адрес), то выполняется переход к метке Label5. Данные и програм |
||
|
ма могут располагаться в любом месте адресного пространства. |
||
|
CMP |
@R7,R6 |
; R6 < @R7? |
|
JL |
Label5 |
; Да, переходим к Label5 |
|
... |
|
; Нет, остаёмся здесь |
|
|
||
Пример 3 |
Если R5 < 12345h (операнд со знаком), то выполнение программы продолжается с метки |
||
|
Label2. Данные и программа могут располагаться в любом месте адресного прост |
||
|
ранства. |
|
|
|
CMPA |
#12345h,R5 |
; R5 < 12345h |
|
JL |
Label5 |
; Да, 80000h <= R5 < 12345h |
|
... |
|
; Нет, 12344h < R5 <=7FFFFh |
|
|
|
|
164 Глава 4. 16#битное RISC ЦПУ MSP430X
JMP |
Безусловный переход |
||
|
|
|
|
Синтаксис |
JMP |
label |
|
|
|
|
|
Операция |
PC + (2 смещение) PC |
|
|
|
|
||
Описание |
Смещение (10 битное число со знаком), содержащееся в слове команды, умножается на |
||
|
2, расширяется до 20 битного значения и прибавляется к счётчику команд. Это позволя |
||
|
ет осуществлять переход в диапазоне от –511 до +512 слов относительно текущего зна |
||
|
чения счётчика команд в пределах всего адресного пространства. Данная команда может |
||
|
использоваться вместо команды BR или BRA для реализации перехода в пределах от –511 |
||
|
до +512 слов относительно счётчика команд |
||
|
|
||
Биты |
Биты состояния не изменяются |
||
состояния |
|
|
|
|
|
||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||
режима |
|
|
|
|
|
||
Пример 1 |
В байт STATUS заносится число 10, после чего выполняется переход к метке MAINLOOP. |
||
|
Байт STATUS располагается в нижней 64 КБ области памяти, а программа может распо |
||
|
лагаться в любом месте адресного пространства. |
||
|
MOV.B |
#10,&STATUS |
; STATUS = 10 |
|
JMP |
MAINLOOP |
; Переходим к основному циклу |
Пример 2 Считывается содержимое вектора прерывания Timer_A3, которое затем используется для перехода к требуемому обработчику. Программа может располагаться в любом месте адресного пространства, однако точки входа в обработчики прерываний должны распо лагаться в нижней 64 КБ области памяти.
ADD |
&TAIV,PC |
; Прибавляем содержимое вектора |
к PC |
||||
RETI |
|
; Нет |
прерываний Timer_A |
|
|||
JMP |
IHCCR1 |
; Было прерывание |
от |
1$го блока |
таймера |
||
JMP |
IHCCR2 |
; |
Было прерывание |
от |
2$го блока |
таймера |
|
RETI |
|
; |
Нет |
обрабатываемых |
прерываний, выходим |
|
|
|
4.6. Описание набора команд 165 |
|
|
||
JN |
Переход, если отрицательное значение |
||
|
|
|
|
Синтаксис |
JN |
label |
|
|
|
||
Операция |
Если N = 1, то PC + (2 смещение) PC. |
||
|
Если N = 0, то выполняется следующая команда. |
||
|
|
||
Описание |
Проверяется бит отрицательного значения (N) регистра состояния. Если он установлен, |
||
|
то смещение (10 битное число со знаком), содержащееся в слове команды, умножается |
||
|
на 2, расширяется до 20 битного значения и прибавляется к счётчику команд. Это поз |
||
|
воляет осуществлять переход в диапазоне от –511 до +512 слов относительно текущего |
||
|
значения счётчика команд в пределах всего адресного пространства. Если бит N сбро |
||
|
шен, то выполняется команда, следующая за командой перехода |
||
|
|
||
Биты |
Биты состояния не изменяются |
||
состояния |
|
|
|
|
|
||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||
режима |
|
|
|
|
|
||
Пример 1 |
Проверяется содержимое байта COUNT. Если оно отрицательно, то выполнение про |
||
|
граммы продолжается с метки Label0. Байт COUNT располагается в нижней 64 КБ об |
||
|
ласти памяти, а программа может располагаться в любом месте адресного пространства. |
||
|
TST.B |
&COUNT |
; COUNT < 0? |
|
JN |
L$1 |
; Да, переходим к Label0 |
|
... |
|
; COUNT 0 |
|
|
||
Пример 2 |
Регистр R6 вычитается из R5. Если результат отрицателен, то выполняется переход к |
||
|
метке Label2. Программа может располагаться в любом месте адресного пространства. |
||
|
SUB |
R6,R5 |
; R5 – R6 $> R5 |
|
JN |
Label2 |
; R5 < 0: R6 > R5 (N = 1) |
|
... |
|
; R5 0, остаёмся здесь |
|
|
||
Пример 3 |
Регистр R7 (20 битный счётчик) декрементируется. Если его значение становится отри |
||
|
цательным, то выполнение программы продолжается с метки Label4. Программа мо |
||
|
жет располагаться в любом месте адресного пространства. |
||
|
SUBA |
#1,R7 |
; Декрементируем R7 |
|
JN |
Label4 |
; R7 < 0, переходим к Label4 |
|
... |
|
; R7 0, остаёмся здесь |
|
|
|
|
166 Глава 4. 16#битное RISC ЦПУ MSP430X
JNC |
Переход, если нет переноса |
||
JLO |
Переход, если «ниже» (сравнение без знака) |
||
|
|
|
|
Синтаксис |
JNC |
label |
|
|
JLO |
label |
|
|
|
||
Операция |
Если С = 0, то PC + (2 смещение) PC. |
||
|
Если С = 1, то выполняется следующая команда. |
||
|
|
||
Описание |
Проверяется бит переноса (C) регистра состояния. Если он сброшен, то смещение (10 |
||
|
битное число со знаком), содержащееся в слове команды, умножается на 2, расширяется |
||
|
до 20 битного значения и прибавляется к счётчику команд. Это позволяет осуществлять |
||
|
переход в диапазоне от –511 до +512 слов относительно текущего значения счётчика ко |
||
|
манд в пределах всего адресного пространства. Если бит C установлен, то выполняется |
||
|
команда, следующая за командой перехода. |
||
|
Команда JNC используется для проверки бита переноса C. |
||
|
Команда JLO используется для сравнения чисел без знака |
||
|
|
||
Биты |
Биты состояния не изменяются |
||
состояния |
|
|
|
|
|
||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||
режима |
|
|
|
|
|
||
Пример 1 |
Если EDE <15, выполняется переход к метке Label2. Сравниваются числа без знака. |
||
|
Байт EDE располагается в нижней 64 КБ области памяти, а программа может распола |
||
|
гаться в любом месте адресного пространства. |
||
|
CMP.B |
#15,&EDE |
; EDE < 15? Признак –> бит C |
|
JLO |
Label2 |
; Да, EDE < 15. C = 0 |
|
... |
|
; Нет, EDE 15. Остаёмся здесь |
Пример 2 Слово TONI прибавляется к содержимому регистра R5. При отсутствии переноса вы полнение программы продолжается с метки Label0. Адрес TONI находится в пределах PC ±32 КБ.
ADD |
TONI,R5 |
; TONI + R5 $> |
R5. Перенос –> |
C |
|
JNC |
Label0 |
; Нет |
переноса |
|
|
... |
|
; Был |
перенос, остаёмся здесь |
|
4.6. Описание набора команд 167
JNZ |
Переход, если не ноль |
||
JNE |
Переход, если «не равно» |
||
|
|
|
|
Синтаксис |
JNZ |
label |
|
|
JNE |
label |
|
|
|
||
Операция |
Если Z = 0, то PC + (2 смещение) PC. |
||
|
Если Z = 1, то выполняется следующая команда. |
||
|
|
||
Описание |
Проверяется бит нуля (Z) регистра состояния. Если он сброшен, то смещение (10 бит |
||
|
ное число со знаком), содержащееся в слове команды, умножается на 2, расширяется до |
||
|
20 битного значения и прибавляется к счётчику команд. Это позволяет осуществлять |
||
|
переход в диапазоне от –511 до +512 слов относительно текущего значения счётчика ко |
||
|
манд в пределах всего адресного пространства. Если бит Z установлен, то выполняется |
||
|
команда, следующая за командой перехода. |
||
|
Команда JNZ используется для проверки бита нуля Z. |
||
|
Команда JNE используется для сравнения операндов |
||
|
|
||
Биты |
Биты состояния не изменяются |
||
состояния |
|
|
|
|
|
||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||
режима |
|
|
|
|
|
||
Пример 1 |
Проверяется значение байта STATUS. Если он не равен нулю, то выполняется переход к |
||
|
метке Label3. Адрес байта STATUS находится в диапазоне PC ±32 КБ. |
||
|
TST.B |
STATUS |
; STATUS = 0? |
|
JNZ |
Label3 |
; Нет, переходим к Label3 |
|
... |
|
; Да, остаёмся здесь |
|
|
||
Пример 2 |
Если слово EDE не равно 1500, то выполняется переход к метке Label2. Слово EDE |
||
|
располагается в нижней 64 КБ области памяти, а программа может располагаться в лю |
||
|
бом месте адресного пространства. |
||
|
CMP |
#1500,&EDE |
; EDE = 1500? Признак –> бит Z |
|
JNE |
Label2 |
; Нет, EDE 1500. |
|
... |
|
; Да, EDE = 1500. Продолжаем |
|
|
||
Пример 3 |
Регистр R7 (20 битный счётчик) декрементируется. Если он не равен нулю, то выполня |
||
|
ется переход к метке Label4. Программа может располагаться в любом месте адресного |
||
|
пространства. |
|
|
|
SUBA |
#1,R7 |
; Декрементируем R7 |
|
JNZ |
Label4 |
; R7 0, переходим к Label4 |
|
... |
|
; R7 = 0, остаёмся здесь |
|
|
|
|
168 Глава 4. 16#битное RISC ЦПУ MSP430X
MOV[.W], MOV.B Пересылка операнда
Синтаксис |
MOV |
src,dst или |
MOV.W |
src,dst |
|
|
|
|
MOV.B |
src,dst |
|
|
|
|
|
|
|
|
|
|
|
|
|
Операция |
src dst |
|
|
|
|
|
|
|
|
||||||
Описание |
Операнд источник пересылается в операнд приёмник. Содержимое операнда источни |
||||||
|
ка не изменяется |
|
|
|
|
|
|
|
|
|
|
|
|||
Биты |
Биты состояния не изменяются |
|
|
|
|||
состояния |
|
|
|
|
|
|
|
|
|
|
|
||||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
|
|
||||
режима |
|
|
|
|
|
|
|
|
|
||||||
Пример 1 |
16 битная константа 1800h загружается в слово EDE (нижняя 64 КБ область). |
||||||
|
MOV |
#01800h,&EDE |
; 1800h $> EDE |
|
|
||
|
|
||||||
Пример 2 |
Содержимое таблицы EDE (2 байтные элементы, 16 битная адресация) копируется в |
||||||
|
таблицу TOM. Размер таблиц — 030h слов. Обе таблицы располагаются в нижней 64 КБ |
||||||
|
области памяти. |
|
|
|
|
|
|
|
|
MOV |
#EDE,R10 |
|
; |
Инициализируем указатель |
|
|
Loop |
MOV |
@R10+,TOM$EDE$2(R10) |
; |
Используем указатель в R10 |
||
|
|
|
|
|
|
; |
для обеих таблиц. R10 + 2 |
|
|
CMP |
#EDE+60h,R10 |
|
; |
Достигли конца таблицы? |
|
|
|
JLO |
Loop |
|
|
; |
Ещё нет |
|
|
... |
|
|
|
; |
Копирование завершено |
|
|
||||||
Пример 3 |
Содержимое таблицы EDE (1 байтные элементы, 16 битная адресация) копируется в |
||||||
|
таблицу TOM. Размер таблиц — 020h байтов. Обе таблицы могут располагаться в любом |
||||||
|
месте адресного пространства, однако должны находиться в пределах R10 ± 32 КБ. |
||||||
|
|
MOVA |
#EDE,R10 |
|
; Инициализируем указатель |
||
|
|
MOV |
#020h,R9 |
|
; Инициализируем счетчик |
||
|
Loop |
MOV.B |
@R10+,TOM$EDE$1(R10) |
; Используем указатель в R10 |
|||
|
|
|
|
|
|
; для обеих таблиц. R10 + 1 |
|
|
|
DEC |
R9 |
|
|
; Декрементируем счётчик |
|
|
|
JNZ |
Loop |
|
|
; Счётчик 0, продолжаем |
|
|
|
|
|
|
|
; копирование |
|
|
|
... |
|
|
|
; Копирование завершено |
|
|
|
|
|
|
|
|
|
|
|
4.6. Описание набора команд 169 |
|
|
|
* NOP |
Нет операции |
|
|
|
|
Синтаксис |
NOP |
|
|
|
|
Операция |
Нет |
|
|
|
|
Эмуляция |
MOV |
#0,R3 |
|
|
|
Описание |
Не выполняется никаких операций. Команда может использоваться для замены рабочих |
|
|
команд при отладке программы или для формирования задержек |
|
|
|
|
Биты |
Биты состояния не изменяются |
|
состояния |
|
|
|
|
|
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
|
режима |
|
|
|
|
|
* 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, независимо от разряд ности (байт/слово) операнда команды.
170 Глава 4. 16#битное RISC ЦПУ MSP430X
PUSH[.W], PUSH.B Сохранение операнда в стек
Синтаксис |
PUSH |
src |
или PUSH.W src |
|
PUSH.B |
src |
|
|
|
|
|
Операция |
SP – 2 SP |
|
|
|
src @SP |
|
|
|
|
||
Описание |
20 битный указатель стека SP уменьшается на 2, после чего содержимое операнда ис |
||
|
точника помещается в ОЗУ по адресу, определяемому указателем. При сохранении |
||
|
1 байтного значения оно помещается в младший байт слова памяти, содержимое |
||
|
старшего слова при этом не изменяется |
||
|
|
||
Биты |
Биты состояния не изменяются |
||
состояния |
|
|
|
|
|
||
Биты |
OSCOFF, CPUOFF и GIE не изменяются |
||
режима |
|
|
|
|
|
||
Пример 1 |
Содержимое регистров R9 и R10 сохраняется в стеке. |
||
|
PUSH |
R9 |
; Сохраняем регистр R9 |
|
PUSH |
R10 |
; Сохраняем регистр R10 |
|
|
||
Пример 2 |
Содержимое двух байтов EDE и TONI сохраняется в стеке. Адреса обоих байтов нахо |
||
|
дятся в диапазоне PC ±32 КБ. |
||
|
PUSH.B |
EDE |
; Сохраняем EDE |
|
PUSH.B |
TONI |
; Сохраняем TONI |
|
|
|
|