Прошу прощения, можно за комментировать

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Masredis
Родился
Сообщения: 12
Зарегистрирован: Пн май 02, 2011 23:13:32

Re: Прошу прощения, можно за комментировать

Сообщение Masredis »

Нет :) есть еще немного ,то что не впихнул, так как смысла просто не видел :roll: если с одним помогут разобраться то там так же
Реклама
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Прошу прощения, можно за комментировать

Сообщение SubDia »

Ясно. Ну в том куске, о котором спрашивалось выше, все просто.

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

PUSH R16 ;задвигаем содержимое R16 в стек
   LDI R16,50 ;записываем в R16 число
    V4:
   RCALL w20ms ;относительный вызов подпрограммы w20ms
   DEC R16 ;уменьшаем R16
   BRNE V4 ;условный относительный переход, "сравнение" R16 с нулем
   POP R16 ;вытаскиваем из стека содержимое R16 взад
Короче говоря, подпрограмма небольшой задержки. Правда, неясно - чего творит подпрограмма w20ms (но я подозреваю, что ее название расшифровывается как wait 20 ms :) ). BRNE - команда проверки бита нулевого значения в регистре статуса (если "0" - переход).
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Реклама
Masredis
Родился
Сообщения: 12
Зарегистрирован: Пн май 02, 2011 23:13:32

Re: Прошу прощения, можно за комментировать

Сообщение Masredis »

Спасибо большое :) :love: Я чуток попожже попробую написать оставшиеся и скинуть то что закоментировал, просмотрите и надеюсь скажите как вышло) щас сижу с книгой сижу и читаю что и как, все же ассемблер не мой язык :cry:
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6321
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Прошу прощения, можно за комментировать

Сообщение Jack_A »

SubDia писал(а): Короче говоря, подпрограмма небольшой задержки.
Точнее, задержки в 1 с путем 50-кратного повторения подпрограммы 20-мс задержки.
Реклама
Эиком - электронные компоненты и радиодетали
Masredis
Родился
Сообщения: 12
Зарегистрирован: Пн май 02, 2011 23:13:32

Сообщение Masredis »

извиняюсь )
POP R16
куда содержимое из стека помещается ? в какой именно зад :write:
Реклама
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Прошу прощения, можно за комментировать

Сообщение SubDia »

Оу, прошу прощения - в моем предыдущем посте ошибка вот здесь:
BRNE - команда проверки бита нулевого значения в регистре статуса (если "0" - переход).
Я имел в виду если не ноль, то переход.
а BREQ что в моем случае делае больше ничего не делает и какие числа он сравнивает ?
А breq - обратная команда (branch if equal). В коде я ее увидел в одном месте, вот здесь:

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

IN R17, pinc ;
   
   ANDI R17, 0x02                 
   BREQ led  
Командой IN записываем состояние порта С в регистр R17. Командой ANDI выполняем операцию логического И содержимого регистра R17 с числом 0x02(0b00000010) - в результате, если в регистре R17 в единицу установлен первый бит (я начинаю отсчет с нуля, такова привычка), то он и останется установленным, а если в R17 - нули, то результатом R17&&0x02 будет абсолютный ноль. Далее командой BREQ осуществляется условный относительный переход по метке, если число 0x02 и содержимое регистра R17 равны между собой. Очевидно, к выводу 1 порта С подключена или кнопка или еще какая другая хрень, способная давать высокий уровень. Переход - по нажатию кнопки (или любому другому условию, создающему высокий уровень на первой ноге порта).
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Реклама
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re:

Сообщение SubDia »

Masredis писал(а):извиняюсь )
POP R16
куда содержимое из стека помещается ? в какой именно зад :write:
Ну вот, писал-писал сообщение, а Вы вопрос изменили. :))
Стек вообще используется для хранения временных данных. Вы видите, что перед началом работы с подпрограммой V4 мы записали содержимое R16 в стек, дабы можно было поработать с регистром? После окончания работы с R16 нам нужно вернуть его содержимое назад из стека, дабы вернуться из подпрограммы wls с неизменным содержимым R16 (не смотрел, что там такое важное в нем сидит, но не суть - это зачем-то нужно, значит нужно). Вот командой POP мы и записываем сохраненные ранее в стеке данные обратно в R16. Все просто.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Прошу прощения, можно за комментировать

