|
Коственно-регистровая адресация в асме.... |
|
|
|
Jan 24 2007, 21:59
|

Мастер-фломастер
   
Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700

|
Пересылка байта по адресу из озу LDS R16,addr_ram Теперь коссвенная адресация адрес в регстровой паре X,Y,Z пример; ldi xl,low(addr_ram) ldi xh,high(addr_ram) ld r16,x ;------- Исключение или есть команда EOR Rxx,Rxx
--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
|
|
|
|
|
Jan 24 2007, 22:00
|

Гуру
     
Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591

|
Цитата(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
|
|
|
|
|
Jan 24 2007, 22:38
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Цитата(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
|
|
|
|
|
Jan 24 2007, 23:03
|
Частый гость
 
Группа: Новичок
Сообщений: 173
Регистрация: 3-09-04
Из: Moscow
Пользователь №: 595

|
Цитата(Potter @ Jan 24 2007, 22:25)  Все понятно с командами.... Понятно как и что выполняется... Огромное спасибо.... Единственное что осталось не совсем мне ясно.... Зачем нужна вообще коственно-регистровая адресация? Почему не можно постоянно использовать прямую адресацию(ведь прямая проще....)? В чем преимущества коственно -регистровой? Неужели Вы никогда писали программы с использованием циклом или подпрограмм ? Там преимущества очевидны. По-моему, без косвенно-регистровой адресации МК не дотянет даже до машины Тьюринга  То есть, машина с бесконечной памятью и набором инструкций как у МК, но без косвенной адресации не сможет реализовать любой алгоритм.
|
|
|
|
|
Jan 25 2007, 02:03
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
А ассемблер очень важен. Именно потому, что понимаешь как оно изнутри. Понимаешь, что такое массив, к примеру, и как, примерно, компилятор реализует твою конструкцию. Я как то не был бы так уверен в том, что "практически в совершенстве владею прагроммированием МК на С++". Хотя, признаю что уверенность в себе - великая вещь.
Ребята мне помогут если чего запамятовал или попутал. Существуют следующие виды адресации регистровая прямая (непосредственная) косвенная (или относительная) индексная базовая
Ну и их модификации, - к примеру базово-индексная
Из под 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
|
|
|
|
|
Jan 25 2007, 10:10
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Чуть-чуть  добавлю 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
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Jan 25 2007, 11:08
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(Potter @ Jan 24 2007, 21:25)  Зачем нужна вообще коственно-регистровая адресация? Почему не можно постоянно использовать прямую адресацию(ведь прямая проще....)? В чем преимущества коственно -регистровой? Достаточно посмотреть листинг после компиляции с С или того же С++, чтобы убедиться насколько компактнее и быстрее получается код если применять косвенную адресацию. При помощи этого типа адресации реализован метод оптимизации известный как "кластеризация переменных". В этом методе рядом расположенные переменные (в общем случае разных типов) рассматриваются как непрерывный массив (кластер) и доступ к ним организовывается косвенной адресацией с однократной установкой адреса начала кластера и дальнейшим доступом к переменным командами ldd/std. Преимущества этого метода перед lds/sts очевидны. Фокус в том, что кластеризацию переменных полноценно может реализовать только компилятор, вручную писать таким образом чревато коварными ошибками, т. к. придётся опять же вручную отслеживать взаиморасположение переменных.
|
|
|
|
|
Jan 25 2007, 12:20
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Potter @ Jan 25 2007, 01:24)  Дело в том.... Что я практически в совершенстве владею прагроммированием МК на С++. То есть я начал изучение программирования МК с программирования на языке С++. Теперь пришло время опустится немножечко ниже.... Т. е. я хочу разобраться как работет асемблер.... Я не знаю были вы ли в моей ситуации.... Но то что вам очевидно в асемблере мне для человека знающего только принцип програмирования на С все кажется далеко не таким протсым и очевидным.... Я думаю вы понимаете меня...... Ну, я начинал с машинных кодов. Потом перешел на ассемблер, процессоры бывали разные. Потом Си, для I8080, PDP-11, .... До плюсплюснутого так и не поднялся.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|