Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Коственно-регистровая адресация в асме....
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Potter
Значит собственно вопрос вот в чем....

В азу находится два байта данных... Как мне их перенести в РОН используя коственно регистровую адресацию? И если не трудно в двух словах преимущества коственно регистровой адресации?

И еще маленький вопрос Как выглядит команда "ИСКЛЮЧАЮЩЕЕ ИЛИ" на асме?

Программировать мегу 16... Писать буду естественно в AVR-studio....

Заранее огромное спасибо за помощь........
Kovrov
Пересылка байта по адресу из озу
LDS R16,addr_ram
Теперь коссвенная адресация
адрес в регстровой паре
X,Y,Z
пример;
ldi xl,low(addr_ram)
ldi xh,high(addr_ram)
ld r16,x
;-------
Исключение или
есть команда
EOR Rxx,Rxx
muravei
Цитата(Potter @ Jan 24 2007, 21:26) *
В азу находится два байта данных... Как мне их перенести в РОН используя коственно регистровую адресацию? И если не трудно в двух словах преимущества коственно регистровой адресации?

Так:
clr r27 ; Clear X high byte
ldi r26,$60 ; Set X low byte to $60
ld r0,X+ ; Load r0 with data space loc. $60(X post inc)
ld r1,X ; Load r1 with data space loc. $61
Один раз загрузил регистр адресом и читай-пиши хоть всю память .

Цитата(Potter @ Jan 24 2007, 21:26) *
И еще маленький вопрос Как выглядит команда "ИСКЛЮЧАЮЩЕЕ ИЛИ" на асме?

Так:
eor r4,r4 ; Clear r4
eor r0,r22 ; Bitwise exclusive or between r0 and r22
bodja74
1 Запись в регистр 20 значения ячейки RAM адресс которой находится в регистре Z

ld R20,Z

2 Преимущества такой адрессации ,например так

ld R20,Z+

3 Исключающее ИЛИ

eor R20,R21

4 nix-06.nm.ru там есть таблица команд на асме на русском
Potter
Все понятно с командами.... Понятно как и что выполняется... Огромное спасибо.... Единственное что осталось не совсем мне ясно.... Зачем нужна вообще коственно-регистровая адресация? Почему не можно постоянно использовать прямую адресацию(ведь прямая проще....)? В чем преимущества коственно -регистровой?
Dopler
Цитата(Potter @ Jan 24 2007, 22:25) *
Все понятно с командами.... Понятно как и что выполняется... Огромное спасибо.... Единственное что осталось не совсем мне ясно.... Зачем нужна вообще коственно-регистровая адресация? Почему не можно постоянно использовать прямую адресацию(ведь прямая проще....)? В чем преимущества коственно -регистровой?


При прямой адресации адрес ячейки ОЗУ записываестя непосредственно в код команды, соответсвенно команды прямой адресации занимают 4 байта в памяти программ вместо 2-х при косвенной.

При косвенной адресации возможен инкремент/декремент указателя ОЗУ, что очень сильно окупается при работе с массивами данных. Вот пример чтения массива из EEPROM (64 байт)

Код
    out     EEARH,     zero

EEPROM_read:    

    out     EEARL,     YL

    sbi     EECR,    EERE    
    in     tmp,    EEDR    
    st    Y+,    tmp

    cpi    YL,    64
    brne    EEPROM_read
Potter
Понятно.... Работа с массивами... Это допустим если в одном и томже месте надо обращаться к озу но адрес ячейки в озу может менятся.... Ясненько..... Огромное спасибо.......
CD_Eater
Цитата(Potter @ Jan 24 2007, 22:25) *
Все понятно с командами.... Понятно как и что выполняется... Огромное спасибо.... Единственное что осталось не совсем мне ясно.... Зачем нужна вообще коственно-регистровая адресация? Почему не можно постоянно использовать прямую адресацию(ведь прямая проще....)? В чем преимущества коственно -регистровой?

Неужели Вы никогда писали программы с использованием циклом или подпрограмм ? Там преимущества очевидны.

