По длине как второй вариант, но не требует постоянно выделенного доп. регистра. По сравнению с первым вариантом и короче, и даже временно не требует доп регистра.
Да я в курсе минусования отрицательной константы, выдел ранее что компиляторы так делают. Скриншот моего кода в атаче, только формат записи у меня несколько иной.
1) Ну тогда в Вашем замечании нужно было сказать ещё, что писать надо не XL и XH, а ZL и ZH Так как для того доступа, который в принципе возможно осуществить через X, ни в одном из ассемблеров ничего делить не надо.
2) У IAR-овского и у GCC-шного ассемблеров и флеш адресуется побайтово, что даёт возможность плотнее заполнять флеш данными (строки и структуры могут действительно занимать нечётное число байт и могут начинаться с середины слова). У них наоборот -- для получения адреса данных делать ничего не надо, а под IJMP/ICALL надо на два делить.
3) Да, спасибо за ссылку на обсуждение мной же приведённого кода
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.
К сожалению не совсем понял. Насколько я знаю каждый последующий адрес памяти программ содержит по 2 байта (16 bit word). Значит шагать можно только по 2 байта, задав адрес имеем в доступе младший байт слова, для доступа к старшему адресу нужно сместиться: lpm Z+
или:
adiw Z,0x01 lpm Z
Неужели я могу задать сразу адрес старшего байта слова? - и считать его без дополнительного действия-смещения?
_________________ Боишся - не делай. Делаешь - не бойся.
А вот кстати у меня есть неплохой примерчик того, как адрес кода первращается на ходу в адрес данных и назад. Располагаем строку для печати на терминал прямо в коде, сразу за вызовом подпрограммы печати (эх, где мои JSR R5, addr)
Код:
; этот вызов и следующие две строки удобно завернуть в макрос, ; но тут так для ясности написано развёрнуто rcall printstr_с .asciz "fooo" ; строка с завершющим нулём занимает 5 байт, поэтому нужно .align 2 ; подравнять на границу 2 байт и только потом писать следующие команды ; после выполнения printstr_c вернёмся сюда! nop ; пошли следующие команды
Вот так оно скомпилируется:
Код:
173 006c 00D0 rcall printstr_c 174 006e 666F 6F6F .asciz "fooo" 174 00 ; Это завершающий 0 от строки 175 0073 00 .align 2 ; а это дополнительный 0 для того, чтобы 176 0074 0000 nop ; следующая команда была с чётного (словного) адреса
Команда rcall помещает на стек арес следующей команды. А у нас там данные -- текст. Так что надо:
Код:
printstr_c: pop r31 ; POP-нуть этот адрес *слова-команды* из стека в Z pop r30 lsl r30 ; умножить на два -- получить адрес *байта-данных* rol r31 rjmp pr_2 pr_1: rcall putchar ; детали вывода символа нас сейчас не интересуют pr_2: lpm r16, Z+ ; читаем байт и переходим к следующему *байтовому* адресу tst r16 brne pr_1 ; если встретили завершающий 0 -- строка закночилась adiw r30,1 ; округляем вверх до чётного числа *байтов* lsr r31 ; и делим на два для возврата к *словам-командам* ror r30 ; (тот же align) ijmp ; теперь делаем "возврат" в точку сразу за строкой в ПЗУ
Тут, кончечно, строки с чётным числом символов (нечётным числом байтов вместе с 0-терминатором) занимают лишний байт по сравнению с помещением всех строк в отдельню секцию с байтовым выравниванием, но даже в этом случае где-то после шестой строки будем иметь выигрыш в три байта на вызов по сравнению с
Код:
ldi ZL, low (string) ; вот эти четыре байта ldi ZH, high (string) ; будут экономиться на каждом вызове rcall putstr_з
В худшем случае один байт будет пропадать на align и экономия в три байта. В лучшем -- экономия 4 байта. Но сама подпрограмма вывода с доставанием адреса из стека и манипуляциями с ним длиннее, поэтому прибыль пойдет где-то с пятого-шестого вызова
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Оффтопически-историческая справка по поводу "где мои JSR R5, addr"
У "хита всех времён и народов" PDP-11 не было команды вызова подпрограммы CALL в тако виде, как у AVR, PIC, MCS51 и прочих. К тому, что у неё было, ближе всех ARM-овская команда BL. CALL addr у PDP-11 была просто синонимом ассемблера к команде JSR PC, addr (о вариациях задания addr сейчас не будем).
Цитата:
JSR REG, ADDR
Jump to SubRoutine работала так: Затолкать в стек регистр REG (а не адрес возврата) Поместить в REG адрес возврата Поместить в счётчик команд адрес подпрограммы (последние две строки у ARM полчили имя BL == Branch and Link) В результате приведенное выше выглядело бы так
Код:
jsr r5, printstr_c .asciiz "fooo" .align ... printstr_c: ; А адрес-то "возврата", т.е. строки, у нас уже в R5 ! movb (R5)+, R0 ; берем байт-символ по адресу в R5 и увеличиваем R5 на 1. bne done ; mov устанавливает флаги -- проверка на 0 уже сделана call putchar ; то же самое, что JSR PC, putchar, где PC aka R7 -- счётчик команд jmp printstr_c done: rts r5 ; ReTurn from Subroutine
RTS REG делает обратное действие -- заносит REG в счётчик команд и восстанавливает REG из стека.
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Оффтопически-историческая справка по поводу "где мои JSR R5, addr"
У "хита всех времён и народов" PDP-11 не было команды вызова подпрограммы CALL в тако виде, как у AVR, PIC, MCS51 и прочих. К тому, что у неё было, ближе всех ARM-овская команда BL.
Не совсем верно. Во-первых, JSR на PDP-11 могла работать полностью аналогично привычному CALLу, достаточно было записать её в виде: JSR PC, адрес -- и она пихила в стек именно PC, т.е. адрес возврата. Во-вторых, ARMовская BL является точной копией команды перехода с возвратом мэйнфреймов IBM (System/360, 370 и т.д.): у тех стека не было в принципе, и адрес возврата запоминался в регистре. У ARMа стек есть, но сохранять в нём адрес возврата надо ручками.
Не совсем верно. Во-первых, JSR на PDP-11 могла работать полностью аналогично привычному CALLу, достаточно было записать её в виде: JSR PC, адрес -- и она пихила в стек именно PC, т.е. адрес возврата. Во-вторых, ARMовская BL является точной копией команды перехода с возвратом мэйнфреймов IBM (System/360, 370 и т.д.): у тех стека не было в принципе, и адрес возврата запоминался в регистре. У ARMа стек есть, но сохранять в нём адрес возврата надо ручками.
Вы читаете всё, или только то, на что можете хорошо ответить?
avreal писал(а):
У "хита всех времён и народов" PDP-11 не было команды вызова подпрограммы CALL в тако виде, как у AVR, PIC, MCS51 и прочих. К тому, что у неё было, ближе всех ARM-овская команда BL. CALL addr у PDP-11 была просто синонимом ассемблера к команде JSR PC, addr
Я сказал и про JSR PC, ... -- а дальше из описания действий понятно, что при этом она сохраняа на стеке и восстанавливала отутда тот REG, который PC. И про то, что мнемоника ассемблера CALL была у PDP-11 -- как синоним к этой JSR PC,... . И про армовский BL я не говорил, что он есть точной копией JSR у PDP-11, просто похожи в том, что адрес возврата в регистр заносится и даже уточнил в описании JSR какая часть соответствует.
А то, что я про /360-ые не написал, так я и не собирался, так как не знаю . Вышло "не совсем полно", а не "не совсем верно", но "совсем полно" это слишком много, я не претендую на такую энциклопедичность. Даже для "чуточку полнее" как минимум ещё HP2100/М6000/СМ-2 придётся вспомнить с их отсутстием стека, но наличием JSR и удобно сделанной возможностью брать параметры из кода после вызова функции.
В любом случае и PDP-11-шный JSR, и ARM-овский BL гораздо удобнее для передачи константных параметров (не только строк), чем то, что приходится делать в AVR.
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Вы читаете всё, или только то, на что можете хорошо ответить?
А Вы всё, хоть малость с Вашим мнением/описанием не согласующееся, считаете личным наездом?
Цитата:
И про то, что мнемоника ассемблера CALL была у PDP-11 -- как синоним к этой JSR PC
А вот это уже прямая Ваша ошибка. Такой мнемоники ассемблера у PDP-11 не было -- была широко применявшаяся макрокоманда, которая превращалась в JSR PC. Исходники RSX-11M в качестве доказательста выкладывать, или так поверите?
Цитата:
В любом случае и PDP-11-шный JSR, и ARM-овский BL гораздо удобнее для передачи константных параметров (не только строк), чем то, что приходится делать в AVR.
Вы читаете всё, или только то, на что можете хорошо ответить?
А Вы всё, хоть малость с Вашим мнением/описанием не согласующееся, считаете личным наездом?
Вполне возможно Со стороны виднее.
SII писал(а):
Цитата:
И про то, что мнемоника ассемблера CALL была у PDP-11 -- как синоним к этой JSR PC
А вот это уже прямая Ваша ошибка. Такой мнемоники ассемблера у PDP-11 не было -- была широко применявшаяся макрокоманда, которая превращалась в JSR PC. Исходники RSX-11M в качестве доказательста выкладывать, или так поверите?
Нет, спасибо, не надо, это слишком весомый аргумент Поверю и так. Тем более, что для написания программ исходники ОС не нужны.
Только вот начисто не могу припомнить, чтобы для применения CALL приходилось использовать какие-то файлы макроописаний, а разницы между наглухо встроенным макросом и мнемоникой не вижу. Не роясь в исходниках MACRO-11 их не отличить. Ну забыл так забыл... Хотя рановато
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Доброе время суток! вот макрос инициализации данных в ОЗУ:
Код:
; =========== ; Макрос инициализации == @0 - адрес, @1 - длина в байтах, @2 - значение для инициализации ; =========== .macro dataInit LDI ZL, Low(@0) ; загружаем адрес LDI ZH, High(@0) CLR R16 ; счетчик
LDI R17, @2 ;cycle_dataInit: ST Z+, R17 INC R16 CPI R16, @1 BRNE PC - 3
.endmacro ; ===========
собственно вопрос: на что можно заменить BRNE PC - 3? Слышал, что компилятор сам умеет создавать уникальные метки, но не нашёл как это делается. Спасибо за внимание!
_________________ Гальваническое сопротивление - это восстание батареек
А я пробовал просто как обычно писать любую метку в макросе. После расстановки нескольких макросов прога нормально работала. Но это дело не так недавно было.
Только начал изучать ассемблер и АВР. Ну и споткнулся на прерываниях таймера/счетчика1, всю голову уже сломал - не работает и всё тут. Подскажите пожалуйста, что не так? Программка мигает диодом по совпадения таймера1 с OCR1A
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб июл 30, 2011 20:54:15
Друг Кота
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19626 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Даже не знаю с чего начать... В АВРСтудии прогоняли?
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
по входу все хорошо, а вот обратно не хочет, т.е. когда второе прерывание срабатывает, соответственно за ним первое, но когда повторяешь действие выхода срабатывает, как вошел...
Это конечно на атмеге8, но хочется на тине85, но там всего одно внешнее прерывание... Подскажите, как собрать единицу или ноль с порта (in...?)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения