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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

shads писал(а):Так если прерывание по сравнению, то там ошибка и не накапливается, зачем передвигать точку сравнения?
Уже объяснили, но повторю:
Если мы не будем сдвигать точку сравнения, то получим прерывание с тем же периодом, что и переполнение, просто сдвинутое по фазе. Иногда это и нужно, а инода удобно сделать импульсы тактирования чего-то ШИМ-ом, а по переполнению и по сравнению в прерываниях делать что-то сразу после соответствующих перепадов тактового сигнала.
В случае же с передвиганием точки сравнения мы получаем независимую сетку прерываний с частотой выше частоты переполнения и, в общем случае, асинхронную с ней. Для уменьшения писанины пусть нам не 9600 нужно было а 2400, так что добавляем по 48. Имеем прерывания в точках
0, 48, 96, 144, 192, 240, (тут проскочит прерывание переполнения), 32, 80, 128, 176, ...
shads писал(а):Да вообщета для обмена по радиоканалу я не использую UART, использую свой обработчик на основе манчестера.
Несущественно. С манчестером на передачу удобно использовать модуль сравнения с аппаратным управлением ножкой в режиме инвертирования «toggle on compare». В зависимости от значения текущего бита и стадии его передачи, опять таки, смещаем OCR та величину в половину длительности бита или в полную. Следующее сравнение перекинет ножку и даст новое прерывание. В нём опять сдвинем OCR. При этом прерывания могут быть задержаны на время почти в половину длительности бита, но сам выходной сигнал манчестера будет идеальным, так как сформируется аппаратно. Хаотическая задержка прерывания на время до полубита ничего не испортит.

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

____----________--------____----____-  это выходной сигнал (аппаратно)
__-___-_______-_______-___-___-___-__  аж тут может производиться обработка прерывания
Приём можно взять на input compare и брать разность текущего значения регистра ICR с предыдущим, по ней вычислять длительность импульса и решать, что пришло и как это интерпретировать. Прерывание по переполнению при этом служит защитным интервалом, если прошло два переполнения, но ничего не было по input compare, значит, сигнал пропал / закончился. Занятость процессора — «дулі відсотка». Написать/отладить — гораздо быстрее, так как меньше завязок на все остальное.
Одно в таком решении плохо — исчезает повод для гордости «во как я всё потактово рассчитал». И еще могут обвинить в том, что проект сделан «как попало» (раз не сидел, такты команд не подсчитывал).
shads писал(а):Да если надо будет то распихаю по разным, пока в этом проблемы нет. Вопрос, в том как в программе на С вставить ассемблерный блок, в частности обработчик прерываний.
...
А можно на С рарезервировать некоторые регистры контроллера, чтобы С их не использовал, обозвать эти регистры именами, и использовать из С и из Асма эти регистры совместно? Тогда основная прога будет на С, а к ней просто прилепить файл обработки прерываний написанный на Асме.....
Работу на асме, более длинную, чем десяток команд, в любом случае лучше не асм-вставкой в С делать, а отдельным асм-файлом. Регистры можно, причём и без асма, вручную разместить ключевые переменные. Смотреть в документацию на компилятор. Но, как уже писали, далеко не всегда это удобно (avr-gcc, например, для такой цели отдаёт только от R2 до R9), да не всегда и нужно.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Реклама
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Леонид Иванович писал(а):Советую плюнуть - и всё. Смириться, как получается в Си, так и пойдет.
Если 1 или 2 кГц, как у вас, то конечно нормально. Ну а 10 кГц, как у меня..... тем более у меня в этом прерывании организованы микросекундные задержки для 1wire. В обчем, пробовать надо.....
Леонид Иванович писал(а):Для 1-Wire зачем прерывание 10 кГц
1wire.gif
(30.25 КБ) 602 скачивания
Такое решение удобно тем что не надо запрещать прерывания, с вытекающими отсюда плюсами.
Леонид Иванович писал(а):Радиообмен не делал, но для него использовал бы UART
UART для радиообмена не очень подходит, лучше использовать протокол с синхронизированием каждого бита, например с фазовой модуляцией или с частотной модуляцией. По крайней мере такие протоколы везде применяются, хоть в радиопередаче, хоть у ИК пультов.
Леонид Иванович писал(а):это проще, чем ковыряться в ассемблере.
Ну это скорее дело привычки, мне например удовольствие доставляет. Я бы не назвал это ковырянием. Тем более обычно один раз задачу решил и все, потом три сек ее вставить в новый проект. (мож у меня так из-за того что другого не знаю пока)
Реклама
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

