Author |
Message |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
ЗОДАЧА для 580ВМ80
Я озадачился этой зодачей довольно давно, и со временем стал склоняться
к мысли, что совсем строго её не решить, но вдруг у кого-то есть иное мнение...
Собственно, сам вопрос возник, когда я читал статью в одном из номеров
журала "Радиолюбитель" - "Пишем перемещаемые программы".
В двух словах речь там шла о том, что программу для 580ВМ80 можно сделать
перемещаемой, если ввести в её структуру таблицу, по сути, "релокейшинов",
фактически как в ЕХЕ файлах ДОС, и при старте программы корректировать
адреса переходов.
Вот в связи с этим и сформировался вопрос:
если программа загружена, получает управление и при этом
- операционная система неизвестна; - карта распределения памяти неизвестна; - наличие стандартных функций или вызовов также неизвестно
существует ли возможность определить текущий адрес точки в памяти, в которой программой получено управление?
На мой взгляд, для Z80 эту задачу решить можно благодаря относительным переходам, а для 580ВМ80 - я затруднился.
|
31 Jan 2011 05:10 |
|
|
b2m
Devil
Joined: 26 May 2003 06:57 Posts: 870
|
Единственная возможность получить содержимое PC - это достать его из стека после команды CALL. К сожалению, эта команда обращается только по фиксированному адресу и если неизвестно абсолютно ничего, то вряд-ли что получится (хотя в таком случае программа должна быть бессмысленной, ведь всё равно она ни вывести ничего не сможет, ни ввести). Однако если известно, что по какому-то адресу есть свободная память (память дисплея, например), то можно записать туда POP H / PCHL, и обратиться туда командой CALL.
_________________Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
|
31 Jan 2011 07:19 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Программа не была бессмысленной - это был отладчик SID от любой системы он хотел только ПП вывода на экран и ввода с клавиатуры. Мог работать с кодами Z80 и i8080 в нужных мнемокодах, системные вызовы группировались в нем в конце программы и могли корректироваться, в зависимости от рабочей системы. Была у меня идея сделать его перемещаемым, он ещё и написан был удачно - блочно, и называть его бессмысленным было бы как раз бессмысленно и опрометчиво.
А если поискать во всей памяти код С9 или вписать его где-то самому.
Память не обязана быть известной - можно считать и проверить ячейку
на модификацию - и так найти ОЗУ.
Вариантов на самом деле больше, чем кажется с разбегу, но окончательно
у меня решение не сложлось.
|
31 Jan 2011 07:44 |
|
|
b2m
Devil
Joined: 26 May 2003 06:57 Posts: 870
|
Поискать можно, только вот нету в ВМ80 относительного перехода, чтобы цикл организовать, да и что ты будешь делать с найденным адресом, как к нему обратишься А вписать я выше и советовал, только если использовать RET, то после команды CALL нужно больше команд использовать - dcx sp / dcx sp / pop h.
_________________Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
|
31 Jan 2011 11:13 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ну "есть много разного на свете, брат Горацио..."
В частности, в стеке можно выполнить какую-то программу,
загнав её через PUSH... и обратившись LXI H,0; DAD SP; PCHL
Я над этой темой много думал в разное время - не осилил.
Поэтому в очередной раз вспомнив, решил выложить здесь.
Вдруг тут кто умнее... так что у меня нет смысла спрашивать ответ.
|
31 Jan 2011 12:15 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22730 Location: Silicon Valley
|
перемщаемая программа - это уже было в Радио
однако загрузчик при этом должен сидеть в известных адресах
если ты и загрузчик хочешь сделать перемещаемым - то это наверное не полетит...
|
31 Jan 2011 15:58 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
наверное - это не аргумент.
У меня всегда шага не хватает до полёта.
Это как в теории игр - все склоняются к мысли, что у шахмат ничейная матрица, но строго никто не доказал.
|
01 Feb 2011 11:58 |
|
|
shoorick
Doomed
Joined: 05 Nov 2007 05:08 Posts: 487 Location: Украина
|
Просканить все 64кб и найти свою сигнатуру - займет пару-тройку секунд
|
02 Feb 2011 01:48 |
|
|
HardWareMan
Banned
Joined: 20 Mar 2005 13:41 Posts: 2141 Location: От туда
|
При условии наличия относительного перехода. :3
|
02 Feb 2011 02:56 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А свежая мысль у Шурика!!! Сканер можно написать в стеке - там адреса известны и можно обойтись абсолютными переходами.
Last edited by Lavr on 02 Feb 2011 17:33, edited 1 time in total.
|
02 Feb 2011 03:30 |
|
|
shoorick
Doomed
Joined: 05 Nov 2007 05:08 Posts: 487 Location: Украина
|
а гдеш его взяць-то в ИК80?
|
02 Feb 2011 03:36 |
|
|
HardWareMan
Banned
Joined: 20 Mar 2005 13:41 Posts: 2141 Location: От туда
|
Логично, стек то к началу растет. После занесения туда сканера вершина будет как раз на начале кода, а при вызове PCHL - в [HL] этот самый адрес. Далее, сканим память и возвращаемся по известной точке входа в свою прожку (перед самой точкой входа сделать сигнатуру). Вполне осуществимо, если только в стек не пихать тонны кода. :3 И да, пихатель должен быть линейный. :3
Именно, КЭП, именно...
|
02 Feb 2011 03:37 |
|
|
shoorick
Doomed
Joined: 05 Nov 2007 05:08 Posts: 487 Location: Украина
|
дык, адреса ж в стеке известны, понятное дело, возврата по RET оттеда не будет
|
02 Feb 2011 04:05 |
|
|
b2m
Devil
Joined: 26 May 2003 06:57 Posts: 870
|
Господа, а что это мы к стеку привязались? Где гарантия, что то случайное значение в регистре SP после запуска программы будет указывать на ОЗУ? Ведь в условии задачи сказано, что ничего не известно!
_________________Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
|
02 Feb 2011 04:21 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Кто-то из классиков, кажется Ньютон, сказал:"Природа сложна, но не злонамеренна." Смотрим в условие:
ОС или тест-мониторная система программу как-то загружали, значит есть надежда, что стек выставлен вменяемо.
Конечно, если стек смотрит в ПЗУ или в отсутствие памяти - то всё бестолку. Но тогда это действительно дикое устройство, хотя... я такое реально как-то лицезрел.
Это был музыкальный автомобильный клаксон - 580ВМ80, ПЗУ два мощных транзистора и динамик. Блин - классика минимализма,
ни стека, а значит - нет CALL... только таблицы тонов, джампы и вывод звука по EI-DI.
PS. Ну что - добьем зодачку? А то у меня ещё одна затейливая есть...
PPS. Шурик кинул-таки незамутнённый взгляд на зодачу! А ведь я сам сто раз такое делал - в ИБМ чтоб не сажать резидент дважды, сканируешь ОЗУ на его сигнатуру. А вот вернуться от ИБМ к 580ВМ80 - не случилось.
|
02 Feb 2011 04:46 |
|
|