реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как пользоваться парными регистрами?, Кто знает подскажите......
Potter
сообщение Jul 2 2006, 20:35
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 151
Регистрация: 27-05-06
Из: Харьков
Пользователь №: 17 508



Компилятор AVRStudio.... Задача состоит в том что-б отнимать и прибавлять к двух байтному числу 1, 10 и 100. Использую парные регистры YL и YН. Прибавляю к YL два раза по 100.... есть YL равно 200 прибавляю к нему же еще одну сотню YL уже рано 44. Всеравно если работать с обычным регистром..... прибавляю командой add .... может другой синтаксис? Заранее спасибо....
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 2 2006, 20:54
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Для парных регистров есть команды adiw и sbiw, но они работают только с immediate. Если нужно прибавлять и вычитать значение другого регистра, то одной командой не обойтись:
Код
сложение:

add  YL, Rx
brcc  PC+0x02
inc  YH

вычитание:

sub  YL, Rx
sbci YH, 0x00
Go to the top of the page
 
+Quote Post
Potter
сообщение Jul 2 2006, 21:04
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 151
Регистрация: 27-05-06
Из: Харьков
Пользователь №: 17 508



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


Спасибо все заработало..... а что значит immediate?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 2 2006, 21:13
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Immediate - константа, хранящаяся непосредственно в коде команды.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 3 2006, 12:04
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(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)     ; затем старший
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 3 2006, 13:02
Сообщение #6


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(aaarrr @ Jul 2 2006, 19:54) *
Для парных регистров есть команды adiw и sbiw, но они работают только с immediate.


Числовая константа в командах adiw и sbiw должна быть не более 63, а автору иногда надо прибавлять по 100.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Jul 3 2006, 22:06
Сообщение #7


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Если нужно прибавить 100, то кто мешает добавить 2 раза по 50, дополнительная команда программу сильно не утяжелит.


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 4 2006, 06:38
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



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

Зачем делать сложнее, если можно сделать проще?
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Jul 4 2006, 06:46
Сообщение #9


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Проще - не всегда лучше. Наглядность тоже дело важное.


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
vet
сообщение Jul 4 2006, 07:31
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Лучше всё-таки SUBI/SBCI. Два такта вместо четырёх.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Jul 4 2006, 08:13
Сообщение #11


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Да, это так. Но мне, например, при расчёте смещений в Ethernet-UDP-TCP заголовках было удобнее вначале рассчитывать константы именно так. После отладки даже не стал исправлять, так как в дальнейшем, при модификации программы, так легче вспомнить и разобраться, и это несмотря на подробные комментарии (ASM всё таки) smile.gif


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 4 2006, 11:13
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(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
Go to the top of the page
 
+Quote Post
Potter
сообщение Jul 5 2006, 16:14
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 151
Регистрация: 27-05-06
Из: Харьков
Пользователь №: 17 508



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


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

Сообщение отредактировал Potter - Jul 5 2006, 16:14
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 5 2006, 17:31
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(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)?

Само собой.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01498 секунд с 7
ELECTRONIX ©2004-2016