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

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Выдает кучу ошибок, начиная с м128def.inc.
Надо что-то другое?
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Сообщение ptr128 »

Ассемблерный исходник должен иметь расширение "s"
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Реклама
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Это я понял.
в файле строка
.include "m128def.inc"
и в нем выдает ошибки

почему-то строка "avr-gcc Test.S > Err.txt" не скидывает ошибки в файл.
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Сообщение ptr128 »

Во-первых, я без понятия, что за ошибки он выдает. Может m128def.inc не находит.
Во-вторых, Вы перенаправляете в файл stdout, ошибки выводятся в stderr, который вы не перенаправляете в файл
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Похоже у него несколько другой синтаксис.
m128def.inc находит, в нем выдает ошибки.
Не признает "cseg".
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Сообщение ptr128 »

http://tigcc.ticalc.org/doc/gnuasm.html

Добавлено after 15 minutes 59 seconds:
Пример использования http://www.nongnu.org/avr-libc/user-man ... mbler.html
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

Сообщение Andrew Martin »

Z_h_e писал(а):Ваш пример рабочий? Как компилятор узнает зону ответственности метки?
Это просто показательный пример, чтобы была ясна идеология локальных меток.
На avrasm-е никогда не пользовался локальными метками, за то в fasm-е и fasmarm постоянно. Там вот такие конструкции с локальными метками:

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


procname1:

cmp r0,0
bge  .label1
blt    .label2

.label1:
.label2:

procname2:

cmp r0,0
bge  .label1
blt    .label2

.label1:
.label2:

преобразуется препроцессором в:

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


cmp r0,0
bge procname1.label1
blt   procname1.label2

cmp r0,0
bge procname2.label1
blt   procname2.label2

Зона корректности локальной метки вида .label1 - после глобальной метки и до следующей глобальной метки.

P.S.: Сейчас очень активно развивается проект fasmg, там на мощнейший препроцессорный скелет можно навесить надстройки практически для любых МК. Для AVR уже есть :)))

Добавлено after 20 minutes 7 seconds:
ptr128 писал(а): Дайте возможность компоновщику потрудиться )
Никогда не нравилась возня с объектниками и компоновкой. Делаю так только на x86 и то на относительно больших проектах. Не каждый ассемблер умеет генерить отладочную информацию в формате, поддерживаемом линкером, а отладка на уровне исходного кода очень удобна. Например, идеология fasm не предусматривает компоновку, поэтому он умеет генерить сразу исполняемые файлы многих форматов, хоть и объектники тоже поддерживает.
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Сообщение ptr128 »

Andrew Martin писал(а):
ptr128 писал(а): Дайте возможность компоновщику потрудиться )
Не каждый ассемблер умеет генерить отладочную информацию в формате, поддерживаемом линкером, а отладка на уровне исходного кода очень удобна.
Плохо читали тему. Речь идет о GNU AVR ассемблере, который все это умеет. Отлаживайтесь на уровне исходного кода, сколько влезет.
Andrew Martin писал(а): на относительно больших проектах
А разве код на МК не может быть частью большого проекта, включающего в себя и код для других МК, и код для X86?
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Модератор
Аватара пользователя
Сообщения: 19101
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

Серый_ писал(а):А как конвертится число, лежащее в двух регистрах в 4-х значное десятичное (0000, с разложением в 4 регистра)?
вот пример из моих файлов:

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

;--- преобразование двоичного числа, (не более 9999), в 4 десятичных цифры ---
;--- двоичное число в R11:R10, на выходе 4 десятичные цифры в R10:R11:R12:R13 в ASCII коде---
bin_to_4_decimal_digit:
clr R13
clr R12				; очистим старшие байты
ldi R17, high(10)
ldi R16,  low(10)
rcall div_32_16_16_16
mov R13, R12
rcall div_16_8_8_8
mov R12, R11
clr R11				; очистим старший байт
rcall div_16_8_8_8
ldi R18, '0'				; символ "0"
add R13, R18
add R12, R18
add R11, R18
add R10, R18
ret

