Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MSP430_НВВ.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
1.51 Mб
Скачать

2.3 Команды переходов

Команды переходов могут быть условными и безусловными. Условные переходы выполняются на основе анализа состояния битов в статусном регистре SR. Переход осуществляется относительно содержимого регистра PC на расстояние от -511 до 512 слов.

Для некоторых команд условных переходов ассемблер поддерживает альтернативную нотацию.

  • Команда: JNE/JNZ - Jump if Not Equal / Jump if Not Zero –прыжок если не равно / прыжок если не ноль

Синтаксис: jne label

jnz label

Описание: Тестируется состояние бита Z статусного регистра SR. Если Z=0 осуществляется переход на метку label.

Флаги: Не модифицируются

Пример: Очистить 30 байт ОЗУ начиная с адреса 200h

mov #200h, R5 ; настраиваем указатель на начало блока ОЗУ

Loop: mov.b #0, 0(R5) ; пересылаем число 0 в текущую ячейку ОЗУ

add #1, R5 ; наращиваем указатель

cmp #200h+30, R5 ; проверяем достиг ли указатель границы

; блока ОЗУ

jne Loop ; Если нет – переход на начало цикла.

  • Команда: JQE/JZ - Jump if Equal / Jump if Zero –прыжок если равно / прыжок если ноль

Синтаксис: jeq label

jz label

Описание: Тестируется состояние бита Z статусного регистра SR. Если Z=1 осуществляется переход на метку label.

Флаги: Не модифицируются

Пример: Тестировать 7-й бит в регистре R10

bit #80h, R10

jz BitIsZero

. . . .

BitIsZero:

  • Команда: JN - Jump if Negative –прыжок если минус

Синтаксис: jn label

Описание: Тестируется состояние бита N статусного регистра SR. Если N=1 осуществляется переход на метку label.

Флаги: Не модифицируются

Пример: В регистр R12 записать сумму всех положительных значений в блоке ОЗУ с начальным адресом 2A0h и размером 50 байт.

mov #0, R12 ; обнуляем сумму

mov #2A0h, R10 ; настраиваем указатель на начало блока ОЗУ

mov #50, R11 ; инициализируем счетчик циклов

loop: mov.b @R10+, R8 ; читаем данные во временный регистр

cmp #0, R8 ; сравниваем с 0

jn skip ; если минус, пропустить следующую команду

add R8, R12 ; накапливаем сумму

skip: sub #1, R11 ; считаем количество циклов

jnz loop ; если не все значения, переход на начало цикла

  • Команда: JC/JHS - Jump if Carry set / Jump if Higher or Same –прыжок если флаг С установлен / прыжок если выше или равно

Синтаксис: jc label

jhs label

Описание: Тестируется состояние бита C статусного регистра SR. Если C=1 осуществляется переход на метку label. Команда JHS обычно используется после сравнения беззнаковых операндов.

Флаги: Не модифицируются

  • Команда: JNC/JLO - Jump if Carry Not set / Jump if Lower –прыжок если флаг С сброшен / прыжок если ниже

Синтаксис: jnc label

jlo label

Описание: Тестируется состояние бита C статусного регистра SR. Если C=0 осуществляется переход на метку label. Команда JLO обычно используется после сравнения беззнаковых операндов.

Флаги: Не модифицируются

Пример: В регистр R15 записать количество единичных бит, содержащихся в регистре R12.

mov #16, R13 ; загружаем счетчик бит

mov #0, R15 ; обнуляем регистр результата

loop: rrc R12 ; сдвиг данных в бит C

jnc skip ; если C=0, пропустить след. команду

add #1, R15 ; увеличить результат

skip: sub #1, R13 ; все биты сдвинуты?

jne loop ; если нет – переход на начало цикла

Тот же результат можно получить, если в приведенном фрагменте две команды

jnc skip

add #1, R15

заменить одной:

addc #0, R15

  • Команда: JGE - Jump if Greater or Equal –прыжок если больше или равно

Синтаксис: jge label

Описание: Если результат операции N^V равен 0, осуществляется переход на метку label. Команда JGE обычно используется после сравнения знаковых операндов.

Флаги: Не модифицируются

Пример: В регистр R12 записать максимальное знаковое значение, содержащееся в блоке памяти ОЗУ со стартовым адресом 200h и размером 100 слов.

mov #-32768, R12 ; инициализируем R12 наименьшим значением

mov #200h, R15 ; настраиваем указатель на начало блока

mov #100, R13 ; инициализируем счетчик циклов

loop: cmp @R15+, R12 ; сравниваем текущее слово с текущим

; максимумом

jge skip ; если меньше, пропускаем след. команду,

mov -2(R15), R12 ; иначе меняем текущий максимум

skip: sub #1, R13 ; проверяем окончание цикла

jne loop ; если цикл не закончен, переход на начало

; цикла

  • Команда: JL - Jump if Less –прыжок если меньше

Синтаксис: jl label

Описание: Если результат операции N^V равен 1, осуществляется переход на метку label. Команда JGE обычно используется после сравнения знаковых операндов.

Флаги: Не модифицируются

  • Команда: JMP - Jump –прыжок

Синтаксис: jmp label

Описание: Безусловный переход на метку label

Флаги: Не модифицируются

Все команды переходов в памяти занимают 2 байта и исполняются за два цикла.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]