Сообщение avreal »

testerplus писал(а):PUSH - Команда применяется для нажима на регистр (например PUSH R16 - нажать на регистр r16)
RCALL - relative subroutine call - позвать родственную подпрограмму
DEC - (от decimal) первести регистр в десятичную систему (и почему там decrement в коментарии?)
POP - это не знаю, никогда не пользовался
Блеск! :)))

А что касается POP -- так, сразу видно, Вы всё с новенькими процессорами работаете...
А вот если бы с изношенными, потрёпанными пришлось иметь дело, то знали бы, что регистры иногда западают, после нажатия назад сами не возвращаются.
Их тогда назад через дырочку палочкой такой аккуратно выталкивают. Я у знакомого скульптора выпросил. "Стек" называется.

Те, кто с очень потрёпанными процессорами работают, так вообще уверены, что основное правило работы со стеком -- на каждый PUSH обязательно делать POP.

Раньше встречались процессоры, у которых в комплекте стека не было (да хоть бы HP2100, М6000, СОУ-1). Впрочем, у них регистры и не нажимались...

Сейчас, кажется, все им комплектуются. Чтобы спички, скрепки там всякие не совали.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: Прошу прощения, можно за комментировать

Сообщение testerplus »

avreal писал(а):А что касается POP -- так, сразу видно, Вы всё с новенькими процессорами работаете...
Ничего они не новенькие, просто я стираю "Лаской".
Те, кто с очень потрёпанными процессорами работают, так вообще уверены, что основное правило работы со стеком -- на каждый PUSH обязательно делать POP.
Даже тем, кто работают с потрепанными процессорами, никогда не поздно узнать, что это не так. Навскидку два примера:
1. Вызов подпрограммы по указателю во многих МК делается связкой PUSH/RETURN (так же в некоторых МК текущий адрес можно получить только связкой CALL/POP)
2. Ваш любимый WinAVR готовит место под локальные переменные (если их немного) не только PUSH'ем, но и CALL'ом, а обратно все делает POP'ами.

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

Re: Прошу прощения, можно за комментировать

Сообщение avreal »

Если учесть то, что RETURN -- это сокращение (причём часто даже _софтовое_ сокращение, как встроенный в ассемблер синоним для RTS PC) для того, что де-факто есть POP-ом, а CALL ADDR (где есть стек) -- это сокращение для PUSH PC / LOAD PC, ADDR (ну хорошо, у JSR Ri, ADDR немного сложнее)...
Если это всё учесть, то PUSH и POP входит в состав всех этих команд и должно соблюдаться общее их количество.
Ну вносил я полные бутылки в "дипломате", а выносил в мешках с мусором, а некоторые в руках вносил, а какие-то в руках выносил... Главное, что соблюдается соответствие количества полных и пустых.
А то, что там где-то по дороге ещё что-то кому-то присваивается, стеку безразлично.

Так я в макрос заверну PUSH-и, а соответствующие POP-ы вручную напишу и заявлю, что ничего не должно соблюдаться. Хорошо, не в макросы в чистом виде, а как параллакс с асмом для PIC когда-то сделал. Вкомпилирую свои команды в ассемблер.

Ну а в паре branch-and-link / branch по link-решистру push/pop-ов и нет. Хотя они типа call и типа return.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Прошу прощения, можно за комментировать

Сообщение pyzhman »

Вы чего спорите-то? Железное оно и есть железное, деревянное - деревянное. Я в ауте. Вот столкнулись.
Docendo discimus
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Прошу прощения, можно за комментировать

Сообщение SubDia »