По-моему, без косвенно-регистровой адресации МК не дотянет даже до машины Тьюринга smile.gif
То есть, машина с бесконечной памятью и набором инструкций как у МК, но без косвенной адресации не сможет реализовать любой алгоритм.
Potter
Дело в том.... Что я практически в совершенстве владею прагроммированием МК на С++. То есть я начал изучение программирования МК с программирования на языке С++. Теперь пришло время опустится немножечко ниже.... Т. е. я хочу разобраться как работет асемблер.... Я не знаю были вы ли в моей ситуации.... Но то что вам очевидно в асемблере мне для человека знающего только принцип програмирования на С все кажется далеко не таким протсым и очевидным.... Я думаю вы понимаете меня......
SasaVitebsk
А ассемблер очень важен. Именно потому, что понимаешь как оно изнутри. Понимаешь, что такое массив, к примеру, и как, примерно, компилятор реализует твою конструкцию. Я как то не был бы так уверен в том, что "практически в совершенстве владею прагроммированием МК на С++". Хотя, признаю что уверенность в себе - великая вещь.

Ребята мне помогут если чего запамятовал или попутал. Существуют следующие виды адресации
регистровая
прямая (непосредственная)
косвенная (или относительная)
индексная
базовая

Ну и их модификации, - к примеру
базово-индексная

Из под i80x86 можно напрямую работать с небольшими трёх мерными массивами, хотя компилятор так не делает.

AVR имеет первые три вида.
1) mov r1,r2
2) ldi r16,33
3) ld r1,Z

плюс косвенная со смещением типа
ld r16,Z+5
и косвенная с автоинкрементом/автодекрементом типа
ld r16,Z+


В рамки видов адресации укладывается всё. Так например переход
rjmp PC+5 - есть просто сложение (прямая)
jmp 0x100 - есть простое занесение в PC (прямая)
ijmp - есть косвенная адресация регистра PC
pop r16 - косвенная адресация с автодекрементом относительно SP
Wild007
Чуть-чуть smile.gif добавлю SasaVitebsk
Цитата
В рамки видов адресации укладывается всё. Так например переход
rjmp PC+5 - есть просто сложение (прямая)
jmp 0x100 - есть простое занесение в PC (прямая)
ijmp - есть косвенная адресация регистра PC
pop r16 - косвенная адресация с автодекрементом относительно SP

RJMP CONST -- безусловный относительный переход в пределах 2 кВ слов вперед или назад относительно текущего значения счетчика команд;
JMP CONST -- безусловный относительный переход в пределах 64 кВ;
IJMP, -- безусловный косвенный переход. Управление передается на адрес находящийся в регистровой паре Z;
PUSH\POP -- послать\достать регистр в\из стека.
Цитата
плюс косвенная со смещением типа
ld r16,Z+5
и косвенная с автоинкрементом/автодекрементом типа
ld r16,Z+

Еще есть команда очень удобная при работе с таблицами:
LPM пересылает в R0 байт памяти програм на который указывает регистровая пара Z
LPM Rd,Z+ -- пересылает в Rd байт памяти програм на который указывает регистровая пара Z с поседующим инкркментом Z
LPM Rd,Z -- пересылает в Rd байт памяти програм на который указывает регистровая пара Z без изменения Z
beer_warrior
Цитата
То есть я начал изучение программирования МК с программирования на языке С++. Теперь пришло время опустится немножечко ниже.... Т. е. я хочу разобраться как работет асемблер....

Ну возможно так и проще. Не зря говорят о С, как о продвинутом ассемблере. Многие вещи переносятся один к одному. Как собственно регистрово-косвенная адресация, которая в терминах С называется указателями и доступ к переменной по указателю так и транслируется в ld r, Z+. А вообще хороший способ врубится в асм - отключить в компиляторе оптимизацию, включить трансляцию в асм и посмотреть на получившися подстрочный перевод.
muravei
Цитата(Potter @ Jan 25 2007, 01:24) *
Теперь пришло время опустится немножечко ниже.... Т. е. я хочу разобраться как работет асемблер....

Можно далеко и не опускаться- я бы порекомендовал Algorithm Builder
IgorKossak
Цитата(Potter @ Jan 24 2007, 21:25) *
Зачем нужна вообще коственно-регистровая адресация? Почему не можно постоянно использовать прямую адресацию(ведь прямая проще....)? В чем преимущества коственно -регистровой?

