PDA

Просмотр полной версии : Новый дизассемблер для ZX



Strunov
26.02.2007, 09:59
Есть программа дизассемблер. Каким образом организовать скролл вверх. Точнее как определить количество байт в команде идущей сверху??

valker
26.02.2007, 10:15
Есть программа дизассемблер. Каким образом организовать скролл вверх. Точнее как определить количество байт в команде идущей сверху??

Imho: никак.

SAM style
26.02.2007, 10:22
Imho: никак.
Да не, как-то можно. Надо проверить назад байт этак, например, 10 - предыдущий байт проверить на 1-байтную команду, перед ним - на 2-байтную, ещё перед ним - на 3-байтную. Последняя совпавшая и будет предыдущей командой.

Vitamin
26.02.2007, 10:23
Простейший способ- шагнуть назад на некоторое количество байт (~4) и попробовать дизассемблировать (сиречь определить длину команды). Если между концом этой дизассемблированной команды и началом текущей строки нет промежутка, то считаем, что получили адрес. Иначе- пытаемся дизассемблировать на байт дальше.
Но этот способ неточный (имхо используется в STS).
Самый точный способ состоит в дизассемблировании нескольких команд назад. Также шагаем назад на некоторое число байт (~16) и пытаемся дизассемблить несколько команд пока не достигнем исходной (без перехлестов и пропусков). Иначе- шагаем вперед на байт. Такое юзается в US.
Если программа немодифицируется (в ПЗУ лежит или еще что) и дизасм на мощной машине делается, то можно просто составить битовую карту команд и просто бегать по ней.

valker
26.02.2007, 10:36
Imho: никак.

Уточню, в общем случае - никак. Шагаем на 1 байт назад - там команда - но не факт, что это именно она (возможно часть данных), шагаем на 2 байта назад - там команда с 1 байтным параметром (или 2-х байтовая команда), шагаем на 3 байта назад - там команда с 2 байтным параметром или 3-х байтовая команда. Автоматически решить какая же из 3-х правильная без анализа хода выполнения программы невозможно. Анализ может быть затруднён (например переходами по вычисляемым адресам, когда данные для вычислений становятся известны только на этапе работы программы).

jerri
26.02.2007, 12:10
максимальная длинна команды в z80 4 байта
вот от этого и считай -

тест -4 = 4 байтная команда?
если нет то тест -3 = 3 байтная команда?

и тд

Vitamin
26.02.2007, 13:28
максимальная длинна команды в z80 4 байта
Не-а...
Не забывай про дублирование/чередование префиксов индексных регистров

jerri
27.02.2007, 01:54
dd fd dd fd ты про эти? они стекуются и учитывается только последний

а если dd cb или dd ed то там все равно команды в сумме 4 байта
я трассировщик писал у меня не было команд длинее 4 байт

ну или назови такую команду :)

Jukov
27.02.2007, 08:36
Есть программа дизассемблер. Каким образом организовать скролл вверх. Точнее как определить количество байт в команде идущей сверху??
С какой целью интересуешься, если не секрет?

Vitamin
27.02.2007, 09:22
dd fd dd fd ты про эти? они стекуются и учитывается только последний

а если dd cb или dd ed то там все равно команды в сумме 4 байта
я трассировщик писал у меня не было команд длинее 4 байт

ну или назови такую команду
Именно про это. Стыкуются, учитывается последний, но все равно длина команды состоит из суммы ВСЕХ префиксов. И только в таких случаях, во всех остальных как раз 4 байта..

Strunov
27.02.2007, 09:33
С какой целью интересуешься, если не секрет?

Дизассемблер хочу написать..

SAM style
27.02.2007, 09:57
проверять назад только 4 байта - это мало. Пример...

ld de,#FD00
ld hl,#FFFF
(x)

если проверять назад от точки (х) - на 4 байта назад будет LD IY,#FFFF
ИМХО, дизасм с отступом назад байт в 16 - самое то.

SMT
27.02.2007, 09:57
в общем случае нельзя. например, данные перед курсором 21 21 21 3E FF
можно дизасмить как

some_byte db 21
my_procedure ld hl,#3E21
rst #38
cursor:
или как

my_procedure ld hl,#2121
ld a,#FF
cursor:зависит от того, будет ли когда-либо передано управление первому байту в цепочке или второму

Vitamin
27.02.2007, 10:26
Кстати о птичках. Есть ли хоть один дизасм, который корректно декодирует команды калькулятора?