avreal писал(а):Если мы не будем сдвигать точку сравнения, то получим прерывание с тем же периодом, что и переполнение.
Дык для этого есть режим таймера\счетчика «прерывание и сброс счетчика при совпадении», не надо ничего перезаписывать…..
avreal писал(а): лучше не асм-вставкой в С делать, а отдельным асм-файлом.
Вот вот именно такой вариант интересует. Где бы примерчик или наводку для AVRStudio надыбать. Ато я даже не знаю с какой стороны к этому вопросу подходить…..
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Не, ну работать сегодня вообще не прёт...
shads писал(а):Такое решение удобно тем что не надо запрещать прерывания, с вытекающими отсюда плюсами
Исходник 30-килобайтной картинкой вместо текстового файла — это такая типа защита ноухау? Так кому лень думать, тот и из картинки выковыряет, остальным просто неудобство. Вот только по соседству обсуждали.
Если уж пишете на ассемблере, то вместо 4 команд

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

	sec
	sbis	WirePIN, WireBIT
	clc
	ror	WireDtIn
можно три

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

	lsr	WireDtIn
	sbic	WirePIN, WireBIT
	ori	WireDtIn, 0x80
Если очень важно, чтобы WireDtIn был нижним регистром (хотя если подэкономить в другимх местах, то, глядишь, и место найдётся), то можно так:

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

	ldi	a, 15
WData5:	subi	a, 1
	brne	WData5
	; После задержки тут C гарантированно обнулён
	sbic	WirePIN, WireBIT
	sec
	ror	WireDtIn
Ишшо раз: я очень многие другие практически не пишем на ассемблере не потому, что его не знаем...
Нет, ну исходник гифкой — это таки свинство.


И вообще можно было под WireDtOt и WireDtIn выделить один регистр, WireDtIO, из которого передавать и в который сразу принимать (правда, у Вас сохраняется значение WireDtOt, если это для того, чтобы при последовательном приёме не писать туда каждый раз 0xFF, то пожалуй лучше таки в один регистр и каждый раз писать).

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

	sec
	sbrs	WireDtOt, 0
	clc
	ror	WireDtOt
	brcc WData4
	cbi	WireDDR, WireBit
WData4:
	ldi	a, 15
WData5:	dec	a
	brne	WData5
	
	sec
	sbis	WirePIN, WireBIT
	clc
	ror	WireDtIn
Заменяется на

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

	sbrс	WireDtIO, 0
	cbi	WireDDR, WireBit
WData4:
	ldi	a, 15		; ну тут подкорректировать время
WData5:	dec	a
	brne	WData5
	
	lsr	WireDtIO
	sbic	WirePIN, WireBIT
	ori	WireDtIO, 0x80
8 байт кода и один регистр сэкономили.
А если тут сказать «да подумаешь», то почему тогда и не на С?
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

shads писал(а):Дык для этого есть режим таймера\счетчика «прерывание и сброс счетчика при совпадении», не надо ничего перезаписывать…..
Тогда Вы таймер займёте весь для одной задачи. Например, только приёма или только передачи по soft-UART. Ну или наворачивать всё в одно прерывание, в чём я вижу мало радости.
Остальная часть аппаратуры таймера будет зря простаивать, работу, которую на неё можно было бы возложить — будет выполняться программно.
А если таймер будет free-running, то его переполнения (редкие, 450 герц) будут для динамической индикации (и идут всегда).
Прерывания по OCR0A / OCR0B для независимых передачи и приёма (и идут только тогда, когда действительно нужны).
Все независимые, в каждом прерывании только то, что надо. Не нужно в быстром прерывании доделивать до частоты динамической индикации и из-за этого гнать его всегда.
shads писал(а):Где бы примерчик или наводку для AVRStudio надыбать. Ато я даже не знаю с какой стороны к этому вопросу подходить…..
Где-то в окрестностях WinAVR\doc\avr-libc\examples должен быть пример asmdemo и где-то в WinAVR\doc\avr-libc\avr-libc-user-manual файл group__asmdemo.html
Как отправная точка должен пойти.
Последний раз редактировалось avreal Ср июл 11, 2012 15:26:04, всего редактировалось 1 раз.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Реклама
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