Достаточно посмотреть листинг после компиляции с С или того же С++, чтобы убедиться насколько компактнее и быстрее получается код если применять косвенную адресацию.
При помощи этого типа адресации реализован метод оптимизации известный как "кластеризация переменных". В этом методе рядом расположенные переменные (в общем случае разных типов) рассматриваются как непрерывный массив (кластер) и доступ к ним организовывается косвенной адресацией с однократной установкой адреса начала кластера и дальнейшим доступом к переменным командами ldd/std. Преимущества этого метода перед lds/sts очевидны.
Фокус в том, что кластеризацию переменных полноценно может реализовать только компилятор, вручную писать таким образом чревато коварными ошибками, т. к. придётся опять же вручную отслеживать взаиморасположение переменных.
_Bill
Цитата(Potter @ Jan 25 2007, 01:24) *
Дело в том.... Что я практически в совершенстве владею прагроммированием МК на С++. То есть я начал изучение программирования МК с программирования на языке С++. Теперь пришло время опустится немножечко ниже.... Т. е. я хочу разобраться как работет асемблер.... Я не знаю были вы ли в моей ситуации.... Но то что вам очевидно в асемблере мне для человека знающего только принцип програмирования на С все кажется далеко не таким протсым и очевидным.... Я думаю вы понимаете меня......

Ну, я начинал с машинных кодов. Потом перешел на ассемблер, процессоры бывали разные. Потом Си, для I8080, PDP-11, .... До плюсплюснутого так и не поднялся.
SasaVitebsk
Цитата(IgorKossak @ Jan 25 2007, 12:08) *
Достаточно посмотреть листинг после компиляции с С или того же С++, чтобы убедиться насколько компактнее и быстрее получается код если применять косвенную адресацию.
При помощи этого типа адресации реализован метод оптимизации известный как "кластеризация переменных". В этом методе рядом расположенные переменные (в общем случае разных типов) рассматриваются как непрерывный массив (кластер) и доступ к ним организовывается косвенной адресацией с однократной установкой адреса начала кластера и дальнейшим доступом к переменным командами ldd/std. Преимущества этого метода перед lds/sts очевидны.
Фокус в том, что кластеризацию переменных полноценно может реализовать только компилятор, вручную писать таким образом чревато коварными ошибками, т. к. придётся опять же вручную отслеживать взаиморасположение переменных.


Я по первости когда просматривал листинг накак въехать не мог. smile.gif Дело в том, что при длительном программировании на ASMе НИ РАЗУ НЕ ИСПОЛЬЗОВАЛ данные инструкции (std/ldd) и смотрел на них с непониманием. Их использование у видел только в листинге компилятора и по первости не мог понять зачем.

Сейчас на Точке Опоры ветка есть "побайтное программирование на IAR", там один вопрос задаёт. Ну я написал ответ в виде одной строки на си. Ну и все пробуют эту строку под разными компиляторами. Изворачиваются, переменные переставляют. biggrin.gif Но такого кода по эффективности как IAR - ни один компилятор не предоставил. Ближайший - Image craft вроде. Выигрыш за счёт применения STD и MOVW. Да и вручную лучше не напишешь. smile.gif
dxp
Цитата(Potter @ Jan 25 2007, 04:24) *
Дело в том.... Что я практически в совершенстве владею прагроммированием МК на С++.

Ой, как удачно. Я давно хотел понять особенности реализации частичной специализации шаблонов указателей на МК, да все не у кого было спросить, а по книжкам сам не догоняю. Не поможете в этом? cheers.gif wink.gif
IgorKossak
Цитата(dxp @ Jan 25 2007, 12:22) *
Цитата(Potter @ Jan 25 2007, 04:24) *

Дело в том.... Что я практически в совершенстве владею прагроммированием МК на С++.

Ой, как удачно. Я давно хотел понять особенности реализации частичной специализации шаблонов указателей на МК, да все не у кого было спросить, а по книжкам сам не догоняю. Не поможете в этом? cheers.gif wink.gif

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