;--- деление 16 бит в R11:R10 на 8 бит в R16 ---
;------ целая часть в R10, остаток в R11 -------
div_16_8_8_8:
ldi R18, 8				; делаем 8 циклов сдвига делимого/результата
div_16_8_8_8a:
lsl R10
rol R11
brcs div_16_8_8_8b
cp R11, R16
brcs div_16_8_8_8c		; если меньше, то пропускаем вычитание
div_16_8_8_8b:
sub R11,R16
inc R10
div_16_8_8_8c:
dec R18
brne div_16_8_8_8a
ret

;--- деление 32 бита в R13:R12:R11:R10 на 16 бит в R17:R16 ---
;--------- целая часть в R11:R10, остаток в R13:R12 ----------
div_32_16_16_16:
ldi R18, 16				; делаем 16 циклов сдвига делимого/результата
div_32_16a:
lsl R10
rol R11
rol R12
rol R13
brcs div_32_16b
cp R12, R16
cpc R13, R17
brcs div_32_16c	
div_32_16b:			; если меньше, то пропускаем вычитание
sub R12,R16
sbc R13,R17
inc R10
div_32_16c:
dec R18
brne div_32_16a
ret
на выходе получаем 4 десятичные цифры в ASCII коде, готовые к выводу на дисплей.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Сообщение dr.doc »

Может так проще и быстрее?
Спойлер.equ AtBCD0 = 4 ;address of r4 для подпрограммы BIN2_BCD
.equ AtBCD2 = 6 ;address of r6

BIN_BCD:
; Input (r17:r16) output BCD number (r6:r5:r4:r3:r2).
; High registers used: 4(r16,r17,r18,r19)
; Pointers used: Z

ldi r18,16 ;Init loop counter
clr r6 ;clear result (3 bytes)
clr r5
clr r4
clr ZH ;clear ZH (not needed for AT90Sxx0x)
bBCDx_1:
lsl r16 ;shift input value
rol r17 ;through all bytes
rol r4 ;
rol r5
rol r6
dec r18 ;decrement loop counter
brne bBCDx_2 ;if counter not zero
; распределим числа по ячейкам
ldi r18,0x0F
mov r2,r4
and r2,r18
swap r4
mov r3,r4
and r3,r18
mov r4,r5
and r4,r18
swap r5
and r5,r18
ret ;return

bBCDx_2:
ldi r30,AtBCD2+1 ;Z points to result MSB + 1
bBCDx_3:
ld r19,-Z ;get (Z) with pre-decrement
subi r19,-$03 ;add 0x03
sbrc r19,3 ;if bit 3 not clear
st Z,r19 ;store back
ld r19,Z ;get (Z)
subi r19,-$30 ;add 0x30
sbrc r19,7 ;if bit 7 not clear
st Z,r19 ;store back
cpi ZL,AtBCD0 ;done all three?
brne bBCDx_3 ;loop again if not
rjmp bBCDx_1
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

Сообщение Andrew Martin »

ptr128 писал(а):Речь идет о GNU AVR ассемблере, который все это умеет. Отлаживайтесь на уровне исходного кода, сколько влезет.
На "гномике" его преимущества и заканчиваются :))) По сравнению с тем же fasm-ом GAS убог по части макроязыка. Вероятнее всего потому что он не ориентирован на использование в качестве самостоятельного инструмента.
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Сообщение ptr128 »

Вы не священнослужитель, случайно, раз догмами оперируете? Мне как то всегда казалось, что сочетание CPP и макроязыка для X86 представляет собой очень мощный и гибкий механизм.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Модератор
Аватара пользователя
Сообщения: 19101
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

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

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

bin_to_4_decimal_digit:
clr R13
clr R12                    ; очистим старшие байты
ldi R17, high(10)
ldi R16,  low(10)
rcall div_32_16_16_16
mov R13, R12
rcall div_16_8_8_8
mov R12, R11
clr R11                    ; очистим старший байт
rcall div_16_8_8_8
ldi R18, '0'               ; символ "0"
add R13, R18
add R12, R18
add R11, R18
add R10, R18
ret
невооруженным глазом видно, что длина кода значительно короче.
к тому же, у меня вообще не используется обращение к ОЗУ.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

