Надо что-то другое?
Ассемблер (ASM) для AVR в вопросах и ответах
Выдает кучу ошибок, начиная с м128def.inc.
Надо что-то другое?
Надо что-то другое?
- Реклама
Ассемблерный исходник должен иметь расширение "s"
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Это я понял.
в файле строка
.include "m128def.inc"
и в нем выдает ошибки
почему-то строка "avr-gcc Test.S > Err.txt" не скидывает ошибки в файл.
в файле строка
.include "m128def.inc"
и в нем выдает ошибки
почему-то строка "avr-gcc Test.S > Err.txt" не скидывает ошибки в файл.
Во-первых, я без понятия, что за ошибки он выдает. Может m128def.inc не находит.
Во-вторых, Вы перенаправляете в файл stdout, ошибки выводятся в stderr, который вы не перенаправляете в файл
Во-вторых, Вы перенаправляете в файл stdout, ошибки выводятся в stderr, который вы не перенаправляете в файл
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Похоже у него несколько другой синтаксис.
m128def.inc находит, в нем выдает ошибки.
Не признает "cseg".
m128def.inc находит, в нем выдает ошибки.
Не признает "cseg".
- Реклама
http://tigcc.ticalc.org/doc/gnuasm.html
Добавлено after 15 minutes 59 seconds:
Пример использования http://www.nongnu.org/avr-libc/user-man ... mbler.html
Добавлено after 15 minutes 59 seconds:
Пример использования http://www.nongnu.org/avr-libc/user-man ... mbler.html
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Это просто показательный пример, чтобы была ясна идеология локальных меток.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
P.S.: Сейчас очень активно развивается проект fasmg, там на мощнейший препроцессорный скелет можно навесить надстройки практически для любых МК. Для AVR уже есть
Добавлено after 20 minutes 7 seconds:
Никогда не нравилась возня с объектниками и компоновкой. Делаю так только на x86 и то на относительно больших проектах. Не каждый ассемблер умеет генерить отладочную информацию в формате, поддерживаемом линкером, а отладка на уровне исходного кода очень удобна. Например, идеология fasm не предусматривает компоновку, поэтому он умеет генерить сразу исполняемые файлы многих форматов, хоть и объектники тоже поддерживает.ptr128 писал(а): Дайте возможность компоновщику потрудиться )
Плохо читали тему. Речь идет о GNU AVR ассемблере, который все это умеет. Отлаживайтесь на уровне исходного кода, сколько влезет.Andrew Martin писал(а):Не каждый ассемблер умеет генерить отладочную информацию в формате, поддерживаемом линкером, а отладка на уровне исходного кода очень удобна.ptr128 писал(а): Дайте возможность компоновщику потрудиться )
А разве код на МК не может быть частью большого проекта, включающего в себя и код для других МК, и код для X86?Andrew Martin писал(а): на относительно больших проектах
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
вот пример из моих файлов:Серый_ писал(а):А как конвертится число, лежащее в двух регистрах в 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
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Может так проще и быстрее?
.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
Спойлер
.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
На "гномике" его преимущества и заканчиваютсяptr128 писал(а):Речь идет о GNU AVR ассемблере, который все это умеет. Отлаживайтесь на уровне исходного кода, сколько влезет.
Вы не священнослужитель, случайно, раз догмами оперируете? Мне как то всегда казалось, что сочетание CPP и макроязыка для X86 представляет собой очень мощный и гибкий механизм.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
ссылка на аналогичный алгоритм была недавно (сразу после задания вопроса).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
к тому же, у меня вообще не используется обращение к ОЗУ.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Проверил программы преобразования "двоичного числа, (не более 9999), в 4 десятичных цифры""Всё познается в сравнении"
Для проверки выбрано одно число 9876
dr.doc
777 тактов
Starichok51
397 тактов
адаптированная программа отсюда
294 такта Пытался узнать как работает преобразователь у 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 раз.
Так и в моем примере обращение к ОЗУ не нужно. вся работа выполняется в РОН. А наращивание разрядности насколько сложно в Вашем коде? В предложенном мной - добавить несколько строчек.к тому же, у меня вообще не используется обращение к ОЗУ.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
извини, я совсем упустил из виду, что по Z можно обращаться и к регистрам.dr.doc писал(а):Так и в моем примере обращение к ОЗУ не нужно
нарастить разрядность в моем коде можно, так как моя подпрограмма деления (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
А причем CPP, если тут обсуждаются возможности ассемблеров? Да, GAS как самостоятельный инструмент - это УБОЖЕСТВО, и я не устану это повторять, хоть это и больная мозоль адептов гнутых компилеров. Если писать исключительно на асме, то GAS по сравнению с тем же fasm - это тьма беспросветная и жуть жуткая.ptr128 писал(а):Вы не священнослужитель, случайно, раз догмами оперируете? Мне как то всегда казалось, что сочетание CPP и макроязыка для X86 представляет собой очень мощный и гибкий механизм.
Компилятор соответствует структуре ядра и принятой системе адресации для конкретного семейства.
Нет смысла добавлять АВРкам свойства I8086 - там и имеющегося при правильном/полном использовании с избытком сделано. Ежли охота "экстриму" - попробуйте ассемблер для STM8...
Другое дело, что в большинстве случаев народ понимает под работой с ассемблером или написание примитивов "по Заецу" или написание коротких вставок под общей обработкой в СИ.

Нет смысла добавлять АВРкам свойства I8086 - там и имеющегося при правильном/полном использовании с избытком сделано. Ежли охота "экстриму" - попробуйте ассемблер для STM8...
Другое дело, что в большинстве случаев народ понимает под работой с ассемблером или написание примитивов "по Заецу" или написание коротких вставок под общей обработкой в СИ.
Потому что использование GNU ассемблер без С препроцессора (CPP), сродни использованию fasm без макросов. В GNU toolchain AS лишь один из компонентов, и не надо его выдирать отдельно. Вам же не приходит в голову ездить на автомобиле без двигателя, запрягая лошадь? )Andrew Martin писал(а): А причем CPP, если тут обсуждаются возможности ассемблеров? Да, GAS как самостоятельный инструмент - это УБОЖЕСТВО, и я не устану это повторять,
А когда утверждения тупо повторяют без доказательств, это называется догматизм. Потому и я подумал, что Вы священнослужитель. У них именно так принято )
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
ptr128 абсолютно прав про использование GNU ассемблера.
Это не инструмент, которым можно заниматься.
А, где можно скачать fasm под AVR? Че-то не могу найти?
Это не инструмент, которым можно заниматься.
А, где можно скачать fasm под AVR? Че-то не могу найти?


