Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ассемблер AVR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Страницы: 1, 2
ILYAUL
Цитата
идёт речь об адресах, которые могут храниться как во флэше так и в озу... адреса переходов,

Не всем так , нет там адресов переходов ни во FLASH ни в SRAM . Вы можете использовать SRAM по прямому назначению . но это никак не повлияет на адресацию. Все адреса переходов вычисляются на стадии компиляции программы , а использование команды ret вообще для любого диза - просто ret / А вот то , что с этой точки можно уйти в любую сторону кода без последствий , я думаю что он тоже не просечёт. Отслеживать стек , я думаю дизы ещё не научились.

Собственно , особо нового ничего и нет. Многим известен такой подход
Код
ldwi Z,METKA
push ZL
push ZH
----------
MAIN:
Какой -то код
-----------
ret
Какой -то код
-----------
METKA:

Это всё в области FLASH , и метка существует в явном виде иначе компилятор ее не вычислит.

но если
Код
.dseg
METKA:
то адрес метки возьмётся по адресу SRAM
Если METKA = 0x100 , то программа удёт на адрес 0x100 , если добавить .byte 8 - то на удёт на 0x108, при этом в самой программе меток нет вообще

Код
0x107  ldi count,30
0x108  dec count
0x109 add temp,count
0x110 sts METKA, temp  ну и т.д.
этот код для примера т.е просто набор пришедших в голову команд
kolobok0
Цитата(ILYAUL @ Aug 7 2012, 12:41) *
...Вы можете использовать SRAM по прямому назначению . но это никак не повлияет на адресацию. Все адреса переходов вычисляются на стадии компиляции программы...Отслеживать стек...такой подход ...Это всё в области FLASH , и метка существует в явном виде иначе компилятор ее не вычислит....адрес метки возьмётся по адресу SRAM..Если...то программа удёт на адрес 0x100 , если добавить ...то на удёт на 0x108, при этом в самой программе меток нет вообще...



уважаемый, вы мягко говоря либо не так пишите, либо не так думаете...

1) ОЗУ можно использовать как хошь, в том числе и как хранилище адресов переходов.
2) речь шла немного о других командах,а не рэт. С рэт можно делать более экстравагантные ситуации, где дизасм. сто пудово не пройдёт, даже если будет сечь все регистры и память вместе взятые.
3) Ваш подход не совсем понятен(как пример). Потому, что он путает исходники, а не бинарь как способ уйти от дизасма. Для понимания моей фразы прошу объяснить мне Вашу цитату "метка существует в явном виде". Она существует где??? подумайте хорошенько прежде чем ответить.
4) адресс - это некое число. его можно получить как хотите - хоть сдвигом влево, хоть подсчётом в столбик. способ инициализации адреса в исходниках - феолетово как. главное чтоб при просмотре бинарника это не было понятно.

рекомендую найти на просторах инета любые исходники вирусов(для x86 должны быть). и загляните в них. вы так многое узнаете-гарантирую!!!

существует приёмы, известные ещё со времён доса, которые использовали профи в вирусах.
в своё время, для себя выработал постулат - хочешь научиться писать на азме - напиши вирус(не путать с распространением его).

ЗЫ
Если интересует конкретика в данном вопросе - ставте задачу, находите способы решения известные вам, выкладывайте на форум. я думаю, что это будет интересно всем - научиться приёмам, которые можно заюзать при решении тех или иных проблем.

ILYAUL
1. Я не храню там адреса переходов , я использую адреса области SRAM как базовые адреса для перехода к подпрограммам
2. О каких других командах шла речь , если я вообще никакие команды до поста с кодом не приводил.
3. В явном виде , это значит что в памяти программ надо обозначить метку к которой я хочу перейти , что бы компилятор смог вычислить PC-XXXX где XXXX - адрес метки. В любом случае дизас ее покажет. Через SRAM метка не нужна.
4. Да это один из способов адресации к коду в программной памяти.

А вопрос был поставлен так
Цитата
Но вот , что это даёт практически и как это можно использовать не придумаю никак? Т.е. где бы такой выкрутас можно применить?

Хорошо , напишу вирус biggrin.gif
kolobok0
Цитата(ILYAUL @ Aug 7 2012, 16:42) *
...2. О каких других командах шла речь...3. В явном виде , это значит что в памяти программ надо обозначить метку к которой я хочу перейти , что бы компилятор смог вычислить PC-XXXX где XXXX - адрес метки. В любом случае дизас ее покажет. Через SRAM метка не нужна....


2 - простите это я погорячился. действительно icall & ijmp не вы произнесли.
3 - а теперь давайте подумаем как дизазм находит эту метку sm.gif найдя явную команду перехода(условного, безусловного, относительного или явного) дизассэмблер рисует метку "XRU_101:" и в ссылках вносит эту метку типа "rjmp XRU_101" в дизассэмблерном коде. т.е. если явно нигде дизасэмблер не найдёт ссылку на данный код - то и метки не будет. т.е. достаточно не создавать таких ссылок. теперь возвращаемся к исходному коду. нахрена себе делать гимор в виде не существующих меток??? вполне достаточно будет имея некий базовый адрес и оффсет до нужного куска кода, чтоб сложить их и получить нужный адресс. это как один из способов получения адреса. (извращатся можно бесконечно кстати) в AVR оффсет команд выравнен на слово. в 86 архитектуре можно было ещё и с этим играться.

ик...
ЗЫ
и это ещё без затрагивания приимуществ AVRов, самопрограммирования, аппаратуры и прочих плюшек в конкретных камнях...

ЗЫ ЗЫ
И всё же, ышо раз обращаю ваше внимание на то, что указание метки в исходниках не есть причина нахождения метки в дизассэмблере!!! причина в команде ПЕРЕХОДА по данному адресу. А метки сами по себе прятать - то только исходники путать. Отсюда я и спрашивал - задача у вас какая изначально то???

Цитата(ILYAUL @ Aug 7 2012, 16:42) *
...А вопрос был поставлен так ...


на вопрос я уже отвечал. там где нужно динамически вычислять адресс перехода. например в "оверлейных" кусках программы. либо всевозможные таблицы переходов - типа аля switch. "конечный автомат" если хотите.
ILYAUL
Спасибо , за пояснения.
Цитата
Отсюда я и спрашивал - задача у вас какая изначально то???

Если по данному обсуждению то никакой . Я писал программу с ветлениями через ret и допустил ошибку с меткой , забыл вписать метку , да и обозвал ее так же как в .dseg и программа "запрыгала" не туда куда я ожидал.
Естественно прояснил почему , ну и дальше Вы уже знаете.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.