Ассемблер (ASM) для AVR в вопросах и ответах
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Операнды здесь регистры, в регистр ah загружается значение регистра dh, т.е. после такой операции ah=dh.
-
Vendein_RaZoR
- Сверлит текстолит когтями
- Сообщения: 1158
- Зарегистрирован: Ср июн 22, 2011 21:14:17
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Упс , я с адресами спутал , забыл что 0 должен быть перед буквой 
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Даже, если перед dh поставить 0, то все равно значение 0dh загружается регистр ah, а не по адресу со смещением ah
Re: Ассемблер (ASM) для AVR в вопросах и ответах
коты, поясните по-хардкору. пытаюсь разобраться в языке ассемблера для AVR. читаю учебник Ревича, и есть там такой код:
push var_1 ;переменная var_1 в программе помещается в стек
push var_2 ;переменная var_2 в программе помещается в стек
rcall procedure ;вызывается процедура
pop var_2 ;после нее результат извлекается из стека
pop var_1 ;второй результат извлекается из стека
. . . . . .
procedure: ;в процедуре извлекается локальная
pop var_loc2 ;переменная var_loc2 со значением var_2
pop var_locl ;и переменная var_loc1 со значением var_1
. . . . . . . ;расчеты, расчеты...
push var_loc1 ;результат — в стек
push var_loc2 ;результат — в стек
ret ;возврат из процедуры
и я не догоняю, когда мы в процедуре первый раз извлекаем что-то из стека, почему это "что-то" равно var_2 ???? ведь последним в стек был занесён адрес следующей после rcall комманды, разве не так??
push var_1 ;переменная var_1 в программе помещается в стек
push var_2 ;переменная var_2 в программе помещается в стек
rcall procedure ;вызывается процедура
pop var_2 ;после нее результат извлекается из стека
pop var_1 ;второй результат извлекается из стека
. . . . . .
procedure: ;в процедуре извлекается локальная
pop var_loc2 ;переменная var_loc2 со значением var_2
pop var_locl ;и переменная var_loc1 со значением var_1
. . . . . . . ;расчеты, расчеты...
push var_loc1 ;результат — в стек
push var_loc2 ;результат — в стек
ret ;возврат из процедуры
и я не догоняю, когда мы в процедуре первый раз извлекаем что-то из стека, почему это "что-то" равно var_2 ???? ведь последним в стек был занесён адрес следующей после rcall комманды, разве не так??
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Стек, по сути, похож на обойму пистолета. Который патрон последним засунул, тот первым и достанешь.
Хотя они разные бывают... FIFO (First In, First Out), LIFO (Last In, First Out) - тут именно он
Хотя они разные бывают... FIFO (First In, First Out), LIFO (Last In, First Out) - тут именно он
Re: Ассемблер (ASM) для AVR в вопросах и ответах
да да, я вкурсе
"первый вошёл-- последний вышел"
вы не поняли моего вопроса. в указаном примере, последним в стеке оказался адрес следующей после rcall комманды, мы же не только переменные храним в стеке, но и адреса для счётчика программ, дабы организовать возможность возврата из подпрограмм. но как МК различает где адреса, а где переменные в стеке это мне решительно не понятно!
"первый вошёл-- последний вышел"
вы не поняли моего вопроса. в указаном примере, последним в стеке оказался адрес следующей после rcall комманды, мы же не только переменные храним в стеке, но и адреса для счётчика программ, дабы организовать возможность возврата из подпрограмм. но как МК различает где адреса, а где переменные в стеке это мне решительно не понятно!
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Оно и правда не равно, там первым будет адрес возврата... он наверняка сохраняется где-то еще до того как вызывается первый POP... или этот код дан только для того чтобы понять суть. Примеры не обязаны быть безошибочными.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Alexeyslav писал(а):Оно и правда не равно, там первым будет адрес возврата... он наверняка сохраняется где-то еще до того как вызывается первый POP... или этот код дан только для того чтобы понять суть. Примеры не обязаны быть безошибочными.
самое интересное, что автор пишет: "Механизм организации локальных переменных с помощью стека иллюстрирует листинг 13.2 (он в точности такой же, как это происходит при компиляции в "настоящих" языках программирования)." и затем приводит этот код.
а, вообще, Юрий Всеволодович как учитель великолепен-- я третий день его книжку читаю, а уже успел семисегментник закрутить сам на асме
так значит в примере ошибка??
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Смотря с какой стороны на эту "ошибку" смотреть... с точки зрения практики - ошибка имеется, и довольно грубая... (интересно куда выкинет инструкция RET после всех этих манипуляций) но для иллюстрации - то что надо. Именно приведенный Вами код ошибок не содержит! Все зависит от содержимого подпрограммы, может оно так умело жонглирует стеком, что адрес возврата аккуратненько поднимается и затем ложится на место. Это может быть определено директивой или в виде макроса, который скрыт от глаз а в коде процедуры в начале и в конце всего одна строчка которая делает всю "грязную" работу.
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Если перед ним написано «вот пример для некоторого воображамеого процессора», то ошибки нет.
По умолчанию в книге по AVR все примеры для AVR, и тогда тут ошибки.
Были бы макросы/директивы, они были бы приведены.
Вот если бы я в теме про квадратный корень из 32-битных чисел на асме AVR привёл пример:
Что бы мне сказали форумчане? Я бы не отмазался тем, что это у меня такие макросы и для иллюстрации я всё классно написал 
А ответственность книгописателя (должна быть) повыше, чем нафорумеписателя.
По умолчанию в книге по AVR все примеры для AVR, и тогда тут ошибки.
Были бы макросы/директивы, они были бы приведены.
Вот если бы я в теме про квадратный корень из 32-битных чисел на асме AVR привёл пример:
Код: Выделить всё
ldq R47, var1
sqrt R47
stq R47, var2А ответственность книгописателя (должна быть) повыше, чем нафорумеписателя.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Для приема/передачи параметров через стек можно таким путем :
subor:
push ZL
push ZH
in ZL,SPL
in ZH,SPH
ldd tmp1,z+5
ldd tmp2,z+6
; тут обработка
std z+6,tmp2
std z+5,tmp1
pop ZH
pop ZL
ret
Регистры tmp1,tmp2 само собой, портятся. Если это нежелательно, их надо сохранять в стеке тоже, при этом смещения в z+? будут, конечно, другие. Но, как видим, геморра много, потому передача через стек, я думаю, не самая эффективная в данном случае. Я предпочитаю для таких целей держать свободный указатель и через него адресую нужные параметры.
А книгописателю ( в отличие от нас ) за енто деньги плотють, и если по его творениям что-нить сгорит, по репе настучать могут
subor:
push ZL
push ZH
in ZL,SPL
in ZH,SPH
ldd tmp1,z+5
ldd tmp2,z+6
; тут обработка
std z+6,tmp2
std z+5,tmp1
pop ZH
pop ZL
ret
Регистры tmp1,tmp2 само собой, портятся. Если это нежелательно, их надо сохранять в стеке тоже, при этом смещения в z+? будут, конечно, другие. Но, как видим, геморра много, потому передача через стек, я думаю, не самая эффективная в данном случае. Я предпочитаю для таких целей держать свободный указатель и через него адресую нужные параметры.
А книгописателю ( в отличие от нас ) за енто деньги плотють, и если по его творениям что-нить сгорит, по репе настучать могут
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А вообще..... зачем параметры передают через стек? Я не первое десятилетие асму юзаю, никогда так не делал..... Чтоли только если памяти основной не хватает? Или еще причины есть какие.....?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Код: Выделить всё
retНапример такая команда , может запросто перенаправить программу по совершенно иному руслу при этом не вызвав коллизий всей программы . И кстати иногда способствует сохранению большого куска FLASH - например в подпрограммах MENU. И вот тут то и используют стек.
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Ассемблер (ASM) для AVR в вопросах и ответах
.. причины бывают разные - например связь с С-программой. Стек удобен тем что нет привязки к регистрам ( кроме sp конечноshads писал(а):А вообще..... зачем параметры передают через стек?
ЗЫ. самое главное не забыть восстановить вершину стека при выходе из процедуры, иначе "сюрпризы" обеспечены
-
juzik
- Встал на лапы
- Сообщения: 128
- Зарегистрирован: Пт сен 23, 2011 23:49:20
- Откуда: Симферополь, Украина
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ploop писал(а):Хотя они разные бывают... FIFO (First In, First Out), LIFO (Last In, First Out) - тут именно он
FIFO - это очередь (как в магазин за хлебом), не стэк
LIFO - это стэк
- КотЭ Мужчина
- Открыл глаза
- Сообщения: 64
- Зарегистрирован: Ср июн 20, 2012 10:49:46
- Откуда: Україна, Черкаська область
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Здравствуйте, вопрос есть. Как в асме зделать задержку то есть как написать мигалку на светоидиотах? Какие команды использовать и в каком порядке? Данке.
Betelgeuse
Re: Ассемблер (ASM) для AVR в вопросах и ответах
да вообщем как угодно - хош программными средствами, хош аппаратными, а то и то и другое вместе...
вообще-то под конкретную схемку и задачу делается проще
вообще-то под конкретную схемку и задачу делается проще

- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
BOB51 хотел сказать либо выполнением холостых команд в цикле, либо используя железный таймер(предварительно настроив его), либо все в куче.
Docendo discimus
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Железная мигалка попроще будет
- Вложения
-
- мигалка.JPG
- (87.61 КБ) 375 скачиваний
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Деталей у нее много...