|
PC +/- … |
|
|
|
Apr 11 2011, 17:44
|

Пользователь забанен
    
Группа: Свой
Сообщений: 1 138
Регистрация: 9-08-05
Пользователь №: 7 492

|
..Борюсь с атмегами.. о, как они мне не нравятся.. ну всё, буквально, претит.. ..Вопрос такой. У PIC-ов есть возможность написать: гоу ту доллар +/-, скажем, 7. И программа перейдет по указанному адресу. У атмег, аналогичный вариант выглядит, как, PC +/- 7. Как бы, это работает. Но, недавно, что-то не пошло, пришлось по фрагментам в студии рассматривать. И обнаружил, что не прыгает оно на семь указанных строчек, а прыгает на шесть. А в других случаях прыгало.. Если указать восемь, будет прыгать на семь. ..Это глюк такой или есть нюансы, которых не знаю? ..С PIC-ами таких проблем не было. P.S. Настоятельная просьба ко всем, решившим сюда ответить: ни слова о Си. О его достоинствах, преимуществах и т. д. Ни слова! Или сразу закрою тему.
--------------------
It's me
|
|
|
|
|
 |
Ответов
(75 - 89)
|
Apr 13 2011, 22:44
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата(rx3apf @ Apr 14 2011, 02:14)  По битам в i/o или в регистрах - да. А вот по битам в регистре состояния - облом. Да. Но команда IN флаги не меняет, насколько я помню. -- Цитата(aaarrr @ Apr 14 2011, 02:11)  Для замены BRGE что предложите? Осмысленные метки, я их изначально предлагаю  Ежели доводить до абсурда, то разложить на составляющие результат BRGE тоже возможно. Цитата(aaarrr @ Apr 14 2011, 02:15)  Ну, если включать иногда на секунду мозг считается извращением... Вряд ли извращением, конечно, но неоправданным риском точно. Доверять сие стоит лишь транслятору с ЯВУ, т.к. он не ошибается.
|
|
|
|
|
Apr 13 2011, 22:50
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Oldring @ Apr 14 2011, 02:33)  Даже хуже, но это всё равно не аргумент, чтобы заниматься подобной хакерней. Нет, батенька, не тянут такие конструкции на "хак": слишком уж просто и очевидно. P.S. Блестящий, остроумнейший неологизм! Примите мои искренние поздравления, маэстро. Цитата(SysRq @ Apr 14 2011, 02:44)  Да. Но команда IN флаги не меняет, насколько я помню. Код in reg, SREG sbrc reg, BIT rjmp xxx Несколько вычурно, не находите? Да и с GE/LT все равно облом. Цитата(SysRq @ Apr 14 2011, 02:44)  Вряд ли извращением, конечно, но неоправданным риском точно. Доверять сие стоит лишь транслятору с ЯВУ, т.к. он не ошибается. Объясните мне, где я рискую ошибиться в такой конструкции: Код brhs PC + 2 rjmp xxx
|
|
|
|
|
Apr 13 2011, 23:06
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(aaarrr @ Apr 14 2011, 02:50)  Нет, батенька, не тянут такие конструкции на "хак": слишком уж просто и очевидно. Именно на хак и тянет. Экономия в набивании нескольких символов за счет того, что повышается риск ошибоок при модификации программы и ухудшает видимость структуры программы. Метки, кстати, служат еще одной важной функции - показывают, куда может быть передано управление. Соответственно, иногда только текстовым поиском можно легко найти все места, откуда осуществляется переход на помеченную инструкцию. Цитата(aaarrr @ Apr 14 2011, 02:50)  Объясните мне, где я рискую ошибиться в такой конструкции: Код brhs PC + 2 rjmp xxx На первый взгляд, конечно, кажется, что "brhs PC + 2" текстуально полностью эквивалентно скипу следующего rjmp, если применять единообразно. Но это неверно. Помню, как-то ради быстрого перехода на больший кристалл заменил в проекте все rjmp и rcall на jmp и call текстовой заменой  Цитата(SysRq @ Apr 14 2011, 02:44)  Доверять сие стоит лишь транслятору с ЯВУ, т.к. он не ошибается. Все врут. В моей практике было несколько случаев, когда аккуратное расследование показывало, что наврал именно транслятор. Даже такой хорошо известный и очень надежный транслятор, как MSVC 6.0
--------------------
Пишите в личку.
|
|
|
|
|
Apr 13 2011, 23:07
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата(aaarrr @ Apr 14 2011, 02:50)  Несколько вычурно, не находите? Нахожу, конечно же. Однако, информативность кода та же, что без меток, но меньше шансов ляпнуть ошибку. Цитата(aaarrr @ Apr 14 2011, 02:50)  Да и с GE/LT все равно облом. Нет, не облом, если декомпозировать команду. Но выглядеть будет крайне идиотски, не спорю. Цитата(aaarrr @ Apr 14 2011, 02:50)  Объясните мне, где я рискую ошибиться в такой конструкции: Код brhs PC + 2 rjmp xxx В процессе правки заменить rjmp на jmp, потому что код разросся (а правили сложно, долго, и где-то много ниже этого вот места), и компилятор ругался на невозможность relative jump. Ошибка по невнимательности. Человеческий фактор.
|
|
|
|
|
Apr 13 2011, 23:29
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Oldring @ Apr 14 2011, 03:06)  Именно на хак и тянет. Экономия в набивании нескольких символов за счет того, что повышается риск ошибоок при модификации программы и ухудшает видимость структуры программы. Метки, кстати, служат еще одной важной функции - показывают, куда может быть передано управление. Соответственно, иногда только текстовым поиском можно легко найти все места, откуда осуществляется переход на помеченную инструкцию. Какой текстовый поиск? Речь идет об очевидных конструкциях. Ну куда еще может быть передано управление командой "rjmp PC - 1", кроме как на предыдущую? Цитата(SysRq @ Apr 14 2011, 03:07)  Нахожу, конечно же. Однако, информативность кода та же, что без меток, но меньше шансов ляпнуть ошибку. Информативность много ниже. Я уж не говорю о потерянном времени и затраченном регистре. Цитата(SysRq @ Apr 14 2011, 03:07)  Нет, не облом, если декомпозировать команду. Но выглядеть будет крайне идиотски, не спорю. Ну, так можно и до виртуальной машины дойти потихоньку. Цитата(Oldring @ Apr 14 2011, 03:06)  На первый взгляд, конечно, кажется, что "brhs PC + 2" текстуально полностью эквивалентно скипу следующего rjmp, если применять единообразно. Но это неверно. Помню, как-то ради быстрого перехода на больший кристалл заменил в проекте все rjmp и rcall на jmp и call текстовой заменой  Цитата(SysRq @ Apr 14 2011, 03:07)  В процессе правки заменить rjmp на jmp, потому что код разросся (а правили сложно, долго, и где-то много ниже этого вот места), и компилятор ругался на невозможность relative jump. Ошибка по невнимательности. Человеческий фактор. Если уж мы имеем дело с ассемблером, то человеческий фактор и так проявляется на каждом шагу. В конце концов, можно и метку в процессе copy-paste воткнуть не туда. Поэтому элементарную внимательность никто не отменяет.
|
|
|
|
|
Apr 14 2011, 00:21
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(SysRq @ Apr 14 2011, 03:58)  Класс и цена ошибки другие. Время и усилия на поиск и устранения больше, последствия намного более непредсказуемые, поддерживать код сложнее. Не вижу ничего хорошего в таком подходе, эх  Я далек от того, чтобы вводить классификацию ошибок. А время на поиск и устранение вообще трудно предсказать. Вот попробуйте найти ошибку в такой конструкции: Код ldi r16, 0 sbrс r17, 2 ldi r16, 1 Пример вполне себе из жизни. Не дословно, конечно, но изюминка сохранена.
|
|
|
|
|
Apr 14 2011, 02:30
|
Местный
  
