Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
akl
Друг Кота
Сообщения: 4471
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Gudd-Head писал(а):Кто-нибудь сможет компактней?
Немного, но всё же... :)

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

	LDI	ZL,4

	LDI	R20,'+'
	TST	XH
	BRPL	PLUS
	COM	XH
	NEG	XL
	SBCI	XH,-1
	LDI	R20,'-'
PLUS:
	LSR	XH
	ROR	XL
	DEC	ZL
	BRNE	PLUS	

	LDI	R21,5
	BRCS	PC+2
	CLR	R21
	
	MOV	R22,XL
	
Реклама
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Только ассемблерщики меряются, у кого короче....
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Нет, отвечаем на просьбу
Опытный кот
Аватара пользователя
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Сообщение Серый_ »

Составляю памятку с описанием и переводом команд ассемблера, кто-нибудь может перевести оные - научным языком. "Подпись"/ "не подпись"/ и "подпись" ли в русском варианте/ и что за подпись? :) Команды аппаратному умножителю:

Multiply Unsigned
Multiply Signed
Multiply Signed with Unsigned
Fractional Multiply Unsigned
Fractional Multiply Signed
Fractional Multiply Signed with Unsigned
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Сообщение Серый_ »

Ребят, как преобразовать двоичное в BCD? 11111111 >>> 255, осадив оное в трёх регистрах?
00000010 = 2
00000101 = 5
00000101 = 5
Предлагают 16-ти битные, но скостить их до 8-ми тоже надо уметь, чтоб "процедуру не повело". :) Может у кого в наличии готовые примеры?
УГ-изм проблемы:
СпойлерИзображение
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4966
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Сообщение Seriyvolk »

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

;вход: R16  число от 0 ... 255 
;выход: R18 число 2, R17 число 1, R16 число 0  = digits 
;байтов: 20 

;пример на вход ldi r16,255
;выход r18 = 00000010 это 2, r17 = 00000101 это 5, r16 = 00000101 это 5.                
Hex2BCD:		LDI r18,-1 
bcd1:           INC r18
                SUBI r16,100 
                BRCC bcd1 
                LDI r17,10 
bcd2:           DEC r17 
                SUBI r16,-10 
                BRCS bcd2
ret 
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Опытный кот
Аватара пользователя
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Сообщение Серый_ »

Спс. Опробирую. P. s. опробовал пока на дебагинге = работает. Нечто близкое к гениальному! :)
Прорезались зубы
Аватара пользователя
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье

Сообщение Vicont »

Мяу, товарищи! :)
Только что читал книгу Юрия Ревича "'Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера" о локальных и глобальных переменных:
Изображение

Программный код, приведенный в листинге 6.15, вызвал у мя некоторое недоумение.
Согласно логике автора, сначала значения 2-х переменных сохраняются в стеке, потом вызывается подпрограмма, и сразу после этого, сохраненные ранее значения вынимаются из стека, и присваиваются двум соответствующим локальным переменным.
НО! Насколько я понимаю, при вызове подпрограммы, в стеке должно еще сохраниться значение адреса следующей команды за "вызывалкой". Таким образом, переменной var_loc2 вместо значения var_2 должен присвоиться адрес строки "pop var_2", а переменной var_loc1 вместо значения var_1 должен присвоиться var_2, и далее путаница продолжится...

Так вот, товарищи, подскажите, пожалуйста, это я чего-то недопонимаю, или автор столь умной книжки ошибся ??? :roll:
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6347
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Да, код - бред сивой кобылы. Хотя это не значит, что через стек нельзя принимать/передавать параметры. Но это делается не таким тупым способом, как в примере, а с определенными плясками. Наверно, овчинка не стоит... Лучше договориться самому с собой о порядке использования для этих целей группы регистров. :)
В языках высокого уровня на РС так действительно делается, но там совсем другая архитектура.
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

Jack_A писал(а):Лучше договориться самому с собой о порядке использования для этих целей группы регистров. :)
Листал книжку Цифровая схемотехника и архитектура компьютера /Дэвид М. Харрис и Сара Л. Харрис/ (распространяется в сети бесплатно), понравилось как организованы регистры в описываемой архитектуре MIPS. Их также более 30 шт, но они имеют более осмысленные названия, говорящие об их использовании.

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

