AVR ассемблер. Объясните способ записи

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Сообщение Голимый »

вот часто встречаю вот такое, например.

Код: Выделить всё

LDI	R16,(1<<ACBG)|(1<<ACIE)|(1<<ACIS1)|(1<<ACIS0)
Не могу понять принцип такой записи, объясните пожалуйста что тут что значит.
Трудное детство, стальные игрушки.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

<< - сдвиг влево
| - побитное или

(1<<2) | (1<<0) |(1<<4)
0b00000100 | 0b00000001 | 0x00010000
0b00010101

Конечно следовало бы Вас в гугл отправить, вопрос то банальный, могли бы сами разобраться.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6323
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Это очень просто: загрузить в R16 константу, в которой единица будет в тех битах, номер которых справа от << .
Например, если ACBG = бит 0, ACIE = бит 2, то запись LDI R16,(1<<ACBG)|(1<<ACIE) будет то же, что и LDI R16, (1 + 4) , т.к. 1<<0 = 1, 1<<2 = 4.
Изображение
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Сообщение Голимый »

Для меня - не банальный. Например, откуда в регистре R16 взялись биты, с именами битов управляющего регистра компаратора. Я вот это догнать не могу.
Я смог понять, если бы LDI R16, (1<<7)|(1<<6)|(1<<5)... и так далее
И зачем такие усложнения, если можно просто LDI R16, 0x00000000b?
Трудное детство, стальные игрушки.
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Голимый писал(а):И зачем такие усложнения, если можно просто LDI R16, 0x00000000b?
Можно сразу в машинном коде писать :). Такие "усложнения" нужны для читабельности кода. Советую не пренебрегать этим. Эти, казалось бы длинные записи, на самом деле экономят Ваше время при отладке. На комментариях советую тоже не экономить, их может быть больше чем сам код.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Голимый писал(а): откуда в регистре R16 взялись биты, с именами битов управляющего регистра компаратора.
ниоткуда они там не взялись: имена битов использовались для вычисления нужного значения, которое потом было помещено в R16. имена - это ведь просто названия. вы можете называть что угодно как угодно, ничего в мире от этого не изменится. но когда вы собираетесь изменять содержимое регистра управления компаратором, вам лучше знать, что те или иные биты соответствуют правильным битам в этом регистре. и дя этого лучше применять правильные их названия.

именно для легкости понимания следует использовать имена битов, а не безымянные константы 0b0101010101 - как узнать, установлен в этом числе бит ADEN или нет? вы помните его "место"? а когда написано (1<<ADEN) - это однозначно скажет, что бит будет стоять на нужном месте.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Голимый писал(а):...именами битов управляющего регистра компаратора. ...
Имена битов определены в специальных файлах. В зависимости от среды программирования их надо включать проект самому или среда сама их включит при выборе камня. Вот кусок из файла io8a.h

Код: Выделить всё

#define ACSR    _SFR_IO8(0x08)
#define ACIS0   0
#define ACIS1   1
#define ACIC    2
#define ACIE    3
#define ACI     4
#define ACO     5
#define ACBG    6
#define ACD     7
Добавлено after 4 minutes 5 seconds:
Ну для ассма обычно вот такие включения

Файл m8Adef.inc

Код: Выделить всё

; ***** BIT DEFINITIONS **************************************************

; ***** ANALOG_COMPARATOR ************
; SFIOR - Special Function IO Register
.equ	ACME	= 3	; Analog Comparator Multiplexer Enable

; ACSR - Analog Comparator Control And Status Register
.equ	ACIS0	= 0	; Analog Comparator Interrupt Mode Select bit 0
.equ	ACIS1	= 1	; Analog Comparator Interrupt Mode Select bit 1
.equ	ACIC	= 2	; Analog Comparator Input Capture Enable
.equ	ACIE	= 3	; Analog Comparator Interrupt Enable
.equ	ACI	= 4	; Analog Comparator Interrupt Flag
.equ	ACO	= 5	; Analog Compare Output
.equ	ACBG	= 6	; Analog Comparator Bandgap Select
.equ	ACD	= 7	; Analog Comparator Disable