Группа: Участник
Сообщений: 256
Регистрация: 5-04-09
Из: Москва
Пользователь №: 47 180

|
Цитата(Wise @ Apr 14 2011, 00:37)  Вы с чего взяли, что я не читал дэйтшиты и книги Евстифеева? На чем такая уверенность основана, на том, что я задал вопрос? Sorry, если обидел... Не хотел. Не уверенность, а , скорее, удивление ... не тому, что задан вопрос, а какой вопрос задан. Цитата(Wise @ Apr 14 2011, 00:37)  ..А книг, могу еще штук 16 перечислить, хотите? Смысл? Их читать надо Цитата(Wise @ Apr 14 2011, 00:37)  ..Я сказал, что выложу все свои "фи" атмегам, а их много накопилось, и выложу. Но, сейчас я занят. Все позже..  Было бы очень интересно.
|
|
|
|
|
Apr 14 2011, 05:01
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(aaarrr @ Apr 14 2011, 04:21)  Я далек от того, чтобы вводить классификацию ошибок. А время на поиск и устранение вообще трудно предсказать. Вот попробуйте найти ошибку в такой конструкции: Код ldi r16, 0 sbrс r17, 2 ldi r16, 1 Пример вполне себе из жизни. Не дословно, конечно, но изюминка сохранена. Что-то не прожевать изюминку. Не вижу ничего криминального. Колитесь, в чём фишка
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|