"Всё познается в сравнении"
Проверил программы преобразования "двоичного числа, (не более 9999), в 4 десятичных цифры"
Для проверки выбрано одно число 9876
dr.doc
777 тактов
Starichok51
397 тактов
адаптированная программа отсюда
294 такта
bcd.asm
(4.18 КБ) 487 скачиваний
Пытался узнать как работает преобразователь у Atmel. Бросил, слишком много нужно дефайнить. Может для ценителей символики будет интересно. :)

10:38
Проверил программу от Atmel. Получилось
297 тактов
Спойлер

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

	.include "m8def.inc"
.def	rmp=r20

.def	rBin1L=r21
.def	rBin1H=r22

.def	rBin2L=r24
.def	rBin2H=r25
; Bin2ToBcd5
; ==========
; converts a 16-bit-binary to a 5-digit-BCD
; In: 16-bit-binary in rBin1H:L, Z points to first digit
;   where the result goes to
; Out: 5-digit-BCD, Z points to first BCD-digit
; Used registers: rBin1H:L (unchanged), rBin2H:L (changed),
;   rmp
; Called subroutines: Bin2ToDigit

GO:
	LDI	XH,HIGH(RAMEND)
	LDI	XL,LOW(RAMEND)
	OUT	SPH,XH
	OUT	SPL,XL

	LDI	rBin1H,HIGH(9876)
	LDI	rBin1L,LOW(9876)
	RCALL	BIN_BCD
	RJMP	GO
BIN_BCD:
Bin2ToBcd5:
	CLR	ZH
	LDI	ZL,10
;	push rBin1H ; Save number
;	push rBin1L
;	ldi rmp,HIGH(10000) ; Start with tenthousands
;	mov rBin2H,rmp
;	ldi rmp,LOW(10000)
;	mov rBin2L,rmp
;	rcall Bin2ToDigit ; Calculate digit
	ldi rmp,HIGH(1000) ; Next with thousands
	mov rBin2H,rmp
	ldi rmp,LOW(1000)
	mov rBin2L,rmp
	rcall Bin2ToDigit ; Calculate digit
	ldi rmp,HIGH(100) ; Next with hundreds
	mov rBin2H,rmp
	ldi rmp,LOW(100)
	mov rBin2L,rmp
	rcall Bin2ToDigit ; Calculate digit
	ldi rmp,HIGH(10) ; Next with tens
	mov rBin2H,rmp
	ldi rmp,LOW(10)
	mov rBin2L,rmp
	rcall Bin2ToDigit ; Calculate digit
	st z,rBin1L ; Remainder are ones
	sbiw ZL,4 ; Put pointer to first BCD
;	pop rBin1L ; Restore original binary
;	pop rBin1H
	ret ; and return
;
; Bin2ToDigit
; ===========
; converts one decimal digit by continued subraction of a
;   binary coded decimal
; Used by: Bin2ToBcd5, Bin2ToAsc5, Bin2ToAsc
; In: 16-bit-binary in rBin1H:L, binary coded decimal in
;   rBin2H:L, Z points to current BCD digit
; Out: Result in Z, Z incremented
; Used registers: rBin1H:L (holds remainder of the binary),
;   rBin2H:L (unchanged), rmp
; Called subroutines: -
;
Bin2ToDigit:
	clr rmp ; digit count is zero
Bin2ToDigita:
	cp rBin1H,rBin2H ; Number bigger than decimal?
	brcs Bin2ToDigitc ; MSB smaller than decimal
	brne Bin2ToDigitb ; MSB bigger than decimal
	cp rBin1L,rBin2L ; LSB bigger or equal decimal
	brcs Bin2ToDigitc ; LSB smaller than decimal
Bin2ToDigitb:
	sub rBin1L,rBin2L ; Subtract LSB decimal
	sbc rBin1H,rBin2H ; Subtract MSB decimal
	inc rmp ; Increment digit count
	rjmp Bin2ToDigita ; Next loop