pyzh_man писал(а):Вы чего спорите-то? Железное оно и есть железное, деревянное - деревянное. Я в ауте. Вот столкнулись.
А сегодня "спорный" день. Я вот с коллегой только что тоже злобно спорил в курилке (правда, о программной реализации интерфейса USB). :))
сразу видно, Вы всё с новенькими процессорами работаете...
А вот если бы с изношенными, потрёпанными пришлось иметь дело
Ну конечно же, я работаю с новенькими. Нет, давайте еще 580-й процессор вспомним. А потом как в мультике про Масяню: "дык я так в советские времена так ооо!" -"А я так в советские времена так ууу.."
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Прошу прощения, можно за комментировать

Сообщение avreal »

SubDia писал(а):Ну конечно же, я работаю с новенькими. Нет, давайте еще 580-й процессор вспомним.
Тьху ты, не про это ж речь.
Хотел было сказать, что у новенького 580-го регистры не западали, но одумался, всякое бывало :)))
Имелась ввиду не новизна модели, а потрёпанность экземпляра :)))
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: Прошу прощения, можно за комментировать

Сообщение testerplus »

avreal писал(а):Если учесть то, что RETURN -- это сокращение
Только там, где PC отбражается в РОН (ARM, MSP). А Вы вообще PDP-11 вспомнили. Так что далеко не везде RET является псевдокомандой (и особенно в обсуждаемом AVR)
avreal писал(а):CALL ADDR (где есть стек) -- это сокращение для PUSH PC / LOAD PC, ADDR
Мы говорим о мнемониках или о действиях ядра? Никакое CALL не сокращение (если только какой-то совсем специфический потрепанный камень не вспомнить).
avreal писал(а):Ну а в паре branch-and-link / branch по link-решистру push/pop-ов и нет
Я и говорю: не путайте баланс стека с балансом использования мнемоник PUSH/POP (даже в виде псевдокоманд)
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Прошу прощения, можно за комментировать

Сообщение SubDia »

avreal писал(а):Имелась ввиду не новизна модели, а потрёпанность экземпляра :)))
Ах, вот оно че. :))
Тогды ой и мои глубочайшие извинения. =)
(А тема промеж тем расширила границы обсуждений :))
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Прошу прощения, можно за комментировать

Сообщение avreal »

testerplus писал(а):
avreal писал(а):CALL ADDR (где есть стек) -- это сокращение для PUSH PC / LOAD PC, ADDR
Мы говорим о мнемониках или о действиях ядра? Никакое CALL не сокращение (если только какой-то совсем специфический потрепанный камень не вспомнить).
О действиях ядра. Там, где о мнемониках -- там я написал "софтовое сокращение"

Берём процессор, где PC не отображается на регистры.
Смотрим описание действий команды PUSH.
Смотрим описание действий команды JUMP.
Смотрим описание действий команды CALL.

Видим, что дейстивя команды CALL состоят из действий (возможно, нескольких) команд PUSH, только с неявно отадресованным PC, и из действий команды JUMP.

Именно это я имел ввиду, когда говорил, что CALL является сокращением PUSH+JUMP. Аппаратным.
testerplus писал(а):
avreal писал(а):Ну а в паре branch-and-link / branch по link-решистру push/pop-ов и нет
Я и говорю: не путайте баланс стека с балансом использования мнемоник PUSH/POP (даже в виде псевдокоманд)
Баланс действий PUSH/POP со структурой данных, называемой стеком (иногда реализованной аппаратно, иногда программно), должен сохраняться независимо от того, вызваны эти действия явными командами PUSH/POP либо неявно, как часть исполнения (аппаратного "разворачивания") более "крупных" команд CALL/RET (которые сами могут быть "синонимами" простых вариантов использования более сложных команд JSR/RTS).
Так сойдёт?
Ах, ну да, там, где SP программно доступен, его ещё можно вручную подвигать...
Но с точки зрения структуры данных "стек" это просто push /dev/random и pop /dev/null :)