Название       Номер              Назначение
$0               0              Константный нуль
$at              1              Временный регистр для нужд ассемблера
$v0–$v1         2–3             Возвращаемые функциями значения
$a0–$a3         4–7             Аргументы функций
$t0–$t7         8–15            Временные переменные
$s0–$s7         16–23           Сохраняемые переменные
$t8–$t9         24–25           Временные переменные
$k0–$k1         26–27           Временные переменные операционной системы (ОС)
$gp             28              Глобальный указатель (англ.: global pointer)
$sp             29              Указатель стека (англ.: stack pointer)
$fp             30              Указатель кадра стека (англ.: frame pointer)
$ra             31              Регистр адреса возврата из функции
Т.е, например при вызове подпрограммы аргументы помещаются в регистры a0-a3, и результаты будет в v0-v1. В регистрах t8-t9 значения могут быть потеряны, но в s0-s7 обязаные быть сохранены. Все это, конечно условность, но зато как продумано! Если много писать на ассемблере для авр, то я бы и там переопределения (.def) сделал.
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Так обычно и делается. 8)
Однако...
Обычно в программе несколько различных модулей. Хорошо, если их можно "раскидать" по уже имеющимся регистрам с однозначной привязкой.
А вот в случае, когда прийдется одному регистру в разных подпрограммах разные задачи (и соответственно имена) давать последуют некоторые сложности (зависит от компилятора).
Если у ячейки ОЗУ в принципе может быть несколько символических имен, то у регистра в регистровом файле только одно (или undet потребуется для АВР).
Так что модель разметки - это весьма творческое дело и зависит как от личных предпочтений, так и от конкретной архитектуры МК и потребных в конструкции ресурсов. Плюс особенности применяемого компилятора учитывать надо.
Я как-то попытался попробовать эту тему поглубже копнуть (в своем "монологе") предложил на обсуждение вот такой набросок http://radiokot.ru/forum/download/file.php?id=204531... но ответов не обнаружилось пока.
:beer:
Прорезались зубы
Аватара пользователя
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье

Сообщение Vicont »

Товарищи, всем спасибо за советы!
Приятно сознавать, что мя правильно понимаю некоторые из особенностей работы AVR - это вдохновляет на новые свершения. :)
Подобные книжки буду читать с осторожностью, ведь альтернатив на русском языке об ассемблере для AVR довольно мало. :(
ks0 писал(а):понравилось как организованы регистры в описываемой архитектуре MIPS. Их также более 30 шт, но они имеют более осмысленные названия, говорящие об их использовании.
Интересный прием. Ко мне порой тоже приходили подобные мысли, чтобы в одних регистрах хранились аргументы для функций, в других временные значения, а в третьих - результаты. НО! Если вовремя выполнения какой-нибудь функции случайным образом сработает какое-нибудь прерывание, которое будет работать с теми же регистрами, то произойдет сбой программы. Конечно, во время выполнения такой функции все прерывания можно запретить, но если функция громоздкая, то прерывание можно просто проморгать. :roll:

Конечно, у архитектуры MIPS в этом плане больше возможностей, ведь ее разрядность может быть от 32-х до 64-х бит. На АВР если функция простая, чтобы задать исходные значения, может хватить 2-х регистров, а если функция сложная, то от 3 до 6. В MIPS для тех же самых целей может хватить 1 - 2 регистра.

Jack_A, Вы правы, тут сложнее всего самому с собой договориться... :beer:
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6347
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Я выделил себе группу регистров, которые использовал для передачи параметров и в подпрограммах их не использовал . При крайней необходимости в подпрограмме сохранял их в стеке. А в главной программе можно с ними делать что угодно, только к моменту вызова п/п оттуда все забрать. Остается проблема вложенных п/п . Но тут стек нам в помощь.
Еще неплохой, я считаю, метод - передавать в п/п указатель на область ОЗУ, где лежат входные параметры и куда складывать выходные.
Насчет прерываний. Правила хорошего программирования рекомендуют сохранять в стеке все используемые в обработчике регистры, тогда прерывание никаких бед не натворит. А запрещать его - в крайних, критически важных по времени случаях, например - запись в EEPROM.
Прорезались зубы
Аватара пользователя
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье

Сообщение Vicont »

Jack_A писал(а): использовал для передачи параметров...
Что Вы под этим подразумеваете? :roll:
Jack_A писал(а):Правила хорошего программирования рекомендуют сохранять в стеке все используемые в обработчике регистры, тогда прерывание никаких бед не натворит.
Семен Семеныч! :facepalm:
А ведь и правда, оказывается, всё гениальное - просто!
Спасибо. Обязательно учту в будущем этот прием. :)
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Jack_A писал(а):рекомендуют сохранять в стеке все используемые в обработчике регистры, тогда прерывание никаких бед не натворит.
Вот, кто бы что не говорил, а у Ревича, даже с его косяками, это есть и написано. )))) Просто, действительно, надо читать вдумчиво и все проверять.
Станислав
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Очепятки в разумных пределах у всех возможны. 8)
Насчет стека...
У ПИКова семейства есть его подвид - так называемый быстрый(теневой) стек.
В АВРке также подобный прием возможен - переброс пары регистров (нескольких пар) из полнофункциональной части в младший блок регистрового файла - все равно там с непосредственными данными работать неудобно, а как хранилище -весьма подходяще.
:roll:
Опытный кот
Аватара пользователя
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Сообщение Серый_ »

Vicont писал(а):на русском языке об ассемблере для AVR довольно мало. :(
Изображение :)
Друг Кота
Аватара пользователя
Сообщения: 6347
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Vicont писал(а):
Jack_A писал(а): использовал для передачи параметров...
Что Вы под этим подразумеваете? :roll:
Я ничего не подразумеваю - это общепринятые понятия в программировании. В подпрограмму(функцию) передаются аргументы - параметры, которые нужно обработать ( по значению или по ссылке - это не принципиально ). Заканчивая работу, функция в определенное место возвращает вычисленное значение, подпрограмма - одно или несколько значений. В общем случае она может изменять только значение глобальных переменных, в этом случае выходных параметров может и не быть.
Ответить

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