Страница 1 из 1
AVR ассемблер. Объясните способ записи
Добавлено: Ср май 10, 2017 09:18:55
Голимый
вот часто встречаю вот такое, например.
Код: Выделить всё
LDI R16,(1<<ACBG)|(1<<ACIE)|(1<<ACIS1)|(1<<ACIS0)
Не могу понять принцип такой записи, объясните пожалуйста что тут что значит.
Re: AVR ассемблер. Объясните способ записи
Добавлено: Ср май 10, 2017 09:36:41
Z_h_e
<< - сдвиг влево
| - побитное или
(1<<2) | (1<<0) |(1<<4)
0b00000100 | 0b00000001 | 0x00010000
0b00010101
Конечно следовало бы Вас в гугл отправить, вопрос то банальный, могли бы сами разобраться.
Re: AVR ассемблер. Объясните способ записи
Добавлено: Ср май 10, 2017 09:38:26
Jack_A
Это очень просто: загрузить в R16 константу, в которой единица будет в тех битах, номер которых справа от << .
Например, если ACBG = бит 0, ACIE = бит 2, то запись LDI R16,(1<<ACBG)|(1<<ACIE) будет то же, что и LDI R16, (1 + 4) , т.к. 1<<0 = 1, 1<<2 = 4.
Re: AVR ассемблер. Объясните способ записи
Добавлено: Ср май 10, 2017 10:03:22
Голимый
Для меня - не банальный. Например, откуда в регистре R16 взялись биты, с именами битов управляющего регистра компаратора. Я вот это догнать не могу.
Я смог понять, если бы LDI R16, (1<<7)|(1<<6)|(1<<5)... и так далее
И зачем такие усложнения, если можно просто LDI R16, 0x00000000b?
Re: AVR ассемблер. Объясните способ записи
Добавлено: Ср май 10, 2017 10:09:29
Z_h_e
Голимый писал(а):И зачем такие усложнения, если можно просто LDI R16, 0x00000000b?
Можно сразу в машинном коде писать

. Такие "усложнения" нужны для читабельности кода. Советую не пренебрегать этим. Эти, казалось бы длинные записи, на самом деле экономят Ваше время при отладке. На комментариях советую тоже не экономить, их может быть больше чем сам код.
Re: AVR ассемблер. Объясните способ записи
Добавлено: Ср май 10, 2017 10:11:32
ARV
Голимый писал(а): откуда в регистре R16 взялись биты, с именами битов управляющего регистра компаратора.
ниоткуда они там не взялись: имена битов использовались для вычисления нужного значения, которое потом было помещено в R16. имена - это ведь просто названия. вы можете называть что угодно как угодно, ничего в мире от этого не изменится. но когда вы собираетесь изменять содержимое регистра управления компаратором, вам лучше знать, что те или иные биты соответствуют правильным битам в этом регистре. и дя этого лучше применять правильные их названия.
именно для легкости понимания следует использовать имена битов, а не безымянные константы 0b0101010101 - как узнать, установлен в этом числе бит ADEN или нет? вы помните его "место"? а когда написано (1<<ADEN) - это однозначно скажет, что бит будет стоять на нужном месте.
Re: AVR ассемблер. Объясните способ записи
Добавлено: Ср май 10, 2017 10:20:16
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
Re: AVR ассемблер. Объясните способ записи
Добавлено: Ср май 10, 2017 10:38:17
Голимый
Действительно, неплохо получилось:
Код: Выделить всё
ldi temp, (1<<DDD6)|(1<<DDD7)
out DDRD, temp
ldi temp, (1<<DDB0)
out DDRB, temp
Спасибо, помогли!
Каменты к к коду не пишу, т.к могу писать либо код, либо каменты. И вообще пишу для себя.
Re: AVR ассемблер. Объясните способ записи
Добавлено: Ср май 10, 2017 10:40:09
Z_h_e
Комменты как раз для себя и пишут.
Re: AVR ассемблер. Объясните способ записи
Добавлено: Ср май 10, 2017 10:49:42
Голимый
Не 8-ая мега. Atmega328P. Есть китайская ардуинка с умершим загрузчиком, который хз как восстановить. Потер ее, решил так попользовать.
Re: AVR ассемблер. Объясните способ записи
Добавлено: Пт май 12, 2017 09:18:55
Jack_A
ARV писал(а):а когда написано (1<<ADEN) - это однозначно скажет, что бит будет стоять на нужном месте.
Возможно, я уже писал об этом где-то...
Пришлось мне читать прогу, написанную одной дамой (МК у нее первый, по принципу "ну не боги же горшки обжигают"

)
Вот так она записывала 11 в R16 :
Тут уж, как говорил Д.Быков, "Дальше думать он не смог" .
Re: AVR ассемблер. Объясните способ записи
Добавлено: Пт май 12, 2017 22:11:41
COKPOWEHEU
если еще дать константам имена, например, так
Код: Выделить всё
.equ BITS 8 ;имелось в виду количество бит в байте
.equ BASE 2 ;имелось в виду основание двоичной системы
.equ TRUE 1 ;единственная осмысленная константа
clr r16
;какой-то код
ori r16, TRUE
;какой-то код
ori r16, BASE
;какой-то код
ori r16, BITS
то получится неплохой пример обфускации...
Re: AVR ассемблер. Объясните способ записи
Добавлено: Пт май 12, 2017 23:11:42
Пока_без_кота
А ведь она могла бы и выставить все биты присвоением 0хFF, а затем обнулять ненужные. Получилось бы еще 2 команды сверху

Re: AVR ассемблер. Объясните способ записи
Добавлено: Пт май 12, 2017 23:37:05
FitoKot
Я может чего то не догоняю в асме, но разве невозможно записать в регистр число одной командой?
Я понимаю, удобно применять побитовую маску там где это нужно, но зачем это делать когда нужно ввести просто числовую переменную?
Re: AVR ассемблер. Объясните способ записи
Добавлено: Сб май 13, 2017 08:03:30
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
Re: AVR ассемблер. Объясните способ записи
Добавлено: Сб май 13, 2017 09:47:46
Jack_A
FitoKot писал(а):Я может чего то не догоняю в асме, но разве невозможно записать в регистр число одной командой?
Так я ж объясяю: это писала ДЕВИЦА, в первый раз увидевшая МК.

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