avreal писал(а):Исходник 30-килобайтной картинкой вместо текстового файла — это такая типа защита ноухау?
Не, ну зачем людям сразу дурные мотивы приписывать..... да еще свиньей обзывать неразобравшись. Скинул так тока ради удобочитаемости, там цвет сохранен, отступы красивые, приятнее анализировать, чем в корявом одноцветном блоке CODE. Неужеш вы меня таким тупым считаете, что я таким образом пытаюсь чегото там дать и недать..... Ну ладно, я не обижаюсь.....
avreal писал(а):Если уж пишете на ассемблере, то вместо 4 команд...........
Вообще то я не просил совета в оптимизации, а показал пример моей реализации 1Wire в прерывании.
Удивитесь наверное но я тока год как на AVR светодиодом помигал..... какая речь может быть об оптимальном коде. Раньше кодил на другом семействе. За ваши замечания спасибо конечно, но я писал исходя из своего уровня познаний и так как мне удобно. Постепенно думаю узнаю многие подобные тонкости......
Реклама
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

shads писал(а):Не, ну зачем людям сразу дурные мотивы приписывать..... да еще свиньей обзывать неразобравшись. Скинул так тока ради удобочитаемости
Ну, вообще-то, только один поступок обозван свинством, а не весь человек :-)
Я просто в упор не понял мотив. Для меня необходимость открыть фрагмент кода как картинку, иметь зависимость качества текста от масштаба (у каждого свой монитор и свои глаза, для текста в браузере свои настройки стоят, у меня с картинкой вышло не слишком удобно — при «родном» для картинки разрешении текст слишком крупный, я вижу гораздо мельче, а можно было бы больше строк уместить, а при масштабировании оно ж в размытость ушло, это ж картинка) плюс невозможность скопировать и подредактировать фрагмент — большое неудобство. А цвета... Ну оно может и хорошо, но далеко не главное.
shads писал(а):какая речь может быть об оптимальном коде.
Ну так было ж написано:
shads писал(а):там я вылизываю процедуры до байтов
я и показал где ещё лизнуть :)))
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

shads писал(а):Такое решение удобно тем что не надо запрещать прерывания, с вытекающими отсюда плюсами.
Вручную запрещать не надо, но они у Вас все равно автоматически запрещены на длительность всего слота, раз код находится в обработчике прерывания и слот формируется обычными циклами-задержками. Ваша реализация не выдерживает временные интервалы согласно спецификации 1-Wire. К тому же, при желании поменять тактовую, нужно будет менять множество разбросанных по всему тексту констант. Я ведь не запрещаю прерывания на время всего обмена по 1-Wire, а только на мимально-необходимое время, которое около 60 мкс. Ну а потом из "кирпичиков" TReset и TByte (а можно и TBit) в основной программе строю нужную последовательность обмена. Если это критично, на одном витке менеджера задач выполняется только одна функция.

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

//--------------- Запись/чтение бита по однопроводной шине: ------------------

bool TBit(bool b)
{
  char si;
  si = __save_interrupt();
  __disable_interrupt();       //запрещение прерываний
  Port_OWP_0;
  Port_OWP_OUT;                //OWP <- 0
  Delay_us(2);                 //delay 2 uS
  if(b) Port_OWP_IN;           //bit = 1, OWP <- 1
  Delay_us(13);                //delay 13 uS
  bool owp = Pin_OWP;          //чтение порта
  Delay_us(45);                //delay 45 uS
  Port_OWP_1;                  //force pullup
  Port_OWP_OUT;
  __restore_interrupt(si);     //восстанавление прерываний
  Delay_us(2);                 //delay 2 uS
  return(owp);
}
Что касается Си, так я не только плюнул на все преимущества в объеме и скорости, которые дает ассемблер, но и в самом Си пишу так, чтобы программа была как можно наглядней. При этом она становится еще медленней и больше. Например, никаких глобальных переменных, все данные спрятаны внутри модулей, все обращения к ним - только через функции. Чтобы не расширять области видимости функций, иногда вызов идет через цепочку функций-оберток. Это большой оверхед. Но зато количество ошибок в программах удалось свести к минимуму, основные части программы отладки вообще не требуют. Отладка остается там, где не всё понятно, что мы от программы хотим. А раньше я тоже писал только на asm, на Си смотрел, как на изврат. Готов был спорить до бесконечности, отстаивая asm. А теперь в огромных количествах растранжириваю ресурсы, зато не надо напрягаться по каждой ерунде, можно сконцентрироваться на главном.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

