Команда LD (LDD) загрузить косвенно из ОЗУ в регистр с использованием индекса Y
Описание:
Загружает косвенно, со смещением или без смещения, один байт из ОЗУ в регистр. Положение байта в ОЗУ указывается 16-разрядным регистромуказателем Y в регистровом файле. Обращение к памяти ограничено текущей страницей объемом 64 Кбайта. Для обращения к другой странице ОЗУ необходимо изменить регистр RAMPY в I/O области. Региструказатель Y может остаться неизменным после выполнения команды, но может быть инкрементирован или декрементирован. Использование регистра-указателя Y обеспечивает удобную возможность обращения к матрицам, таблицам, указателю стека.
Использование Y-указателя:
|
Операция: |
Комментарий: |
|
|
(i) |
Rd <-- (Y) |
|
Y: Неизменен |
|
(ii) Rd <-- (Y) |
Y <-- Y + 1 |
Y: Инкрементирован впоследствии |
||
(iii)Y <-- Y + 1 |
Rd <-- (Y) |
Y: Предварительно декрементирован |
||
(iv) Rd <-- (Y + q) |
|
Y: Неизменен, q: смещение |
||
|
Синтаксис: |
Операнды: |
Счетчик программ: |
|
(i) |
LD Rd,Y |
0 < d < 31 |
PC<-- + 1 |
|
(ii) LD Rd,Y+ |
0 < d < 31 |
PC<-- + 1 |
||
(iii)LD Rd,-Y |
0 < d < 31 |
PC<-- + 1 |
||
(iv) LDD Rd, Y + q |
0 < d < 31 |
PC<-- + 1 |
||
Пример: |
0 < q < 63 |
|
||
;Очистить старший байт Y. |
||||
clr |
r29 |
|||
ldi |
r28, $20 ;Установить $20 в младший байт Y. |
|||
ld |
r0, Y+ |
;Загрузить в r0 содерж. SRAM по адресу |
||
ld |
r1, Y |
;$20 (Y постинкрементируется). |
||
;Загрузить в r1 содержимое SRAM по |
||||
ldi |
|
;адресу $21. |
|
|
r28, $23 ;Установить $23 в младший байт Y. |
||||
ld |
r2, Y |
;Загрузить в r2 содержимое SRAM по |
||
ld |
r3, -Y |
;адресу $23. |
|
|
;Загрузить в r3 содержимое SRAM по |
||||
|
|
;адресу $22 (Y преддекрементируется). |
||
ldd r4, Y+2 ;Загрузить в r4 содержимое SRAM по ;адресу $24.
Слов: 1 (2 байта). Циклов: 2.
85
Команда LD (LDD) загрузить косвенно из ОЗУ в регистр с использованием индекса Z
Описание:
Загружает косвенно, со смещением или без смещения, один байт из ОЗУ в регистр. Положение байта в ОЗУ указывается 16-разрядным регистромуказателем Z в регистровом файле. Обращение к памяти ограничено текущей страницей объемом 64 Кбайта. Для обращения к другой странице ОЗУ необходимо изменить регистр RAMPZ в I/O области. Региструказатель Z может остаться неизменным после выполнения команды, но может быть инкрементирован или декрементирован. Эта особенность очень удобна при использовании регистра-указателя Z в качестве указателя стека, однако, поскольку регистр-указатель Z может быть использован для косвенного вызова подпрограмм, косвенных переходов и табличных преобразований, более удобно использовать в качестве указателя стека регистры-указатели X и Y. Об использовании указателя Z для просмотра таблиц в памяти программ см. команду LPM.
Использование Z-указателя:
|
Операция: |
Комментарий: |
|
|
|
(i) |
Rd <-- () |
|
Z: Неизменен |
||
(ii) |
Rd <-- (Z) |
Z <-- Z + 1 |
Z: Инкрементирован впоследствии |
||
(iii)Z <-- Z + 1 |
Rd <-- (Z) |
Z: Предварительно декрементирован |
|||
(iv) Rd <-- (Z + q) |
|
Z: Неизменен, q: смещение |
|||
|
Синтаксис: |
Операнды: |
|
Счетчик программ: |
|
(i) |
LD Rd,Z |
0 < d < 31 |
|
PC<-- + 1 |
|
(ii) LD Rd,Z+ |
0 < d < 31 |
|
PC<-- + 1 |
||
(iii)LD Rd,-Z |
0 < d < 31 |
|
PC<-- + 1 |
||
(iv) LDD Rd, Z + q |
0 < d < 31 |
|
PC<-- + 1 |
||
Пример: |
0 < q < 63 |
|
|
||
;Очистить старший байт Z. |
|||||
clr |
r31 |
||||
ldi r30, $20 |
;Установить $20 |
в младший байт Z. |
|||
ld |
r0, Z+ |
;Загрузить в r0 |
содерж. SRAM по адресу |
||
ld |
r1, Y |
;$20 (Z постинкрементируется). |
|||
;Загрузить в r1 |
содержимое SRAM по |
||||
ldi |
r30, $23 |
;адресу $21. |
|
в младший байт Z. |
|
;Установить $23 |
|||||
ld |
r2, Z |
;Загрузить в r2 |
содержимое SRAM по |
||
|
|
;адресу $23. |
|
|
|
86
ld r3, -Z ;Загрузить в r3 содержимое SRAM по ;адресу $22 (Z преддекрементируется).
ldd r4, Z+2 ;Загрузить в r4 содержимое SRAM по ;адресу $24.
Слов: 1 (2 байта). Циклов: 2.
Команда LDI загрузить непосредственное значение
Описание:
Загружается 8-разрядная константа в регистр от 16 по 31
Операция: Rd <-- K
Синтаксис: |
Операнды: |
Счетчик программ: |
LDI Rd, K |
16 < d < 31, 0 < K < 255 |
PC<-- + 1 |
Пример: |
; Очистить старший байт Z. |
|
clr r31 |
||
ldi |
r30, $F0 ; |
Установить $F0 в младший байт Z. |
lpm |
; |
Загрузить константу из программы. |
|
; |
Память отмечена в Z. |
Слов: 1 (2 байта). Циклов: 1.
Команда LDS – загрузить непосредственно из СОЗУ
Описание:
Выполняется загрузка одного байта из СОЗУ в регистр. Можно использовать 16-разрядный адрес. Обращение к памяти ограничено текущей страницей СОЗУ объемом 64 Кбайта. Команда LDS использует для обращения к памяти выше 64 Кбайт регистр RAMPZ.
Операция: Rd <-- (k)
Синтаксис: |
Операнды: |
Счетчик программ: |
|
LDS Rd,k |
0 < d < 31,0 < k < 65535 |
PC<-- + 2 |
|
Пример: |
r2, $FF00 ; Загрузить r2 содержимым SRAM |
||
lds |
|||
add |
r2, r1 |
;по адресу $FF00. |
|
; Сложить r1 с r2. |
|
||
sts |
$FF00, r2 ; Записать обратно. |
||
Слов: 2 (4 байта). Циклов: 3. |
|
||
Команда LPM – загрузить байт памяти программ
Описание:
Загружает один байт, адресованный регистром Z, в регистр 0 (R0). Команда обеспечивает эффективную загрузку констант или выборку постоянных данных. Память программ организована из 16-разрядных слов, и младший значащий разряд (LSB) 16-разрядного указателя Z выбирает
87
или младший (0) или старший (1) байт. Команда может адресовать первые 64 Кбайта (32 Кслов) памяти программ.
Операция: |
|
Комментарий: |
R0<-- (Z) |
|
Z указывает на память программ |
Синтаксис: |
Операнды: |
Счетчик программ: |
LPM |
нет |
PC<-- + 1 |
Пример: |
; Очистить старший байт Z. |
|
clr r31 |
||
ldi r30, $F0 ; Установить младший байт Z. |
||
lpm |
; Загрузить константу из памяти |
|
|
;программ, отмеченную Z (r31 : r30). |
|
Слов: 1 (2 байта). Циклов: 3. |
|
|
Команда LSL – логически сдвинуть влево
Описание:
Выполнение сдвига всех битов Rd на одно место влево. Бит 0 стирается. Бит 7 загружается во флаг переноса (С) регистра состояния (SREG). Эта команда эффективно умножает на два значение величины без знака.
Операция: |
|
|
|
|
|
c |
b7…………………..b0 |
|
0 |
|
|
|
|
|
|||
Синтаксис: |
Операнды: |
Счетчик программ: |
|||
LSL Rd |
0 < d < 31 |
PC <-- PC + 1 |
|||
H: Rd3.
S: N V, для проверок со знаком.
V:N C (Для N и C после сдвига). Устанавливается, если (N устанавливается и C очищается) или (N очищается, а C устанавливается). В ином случае очищается (при наличии значений N и C после сдвига).
N:Устанавливается, если в результате установлен MSB, в ином случае очищается.
Z: Устанавливается, если результат $00, в ином случае очищается.
C:Rd7 Устанавливается, если перед сдвигом был установлен MSB регистра Rd, в ином случае очищается.
Пример:
add r0, r4 ; Сложить r4 с r0. lsl r0 ; Умножить r0 на 2.
Слов: 1 (2 байта). Циклов: 1.
88
Команда LSR – логически сдвинуть вправо
Описание:
Сдвиг всех битов Rd на одно место вправо. Бит 7 очищается. Бит 0 загружается во флаг переноса (С) регистра состояния (SREG). Эта команда эффективно делит на два число без знака. Флаг переноса может быть использован для округления результата.
Операция: 0 |
b7…………………..b0 |
c |
|
Синтаксис: |
Операнды: |
Счетчик программ: |
|
LSR Rd |
0 < d < 31 |
PC <- PC + 1 |
|
S N V, для проверок со знаком.
VN C (Для N и C после сдвига). Устанавливается, если (N устанавливается и C очищается) или (N очищается, а C устанавливается). В ином случае очищается (при наличии значений N и C после сдвига).
N 0.
Z Устанавливается, если результат $00, в ином случае очищается
CRd0. Устанавливается, если перед сдвигом был установлен LSB регистра Rd, в ином случае очищается.
Пример:
add r0, r4 ; Сложить r4 с r0. lsr r0 ; Разделить r0 на 2.
Слов: 1 (2 байта). Циклов: 1.
Команда MOV - копировать регистр
Описание:
Команда создает копию одного регистра в другом регистре. Исходный регистр Rr остается неизменным, в регистр назначения Rd загружается
копия содержимого регистра. |
|
||
Операция: |
Rr. Rd <-- Rr |
|
|
Синтаксис: |
Операнды: |
Счетчик программ: |
|
MOV Rd,Rr |
0 < d < 31, 0 < r <31 |
PC<-- + 1 |
|
Пример: |
r16, r0 |
; Копировать r0 в r16. |
|
mov |
|||
call |
check |
; Вызвать подпрограмму. |
|
. . .
check: cpi r16, $11 ; Сравнить r16 с $11.
. . . |
; Вернуться из подпрограммы. |
ret |
|
Слов: 1 (2 байта). Циклов: 1. |
|
89