Микропроцессорная техника / Семейство микроконтроллеров MSP430x2xx_
.pdf
|
|
|
|
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 |