один из нетрадиционных методов работы с DS1820 раз уж про нее речь зашла здесь.
Писалось давно , всего сам не помню. Используется буфер (который можно резать как угодно) изначально вводились почти все команды для DS , проверка готовности данных - что сокращает время ожидания конвертации. Нет формирования тайм слотов, их формирует USART. Не очень оптимизировалось
Вложения
DS18B20.rar
(4.47 КБ) 218 скачиваний
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

ILYAUL писал(а):один из нетрадиционных методов работы с DS1820
Использование UART для реализации шины 1-Wire было давным-давно описано в Application Note 74 от Dallas. Я так делал на PC, например, здесь: http://digit-el.com/files/open/ds18x20/ds18x20.html На микроконтроллерах так тоже можно делать, но обычно UART-а жалко.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Мне больше понравилось ATMEL-овское описание сего процесса.( Сейчас не тот комп в руках-из дома выложу) Ну и конечно так можно поступить , если USART-у больше делать нечего. Привлекла- то идея кольцевого буфера , с возможностью добавлять или убирать команды , просто добавляя их в буфер или убирая их из него ну и прерывания естественно.
Просто как то я не встречал таких решений на просторах инета , так же часто как ногодрыганье и delays- поэтому и не традиционно.
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

ILYAUL писал(а):Мне больше понравилось ATMEL-овское описание сего процесса.
Это? http://www.atmel.com/Images/doc2579.pdf
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Про UART (который сам просится, раз не нужен для радио) и про таймер (ШИМ на передачу, меняем длительность импульса, вход захвата на приём, смотрим, когда поднялось) я начал писать, но потом стёр. Счёл несколько неравным сравнением в данной теме, так как они требуют две ноги и внешних компонентов. А у производителя на тему UART апноты и так есть.

Если сравнивать «одноногие» реализации с 10-килогерцовым прерыванием и в фоне с запретом прерываний на время бита, то второе, на мой взгляд, лучше. Общее время запрещённых прерываний, что мешает другим, можно сделать ниже, возможность другим прерываниям «раздвигать» биты тоже может быть полезна. В случае (асмовой) реализации с привязкой регистров ещё и уменьшается количество зарезервированных регистров.
Если система не нагружена, то быстродействие (килобиты в секунду) фонового варианта не будeт хуже варианта с прерываниями. Если ситема нагружена, тем же радиоканалом, то работа с 1-Wire в прерываниях будет больше мешать.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Леонид Иванович писал(а):
Это?
Да. По ней в принципе и писал

Уважаемый avreal. Не хочется спорить по данному поводу. Вы и я прекрасно представляем , что в определённых условиях и расставленных программой приоритетов можно просто проигнорировать любое прерывание , отметив , что оно произошло и вернутся к нему позже или просто "забыть".Приведённый код , это не лучший пример работы с прерываниями , но для того проекта он вполне меня устраивал. Конечно нужно сесть и переделать, но что-то лениво как-то. Наверно это чувство знакомо каждому. :))
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Вообще-то я писал не об UART-реализации.
Сравнивал чисто программный ногодрыг либо в фоне с запретом прерываний, либо он же в таймерном прерывании 10 кГц.
ILYAUL писал(а):Конечно нужно сесть и переделать, но что-то лениво как-то. Наверно это чувство знакомо каждому. :))
«Ой, и не говорите»™ Иногда утром в зеркало так стыдно смотреть :-)
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Леонид Иванович писал(а):Что касается Си, так я не только плюнул на все преимущества в объеме и скорости, которые дает ассемблер, но и в самом Си пишу так, чтобы программа была как можно наглядней. При этом она становится еще медленней и больше.
Ну в обчем - понятно - куда надо двигаться. Ну его всякие гибриды, типа С+АСМ, буду пробовать чисто на С.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