Jukov
03.03.2007, 06:29
Дизассемблер хочу написать..
А STS чем не устраивает?

spensor
03.03.2007, 10:43
А STS чем не устраивает?
А кто сказал что STS дизассемблер? Это очень хороший отладчик, но с предельно примитивной функцией дизасма. Если есть желание понять что такое настоящий дизасм, то посмотрите например на ZXD (был в приложении к ZX-Power, кажется #2). Еще лучше IDA Pro, но он увы PC-шный.
А вообще идею с дизассемблером поддерживаю обеими руками. Будет желание активно заняться написанием такого есть куча идей, ибо сам пытался сделать такое. В частности дизасм мог бы иметь таблицу стандартных точек (#5800, #5B00, #C000, #3D13, #3D2F и др.) по которым в 99% можно определить правильно ли установлен PC (ProgrammCounter) для процедур. Кроме того можно отсеивать явные массивы данных (это когда коды команд изменяются по инкрименту или когда присутстует большые участки команд LD *,*).

jerri
04.03.2007, 09:28
а кстати я не знаю как сделано в сервис мониторе на Скорпе
но помню одну ситуацию
когда я никак не мог сделать шаг на одну команду назад
он дисасемблил неправильно и упорно возвращал н ту ячейку что уже была

Rubts0FF
11.03.2007, 06:16
Когда выдаеш листинг строиш таблицу адресов инструкций. При движении за листинг вверх
1 - отступаеш на 4-е байта
2 - дизассемблиш инструкцию
3 - проверяеш адрес за инструкцией с адресом в вершине таблицы
4 - совпало - ок, нет отступаеш на 3 ( 2, 1 ) и п2.
В Засм мониторе я так делал. Впрочем я же тебе исходники послал.
Получил?

Добавлено через 3 минуты
Vitamin, Mon2

Strunov
12.03.2007, 10:11
Когда выдаеш листинг строиш таблицу адресов инструкций. При движении за листинг вверх
1 - отступаеш на 4-е байта
2 - дизассемблиш инструкцию
3 - проверяеш адрес за инструкцией с адресом в вершине таблицы
4 - совпало - ок, нет отступаеш на 3 ( 2, 1 ) и п2.
В Засм мониторе я так делал. Впрочем я же тебе исходники послал.
Получил?

Добавлено через 3 минуты
Vitamin, Mon2

Да получил, спасибо. Многое что там сделано, я уже сделал сам, но кое что подсмотрел. По поводу отступания на 4-е байта я понял. Но если посмотреть как он работает, то видно, что при скроле вверх иногда передизассемблируется вся страница. По какому условию??

Strunov
18.04.2007, 14:27
Вот еще проблема... НУжны подпрограммы работы с диском для того же самого дизасма... Понятные и простые. Загрузка каталога, создание таблицы файлов для селектора, загрузка и т.д. Вообще мой малый опыт программирования на асме показывает, что 80% времени уходит на создание интерфейса...., а времени мало... Чтобы не прослыть болтуном прилагаю скриншоты и один Снэпшот.

P.S. Пробел не жмите... там ret в асм... Висяк..
P.P.S Выход в меню Q. Там правда кроме поиска меток и HELP-a ничего не работает пока....

Strunov
07.05.2007, 15:51
Вот... Немного продвинулся в написании Дизассемблера..

Что работает.

1.Автоматический поиск меток.
2.Ручной ввод меток.
3.Очистка меток.
4.Ввод адреса в Hex и Dec
5.Переход по адресу содержащ. в команде.. (LD hl,#4000 и т.д.)
6.Подсветка содержимого памяти по адресу в команде...
7.три режима отображения... ASM/DUMP/String
8.В режиме стринг есть три маски All/Ang/Ang+Rus
9.Есть возможность отображения Asm кода большими и маленькими буквами.
10. Самый честный PageUp из всех мною виденых на ZX. :)
11.Мож еще чего.. уже не помню..

Что не работает..

1. Работа с блоками.
2. Дисковые операции.

P.S. Пожелания принимаются...

Strunov
10.05.2007, 10:23
Ну что... За праздники еще немного дописал...

Что добавлено..

1. Ручное удаление метки. Клавиша Del (Caps Shift+9)

2. Ручное добавление автометки Клавиша L

3. Контекстный переход с запоминанием 32-х переходов.
Возврат на предыдущий адрес клавиша BackSpace (Caps Shift +0)

Приступаю к работе с блоками и вытекающими отсюда функциями преобразования ASM<->DB<->DW<->String.

Пожелания по прежнему принимаются...

Dexus
10.05.2007, 11:18
А зачем дизассемблеру (которому прямо указываешь начальный адрес) - шагать назад?

Strunov
10.05.2007, 11:29
А зачем дизассемблеру (которому прямо указываешь начальный адрес) - шагать назад?


Не понял... :confused_std:

axor
10.05.2007, 13:11
Желательно чтобы весь дизассемблер работал исключительно в странице (любой). Как сейчас не знаю. Страницами щелкать через свой (желательно не через свой а через STS`овский) резидент.

Так же хотелось бы увидеть более детальный хелп по функциям (клавишам).

Хотелось бы иметь возможность убирать мигание курсора.

Strunov
10.05.2007, 13:26
Желательно чтобы весь дизассемблер работал исключительно в странице (любой). Как сейчас не знаю. Страницами щелкать через свой (желательно не через свой а через STS`овский) резидент.

Сейчас распределение памяти следующее.

Страница 4. Дизассемблер.
Страница 3. Таблица меток.
Страница 1. Буфер для дизасемблирования на диск.

Резидент сидит в буфере принтера.


Хотелось бы иметь возможность убирать мигание курсора.


Убрать можно, только его тогда плохо в текстовом поле видно...
Наверное сделаю настройки и вынесу этот вопрос туда.

axor
11.05.2007, 12:11
Сейчас распределение памяти следующее.

Страница 4. Дизассемблер.
Страница 3. Таблица меток.
Страница 1. Буфер для дизасемблирования на диск.

Резидент сидит в буфере принтера.
Тогда нужно сделать настраиваемыми все эти страницы и адрес резидента (желательно чтоб он был релоцируемым).

В общем нужно сделать некоторые настройки пользователя (хотя бы как в Аласме).

psndcj
11.05.2007, 19:27
версию под верхнюю память можно бы - чтобы в коде 128х программ копаться - ну и метки соответственно разные хранить (типа в банках 5 и 7 #c000 = screen, а в 6й - #c000 = music.

Sonic
14.05.2007, 12:27
Еще пожелание: не использовать ПЗУ вообще. Даже для сканирования клавиш.
Помню я собрал свой эмулятор ПЗУ, подключил его к Профику, и попробовал 4-м STS'ом посмотреть его сервис-монитор (я в эмуляторе бит для этого предусмотрел). Жутко обиделся и загрузил третий STS.
Хотя думаю что 4-й STS мог бы без этого обойтись. Кстати проверка целостности второй страницы там почему-то не работала, хотя была обещана.

axor
14.05.2007, 12:32
Еще пожелание: не использовать ПЗУ вообще. Даже для сканирования клавиш.
Поддерживаю.

Strunov
14.05.2007, 14:26
Еще пожелание: не использовать ПЗУ вообще. Даже для сканирования клавиш.
Помню я собрал свой эмулятор ПЗУ, подключил его к Профику, и попробовал 4-м STS'ом посмотреть его сервис-монитор (я в эмуляторе бит для этого предусмотрел). Жутко обиделся и загрузил третий STS.
Хотя думаю что 4-й STS мог бы без этого обойтись. Кстати проверка целостности второй страницы там почему-то не работала, хотя была обещана.


Я могу отказаться от ПЗУ (Сейчас там используется толко опрос клавиатуры). Только это все-таки не отладчик, а дизассемблер. То-есть программа, для того, чтобы загрузить некий кодовый блок, найти все стринги, DB, DW, фонты, картинки, метки и все это перевести в Ассемблерный листинг. Где здесь мешает опрос клавиатуры из ПЗУ?

Sonic
14.05.2007, 16:08
Там же где он помешал мне в STS. А если я хочу дизассемблировать теневое ПЗУ?
В STS3 все было классно. Написал в свободном месте памяти OUT(#EF), A, загрузил нужное значение в аккумулятор, прошагал эту команду - и наслаждаюсь картинкой...

Strunov
01.08.2007, 12:39
Короче должен сообщить неприятное известие. :frown:

В связи с тем, что мой родной завод почти загнулся, вынужден заниматься сменой работы. (уже две конторы поменял.) Посему сейчас просто нет времени заниматься продолжением работы над дизассемблером. Чтобы труд не пропал, выкладываю исходники. Может когда все устаканится, продолжу работу над программой. Если у кого есть желание продолжить работу над дизассмом, я не против.