; ***** SPI **************************
; SPDR - SPI Data Register
.equ	SPDR0	= 0	; SPI Data Register bit 0
Можно догадаться что в обоих примерах файлы для атмеги8
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Сообщение Голимый »

Действительно, неплохо получилось:

Код: Выделить всё

		ldi		temp, (1<<DDD6)|(1<<DDD7)
		out		DDRD, temp
		ldi		temp, (1<<DDB0)
		out		DDRB, temp
Спасибо, помогли!

Каменты к к коду не пишу, т.к могу писать либо код, либо каменты. И вообще пишу для себя.
Трудное детство, стальные игрушки.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Комменты как раз для себя и пишут.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Сообщение Голимый »

Не 8-ая мега. Atmega328P. Есть китайская ардуинка с умершим загрузчиком, который хз как восстановить. Потер ее, решил так попользовать.
Трудное детство, стальные игрушки.
Друг Кота
Аватара пользователя
Сообщения: 6323
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

ARV писал(а):а когда написано (1<<ADEN) - это однозначно скажет, что бит будет стоять на нужном месте.
Возможно, я уже писал об этом где-то...
Пришлось мне читать прогу, написанную одной дамой (МК у нее первый, по принципу "ну не боги же горшки обжигают" :)) )
Вот так она записывала 11 в R16 :

Код: Выделить всё

   CLR   R16
   ORI   R16,1
   ORI   R16,2
   ORI   R16,8
Тут уж, как говорил Д.Быков, "Дальше думать он не смог" .
Изображение
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

если еще дать константам имена, например, так

Код: Выделить всё

.equ BITS 8 ;имелось в виду количество бит в байте
.equ BASE 2 ;имелось в виду основание двоичной системы
.equ TRUE 1 ;единственная осмысленная константа
clr r16
;какой-то код
ori r16, TRUE
;какой-то код
ori r16, BASE
;какой-то код
ori r16, BITS
то получится неплохой пример обфускации...
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

А ведь она могла бы и выставить все биты присвоением 0хFF, а затем обнулять ненужные. Получилось бы еще 2 команды сверху :)))
Открыл глаза
Аватара пользователя
Сообщения: 62
Зарегистрирован: Ср май 10, 2017 22:41:29
Откуда: Планета Земля

Сообщение FitoKot »

Я может чего то не догоняю в асме, но разве невозможно записать в регистр число одной командой?

Код: Выделить всё

LDI R16, 0x11
Я понимаю, удобно применять побитовую маску там где это нужно, но зачем это делать когда нужно ввести просто числовую переменную?
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="Пока_без_кота",url="/forum/viewtopic.php?p=3104028#p3104028"]А ведь она могла бы и выставить все биты присвоением 0хFF, а затем обнулять ненужные. Получилось бы еще 2 команды сверху :)))[/uquote]а можно было и не обнулять!

Код: Выделить всё

ori r16,1
ori r16,2
andi r16,252
ori r16,8
andi r16,240
andi r16,224
andi r16,192
andi r16,128
Я может чего то не догоняю в асме, но разве невозможно записать в регистр число одной командой?
В том-то и дело :) Только 11 в десятичной системе а не в шестнадцатеричной: ldi r16,11
Друг Кота
Аватара пользователя
Сообщения: 6323
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

FitoKot писал(а):Я может чего то не догоняю в асме, но разве невозможно записать в регистр число одной командой?
Так я ж объясяю: это писала ДЕВИЦА, в первый раз увидевшая МК. :( Я у нее тоже это спросил, она ничего не ответила,
Спойлерно потом подругам говорила: "Я его боюсь" ( я у них тогда нач. сектора был ) .
А знаете ли вы, что разработан комп. не на мат. логике, а на женской: там вместо традиционных И, ИЛИ, НЕ оператоы: "НИ ДА, НИ НЕТ" , "МОЖЕТ БЫТЬ...", " НЕТ, НЕТ, НЕТ, ДАЖЕ И НЕ ПРОСИ!" :)
Просю пардону у ТС что увел обсуждение малость в сторону. Но ведь вопрос прояснили ?
Изображение
Ответить

Вернуться в «AVR»