А лучше HAL - на ассемблере, а остальную часть на паскале.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Леонид Иванович писал(а):Ваша реализация не выдерживает временные интервалы согласно спецификации 1-Wire.
А где именно не выдерживается? Я рассчитывал задержки вот так:
1wire характеристики сигнала.gif
(53.16 КБ) 305 скачиваний
Леонид Иванович писал(а):Я ведь не запрещаю прерывания на время всего обмена по 1-Wire, а только на мимально-необходимое время, которое около 60 мкс.
Хотел я по вашему примерчику, обработку 1Wire, на С замутить, но потом подумал вот о чем. Для обмена байтами, в принципе эти 60 мкс, погоды не делают для динамической индикации, а вот когда сброс линии происходит, там уже задержка ок 600 мкс, т.е. для времени индикации одного разряда, задержка уже ощутима. Как тут быть? У меня сброс происходит в прерывании в фоне, и никак не влияет на другие процессы, а в случае формирования сброса с помощью задержки, будут видны колебания яркости разрядов, т.к. прерывания тоже запрещены. Или просто с этим смириться?

Если что отвечайте в теме "Всё по DS18(B/S)20." ато здесь съехали малость в сторону. Я там продублирую вопрос про сброс.
Vendein_RaZoR
Сверлит текстолит когтями
Сообщения: 1158
Зарегистрирован: Ср июн 22, 2011 21:14:17
Контактная информация:

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

Сообщение Vendein_RaZoR »

Изучаю самостоятельно ассемблер и мало что понимаю :shock:
До этого программировал на Си и Паскале немного было , а теперь вообще непривычно как то

В общем первый пример из моей книги - это перевод процессора в защищенный режим (под DOS) :

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

ORG 100h

start:
mov ax,3
int 10h

in al,92h
or al,2
out 92h,al

xor eax,eax
mov ax,cs
shl eax,4
add eax,PROTECTED_MODE_ENTRY_POINT
mov [ENTRY_OFF],eax

xor eax,eax
mov ax,cs
shl eax,4
add ax,GDT

mov dword[GDTR+2],eax

lgdt fword[GDTR]

cli

in al,70h
or al,80h
out 70h,al

xor eax,eax
mov eax,1
mov cr0,eax

db 66h
db 0EAh

ENTRY_OFF dd PROTECTED_MODE_ENTRY_POINT

dw 00001000b

GDT:
NULL_descr db 8 dup(0)
CODE_descr db 0FFh,0FFh,00h,00h,00h,10011010b,11001111b,00h
DATA_descr db 0FFh,0FFh,00h,00h,00h,10010010b,11001111b,00h
VIDEO_descr db  0FFh,0FFh,00h,80h,0Bh,10010010b,01000000b,00h
GDT_size equ $-GDT

label GDTR fword
dw GDT_size-1
dd ?

use32

PROTECTED_MODE_ENTRY_POINT: mov ax,00010000b

mov bx,ds
mov ds,ax
mov ax,00011000b
mov es,ax
xor esi,esi
mov si,bx
shl esi,4
add esi,message
xor edi,edi
mov ecx,26

rep movsb
jmp $
message db 'H',07h,'e',07h,'l',07h,'l',07h,'o',07h,' ',07h, 'W',07h,'o',07h,'r',07h,'l',07h,'d',07h,'!',09h,0
Всё таки объясните по-подробнее почему нельзя объявлять метки и данные в начале программы например как объявляются переменные или функции в других языках таких как Си напрмер ?
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

в ассемблере нет понятия переменной, есть только регистры и ячейки памяти.

Метки нельзя объявлять заранее - они объявляются по месту использования, и представляют собой адреса мест в программе ни больше ни меньше. Верней даже не программе а в сегменте. в сегменте кода - это будет адрес следующей команды, в сегменте данных - адрес ячейки памяти.

В начале программы можно объявить только константы. Чаще всего это предопределенные адреса ячеек памяти, которые используются наравне с метками.
Ответить

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