Да и область применения - абсолютно самостоятельно или в качестве комплектной единицы (да еще и чаще используемая).
До возможностей keil конечно далековато, однако вполне качественный материал.
интрига!AQ29 писал(а):С которым я сейчас разбираюсь - его нет в общем доступе. Пока нет.
так это, вроде бы, никакого отношения к ассемблеру не имеет - это имеет отношение к IDE или редактору кода.AQ29 писал(а):Современный сервис: свертки подпрограмм и условий, раскраска команд и переменных, подсказки и т.д.
согласно ваших критериев, хороший, просто отличный "ассемблер" называется... СиAQ29 писал(а):На мой взгляд, у хорошего ассемблера должно быть следующее.
это правильно: любой дурак сможет сначала узнать многое, а потом сделать лучше всего этого. настоящий гений сразу делает лучше всех, изначально не зная ничегоAQ29 писал(а):Разных ассемблеров не знаю, но
Всё это есть и с самого начала. Просто поймите что в ассемблере нет такого понятия как переменная - процессор и инструкции оперируют только адресами в памяти, только не говорите что в ассемблере нет директив распределения памяти по адресам и нет меток... биты вообще больное место - не всегда есть вообще аппаратная реализация побитового доступа, поэтому битовый доступ решается при помощи макросов в конкретных условиях конкретного проекта.1 Глобальные и локальные переменные (RON, SRAM, EEPROM, RVV, константы, биты). Локальные переменные видимостью модуля, процедуры или макроса. Размерность переменных – 8 байт.
Если ввести такие сущности в ассемблер... то это будут не более чем предопределённые макросы. Не проще ли просто подключить заранее заготовленный файл с этими макроопределениями? Ой, или его вам кто-то должен дать?2 Команды условий: If, While, Until.
попробуйте gnu-as, точнее avr-as - макросы практически те же, что и в masm или tasmAlexeyslav писал(а):чего не хватает в нынешнем ассемблере - так это более мощной и менее ограниченной системы макроподстановок.
Это, так сказать, "гвоздь не от той стенки". Ассемблер - это представление машинных команд конкретного процессора в символическом виде. В частности, для AVR ассемблер позволяет, например, вместо кода 0xE41A написать команду LDI R17,0x4A, что означает "загрузить в регистр R17 шестнадцатеричную константу 4A". И, соответственно, объекты, которыми может манипулировать программа не ассемблере - только те, которыми может манипулировать процессор. То есть, 32 условно-общих регистра, какое-то количество регистров-портов ввода-вывода, какое-то количество ячеек памяти (отдельно флеш-памяти, отдельно оперативки, отдельно NVRAM), и (почти) все. Переменные в этот список, увы, не входят. И вообще, переменная - это более высокий уровень абстракции, чем ассемблер.AQ29 писал(а):А что, существует какой-то запрет на применение переменных в ассемблере? Про такой запрет я, действительно, ничего не слышал.
Нет. Разговор следует вести на одном языке. Соответственно и слова надо употреблять правильно.Starichok51 писал(а):от названия суть не меняется.
нравится ему называть один бит переменной или весь регистр называть переменной - пусть называет ...
Ну, в общем-то, нормальные макроассемблеры во многом облегчают жизнь. Но не это АВР-овское убожество. Такое впечатление, что его авторы ни разу не видели нормального ассемблера. И вообще ничего не видели, кроме Паскаля на писюке. Один их набор символических наименований для битов в регистрах периферии чего стоит? Это какую такую траву надо курить, чтобы придумать метод набора двоичного числа в группу смежных бит одного регистра путем сдвигов нулей или единиц на обозначенное символически число бит? Я имею в виду конструкцию, вроде 0<<CS02 | 1<<CS01 | 1<<CS00 для прескалера таймера 0 вместо простого и понятного (допустим) T0prs64, которое в подключаемом по .Include файле было бы определено, как 0x03. Да даже для одиночных битов оно малополезно - команды SBI/CBI - единственные, для которых такие наименования имеют смысл, работают только с первыми тридцатью двумя портами I/O (00-1F), даже у самого первого AT90S1200 почти половина регистров I/O для этих команд недоступна.Starichok51 писал(а):я, вот, никогда не пользуюсь ни макросами, на какими-то подстановками (то есть, всякими костылями) - просто пишу на ассемблере, и горя не знаю.
Код: Выделить всё
LCD_FIELD 5,310,0,47Код: Выделить всё
; Макрос для установки поля вывода изображения на дисплей.
.MACRO LCD_FIELD
ldi R16 , 0x2b ; Column Address Set Координата X
rcall dspl_SEND_COM
ldi R16, high(@0) ; XS
ldi R17, low(@0)
ldi R18, high(@1) ; XE
ldi R19, low(@1)
rcall dspl_SEND_DATA_32
ldi R16 , 0x2a ; Row Address Set Координата Y
rcall dspl_SEND_COM ;
ldi R16, high(@2) ; YS
ldi R17, low(@2)
ldi R18, high(@3) ; YE
ldi R19, low(@3)
rcall dspl_SEND_DATA_32
ldi R16 , 0x2C ; RAMWR (2Ch): Memory Write
call dspl_SEND_COM
.ENDMACRO
и через ОЗУ тоже работал... И это было год назад.shonty писал(а):Посему в Вашем, shonty, случае лучше таки подпрограмма с передачей параметров через стек или блок регистров (массив в ОЗУ).
Код: Выделить всё
SPI_WAIT