Я не зря упомянул параллаксовский ассемблер для PIC, который одну свою мнемонику мог развернуть в пару "реальных" команд PIC. Человек, взявший в руки только тот ассемблер и не видевший другого -- вполне будет писать программы и не будет знать, что там внутри. Будет использовать LCALL и не знать, что это несколько mov-ов в PCLATH и т.д. Даже будет думать, что PC программно недоступен.
push imm на современном x86 разворачивается внутри в горсть команд внутреннего RISC -- так что, это я не push делаю, а загрузку константы в регистр, сохранение регистра в памяти и декремент регистра?
А если push r0 -- всего лишь синоним ассемблера для mov r0,-(r6) -- тоже push не делаю? Или таки push? А если я так явно и запишу mov -- то уже не push?

Что-то не туда пошло обсуждение.
Я же не начал об’яснять Вам, что DEC -- это уменьшение содержимого регистра на 1 (хм.. и то не везде на 1, если уж начинать...).
Могли бы ещё сказать мне, что POP не заточенной палочкой делается.

Эту тему я могу воспринимать только сквозь смех либо сквозь слёзы.
Смеяться не даёте, а плакать мне сейчас и так от чего хватает. Ухожу.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: Прошу прощения, можно за комментировать

Сообщение testerplus »

avreal писал(а):О действиях ядра. Там, где о мнемониках -- там я написал "софтовое сокращение"
А я о мнемониках опкодов. Потому и сказал, что действия со стеком делаются не только push/pop'ом.
А если push r0 -- всего лишь синоним ассемблера для mov r0,-(r6)
А если не синоним? Если нет mov'а с пре-/пост- декрементом?

Ладно, фиг с ним. Признаю, что я просто прицепился к фразе "основное правило работы со стеком -- на каждый PUSH обязательно делать POP". Так что не надо мне рассказывать о том, как бывает в мире МК и что такое микрокод. Сам работаю с разными платформами и все это прекрасно знаю. (Кстати, работая со scenix'ами и pic'ами избегал lcall'ов и прочих макросов. Неаккуратно поставленный sb/snb (или btfss/btfsc) мог привести к редким неуловимым сбоям)
Я же не начал об’яснять Вам, что DEC -- это уменьшение содержимого регистра на 1 (хм.. и то не везде на 1, если уж начинать...).
Я сперва подумал, что Вы не поняли, что я просто пошутил над нерадивым студентом.
Аватара пользователя
andrey_artemov
Встал на лапы
Сообщения: 136
Зарегистрирован: Сб авг 15, 2009 21:26:50
Откуда: Пенза
Контактная информация:

Re: Прошу прощения, можно за комментировать

Сообщение andrey_artemov »

Блин в далёком студенчестве в начале 90х писал на асме для 580вм80, для удешевления не было НИ ОДНОГО БАЙТА оперативной памяти, так, что не командой PUSH/POP ни командой CALL нельзя было пользоваться - только прямая адресация типа JMP? программа записана была в ПЗУ РФ2, выполняла жёсткую логику и выполняла свои функции (работал автоматизированный станок а ля ЧПУ)
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Прошу прощения, можно за комментировать

Сообщение avreal »

avreal писал(а):
testerplus писал(а):PUSH - Команда применяется для нажима на регистр (например PUSH R16 - нажать на регистр r16)
... регистры иногда западают, после нажатия назад сами не возвращаются.
Их тогда назад через дырочку палочкой такой аккуратно выталкивают. Я у знакомого скульптора выпросил. "Стек" называется.
Те, кто с очень потрёпанными процессорами работают, так вообще уверены, что основное правило работы со стеком -- на каждый PUSH обязательно делать POP.
testerplus писал(а):Потому и сказал, что действия со стеком делаются не только push/pop'ом.
Честно говоря, мне было очень странно видеть такой разворот от хорошей шутки и попытки её продолжить к принципиальному разбору на полном серьёзе. Я не умею так быстро менять тему и стиль разговора.
testerplus писал(а):Так что не надо мне рассказывать о том, как бывает в мире МК и что такое микрокод.
...
Я сперва подумал, что Вы не поняли, что я просто пошутил над нерадивым студентом.
И решили рассказать мне, что такое стек :-)
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: Прошу прощения, можно за комментировать

Сообщение testerplus »

avreal писал(а):И решили рассказать мне, что такое стек :-)
Признаю, признаю: придрался не по делу. :roll:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»