Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как пользоваться парными регистрами?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Potter
Компилятор AVRStudio.... Задача состоит в том что-б отнимать и прибавлять к двух байтному числу 1, 10 и 100. Использую парные регистры YL и YН. Прибавляю к YL два раза по 100.... есть YL равно 200 прибавляю к нему же еще одну сотню YL уже рано 44. Всеравно если работать с обычным регистром..... прибавляю командой add .... может другой синтаксис? Заранее спасибо....
aaarrr
Для парных регистров есть команды adiw и sbiw, но они работают только с immediate. Если нужно прибавлять и вычитать значение другого регистра, то одной командой не обойтись:
Код
сложение:

add  YL, Rx
brcc  PC+0x02
inc  YH

вычитание:

sub  YL, Rx
sbci YH, 0x00
Potter
Цитата(aaarrr @ Jul 2 2006, 23:54) *
Для парных регистров есть команды adiw и sbiw, но они работают только с immediate.


Спасибо все заработало..... а что значит immediate?
aaarrr
Immediate - константа, хранящаяся непосредственно в коде команды.
_Bill
Цитата(Potter @ Jul 2 2006, 23:35) *
Компилятор AVRStudio.... Задача состоит в том что-б отнимать и прибавлять к двух байтному числу 1, 10 и 100. Использую парные регистры YL и YН. Прибавляю к YL два раза по 100.... есть YL равно 200 прибавляю к нему же еще одну сотню YL уже рано 44. Всеравно если работать с обычным регистром..... прибавляю командой add .... может другой синтаксис? Заранее спасибо....

Если требуется прибавлять константу, то можно так:
Код
          subi          yl, low(-CONST)      ; Приабавить младший байт,
          sbci          yh, high(-CONST)     ; затем старший
=GM=
Цитата(aaarrr @ Jul 2 2006, 19:54) *
Для парных регистров есть команды adiw и sbiw, но они работают только с immediate.


Числовая константа в командах adiw и sbiw должна быть не более 63, а автору иногда надо прибавлять по 100.
Nanobyte
Если нужно прибавить 100, то кто мешает добавить 2 раза по 50, дополнительная команда программу сильно не утяжелит.
_Bill
Цитата(Nanobyte @ Jul 4 2006, 01:06) *
Если нужно прибавить 100, то кто мешает добавить 2 раза по 50, дополнительная команда программу сильно не утяжелит.

Зачем делать сложнее, если можно сделать проще?
Nanobyte
Проще - не всегда лучше. Наглядность тоже дело важное.
vet
Лучше всё-таки SUBI/SBCI. Два такта вместо четырёх.
Nanobyte
Да, это так. Но мне, например, при расчёте смещений в Ethernet-UDP-TCP заголовках было удобнее вначале рассчитывать константы именно так. После отладки даже не стал исправлять, так как в дальнейшем, при модификации программы, так легче вспомнить и разобраться, и это несмотря на подробные комментарии (ASM всё таки) smile.gif
_Bill
Цитата(Nanobyte @ Jul 4 2006, 11:13) *
Да, это так. Но мне, например, при расчёте смещений в Ethernet-UDP-TCP заголовках было удобнее вначале рассчитывать константы именно так. После отладки даже не стал исправлять, так как в дальнейшем, при модификации программы, так легче вспомнить и разобраться, и это несмотря на подробные комментарии (ASM всё таки) smile.gif

Это, конечно, так. Но лучше расчет смещений возложить на ассемблер. Нужно только написать соответствующе макроопределение. Это делается только один раз. Например, так:
Код
;
; ** STK$ALC    -- выделение стека
;
; Описание:
;   Макрокоманда производит выделение необходимой стекой памяти.
; Поскольку данная макрокоманда устанавливает начальное значение
; текущего уровня стека, она ДОЛЖНА ВЫПОЛНЯТЬСЯ ПЕРВОЙ независимо
; от того, требуется ли фактическое выделение стека в данный момент
; или нет.
;
; Вызов:    STK$ALC    value
;
STK$ALC    macro    value; Stack allocation

STACK$    var    value    ; Текущий уровень стека
    if STACK$ == 0    ; Стековая область не требуется,
        exitm    ; то выход
    endif        ;
;
; Выделить стек
;
    if STACK$ < 64        ; Достаточно одной команды
        sbiw    r29:r28, STACK$
    else            ; требуется две команды
        subi    r28, LOW(STACK$)
        sbci    r29, HIGH(STACK$)
    endif
    endm
Potter
Цитата(_Bill @ Jul 3 2006, 15:04) *
Если требуется прибавлять константу, то можно так:
Код
          subi          yl, low(-CONST)    ; Приабавить младший байт,
          sbci          yh, high(-CONST); затем старший


А отнять получается тоже самое только без минуса - subi yl, low(CONST),sbci yh, high(CONST)?
_Bill
Цитата(Potter @ Jul 5 2006, 19:14) *
Цитата(_Bill @ Jul 3 2006, 15:04) *

Если требуется прибавлять константу, то можно так:
Код
          subi          yl, low(-CONST); Приабавить младший байт,
          sbci          yh, high(-CONST); затем старший


А отнять получается тоже самое только без минуса - subi yl, low(CONST),sbci yh, high(CONST)?

Само собой.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.