Bin2ToDigitc:
	st z+,rmp ; Save digit and increment
	ret ; done
.exit
Последний раз редактировалось akl Сб ноя 26, 2016 08:42:13, всего редактировалось 1 раз.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Сообщение dr.doc »

к тому же, у меня вообще не используется обращение к ОЗУ.
Так и в моем примере обращение к ОЗУ не нужно. вся работа выполняется в РОН. А наращивание разрядности насколько сложно в Вашем коде? В предложенном мной - добавить несколько строчек.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Модератор
Аватара пользователя
Сообщения: 19101
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

dr.doc писал(а):Так и в моем примере обращение к ОЗУ не нужно
извини, я совсем упустил из виду, что по Z можно обращаться и к регистрам.
нарастить разрядность в моем коде можно, так как моя подпрограмма деления (div_32_16_16_16) принимает в себя 32 бита. но время выполнения вырастет значительно.
да, такой алгоритм, как сделано у тебя, мне сразу понравился (еще несколько страниц назад, когда была дана ссылка на такой алгоритм). разрядность наращивается совершенно без проблем.
в одной программе я получаю 6 десятичных разрядов. так пришлось сначала разделить число на 10000, а потом обрабатывать полученные части числа.
но я "примерю" этот алгоритм к своему 6-разрядному числу. возможно, получится выгоднее, чем у меня сделано сейчас с разбиением числа на части.

Добавлено after 2 hours 27 minutes 39 seconds:
сделал я примерку алгоритма от dr.doc для обработки 6-разрядного десятичного числа.
у меня
- получение 6 цифр,
- анализ на лидирующие нули (где поставить точку),
- преобразование в ASCII,
- вывод на индикатор
занимает 45 строк.

а по алгоритму от dr.doc только получение 6 цифр заняло 43 строки. а еще нужно сделать
- анализ на лидирующие нули (где поставить точку),
- преобразование в ASCII,
- вывод на индикатор

таким образом, менять свой алгоритм я не вижу смысла.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

Сообщение Andrew Martin »

ptr128 писал(а):Вы не священнослужитель, случайно, раз догмами оперируете? Мне как то всегда казалось, что сочетание CPP и макроязыка для X86 представляет собой очень мощный и гибкий механизм.
А причем CPP, если тут обсуждаются возможности ассемблеров? Да, GAS как самостоятельный инструмент - это УБОЖЕСТВО, и я не устану это повторять, хоть это и больная мозоль адептов гнутых компилеров. Если писать исключительно на асме, то GAS по сравнению с тем же fasm - это тьма беспросветная и жуть жуткая. :kill: Кто утверждает обратное - тот очевидно не знаком с fasm.
Друг Кота
Аватара пользователя
Сообщения: 15791
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Компилятор соответствует структуре ядра и принятой системе адресации для конкретного семейства.
Нет смысла добавлять АВРкам свойства I8086 - там и имеющегося при правильном/полном использовании с избытком сделано. Ежли охота "экстриму" - попробуйте ассемблер для STM8...
:write:
Другое дело, что в большинстве случаев народ понимает под работой с ассемблером или написание примитивов "по Заецу" или написание коротких вставок под общей обработкой в СИ.
8)
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Сообщение ptr128 »

Andrew Martin писал(а): А причем CPP, если тут обсуждаются возможности ассемблеров? Да, GAS как самостоятельный инструмент - это УБОЖЕСТВО, и я не устану это повторять,
Потому что использование GNU ассемблер без С препроцессора (CPP), сродни использованию fasm без макросов. В GNU toolchain AS лишь один из компонентов, и не надо его выдирать отдельно. Вам же не приходит в голову ездить на автомобиле без двигателя, запрягая лошадь? )
А когда утверждения тупо повторяют без доказательств, это называется догматизм. Потому и я подумал, что Вы священнослужитель. У них именно так принято )
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

ptr128 абсолютно прав про использование GNU ассемблера.
Это не инструмент, которым можно заниматься.
А, где можно скачать fasm под AVR? Че-то не могу найти?
Ответить

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