С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
А реально отдавать управление чужому заинкбиненному коду (не понимая как он использует стек) в тот момент, когда на стеке нету двух байт для перезаписи или стек настроен так, что при первой же записи перепрыгиывет через 0? Я не о технической возможности, а о вероятности натолкнуться на такое.
что значит реально ли? я думаю человеки много раз так делали (по ошибке). по-нормальному, всегда нужно знать какую-то доп. информацию, чтобы не возникало сюрпризов. вон куча пакеров распаковщики пихает в #5Bxx, а там то переменные 128к бейсика, то резидент sts... т.е. имхо задача требует уточнения условий.
http://zx.pk.ru//showthread.php?t=17811
Про "по ошибке" - согласен. Если контекст исполнения чужого кода настроен ошибочно, понять, что же не так, мучительно тяжело. Другое дело, что внешний (поставляемый) код должен налагать минимум разумных ограничений на вызывающий код. На мой взгляд, ограничения в виде наличия свободной памяти по жестко заданным адресам (при релоцируемом коде), "невидимое" знакоместо над адресом #4000, разрешение/запрешение прерываний и их режим, наличие стандартной прошивки BASIC 48, включенной в момент вызова кода - ограничения неразумные. А вот наличие двух свободных 2-х байтов на стеке, расположенном не по адресам 0-1 - это разумное ограничение, которое, кстати, обычно никто не упоминает (вспомним, к примеру, депакеры и плееры, работающие в демах при жестких условиях - нигде не оговаривается максимальная глубина стека). Да и не задача это вообще, а просто вопрос по технике программирования.
Согласен, в постановке задачи, где речь идет про незнание контекста, можно было бы сказать, что я, как автор вызываемого релоцируемого кода, рассчитываю на какое-то разумное пространство на стеке.
Последний раз редактировалось GriV; 26.07.2012 в 13:12.
вроде бы определились с условиями?
самый простой разумный вариант
если это спрайт граббер значит на экране графика
значит использовать экран можем
ld de,(#4000)
ld hl,#e9e1
ld (#4000),hl
call #4000
this
ld (#4000),de
;hl=this
С уважением,
Jerri / Red Triangle.
Грабер умеет выгружать код вывода спрайта вместе с вырезанными спрайтами, чтобы, например, AER, мог вставить его в дему. Вот для этого кода и надо определять адрес чтобы посчитать где сами спрайты находятся. Так что предпочту вариант с #FFFE, а не с #4000
---------- Post added at 15:49 ---------- Previous post was at 15:46 ----------
А никак нельзя сделать ограничить размер стека. Можно занести в SP значение, на 5 Кб большее, чем последний используемый программой адрес, и писать код так, чтобы в стек не попадало больше 5 Кб. Только 5 Кб для стека - это зачем? BASIC резервирует себе максимум 80 байт, например.
Вспомнилось вдруг как без стека и CALL адрес выяснить - по ключу с помощью CPIR.
Чем длиннее ключ - тем надёжней, но и код (который определяет) тоже будет увеличиватся пропорционально.
Этого можно избежать сделав ключ цикличным, но всё равно размер ключа должен быть ощутимым, иначе надёжность падает (вдруг такой блок чисто случайно ещё где попадётся?).
Ну как-то так (не тестил, не пробовал, именно набросок)
LD DE,#0 (ну или откуда начинать? Если с RAM, то #4000)
M1:
LD BC,0
LD A,"K"
CPIR
INC HL
LD A,(HL)
CP "E"
JR NZ,M1
INC HL
LD A,(HL)
CP "Y"
DEC HL
DEC HL
JR NZ,M1
INC HL
INC HL
INC HL
JP (HL)
DB "KEY"
.... (сюда по-идее должен прыгнуть PC и в HL этот-же адрес)
Как-то так.
Может быть жестоко ошибаюсь.
Сейчас тестить некогда, но в своё время ковырялся с определением адреса - ностальжи увидев тему Позже обязательно попробую. Или топикстартер пусть поковыряет - расскажет работает или нет. Если что расскажу идею про цикличные ключи (пример приведён с тремя знаками, это очень мало, а много знаков делать - код раздуется. есть мысли как его сделать в цикле)
Последний раз редактировалось Destr; 22.06.2012 в 01:11.
А можно 2-х байтный ключ использовать. Если в памяти будет найдено два совпадения, то просто увеличить ключ на единицу и искать еще раз.
(А нет. Адресации относительно IP нет. Ключ не увеличить.)
(А нет. А нет. Мы можем после нахождения ключа увеличить его и тем самым проверить, наш ли это ключ.)
Последний раз редактировалось vinxru; 22.06.2012 в 16:09.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)