Что-то потеряли? Заходите, будем искать, что ж поделать...
Ответить

Нормальный дизассемблер для i8035 (i8051)

Пн апр 23, 2018 15:48:43

Ищу нормальный дизассемблер, желательно с оболочкой под i8035 (ну или 8051) - а то к такой древности :-) С возможностью дизасемблировать с указанного адреса (то есть программа изначально с многочисленными .org xxxx причем не путем написания командных строк на 2000 символов), расставлять метки, корректно обзывать регистры ВВ работать под виндою а не требовать себе MSDOS 2.0 и 8086 с 512 кБ и не килобайтом более) - штук пять скачал - хоть и говорят что под 8051, но от последовательности E5h, C5h почему-то входят в ступор (типа не знают такой команды), дизассемблируют в неведомых мнемониках (хоть и заявлен 8051) или вообще вешаются.

Re: Нормальный дизассемблер для i8035 (i8051)

Пн апр 23, 2018 16:46:18

пробовал?:
DIS8051 кросс-дизассемблер, руководство по использованию
http://microsin.net/programming/MSC51/d ... mbler.html

Re: Нормальный дизассемблер для i8035 (i8051)

Вт апр 24, 2018 06:22:07

Wladimir_TS
А НА КОЙ???
:shock:
Именно дизассемблер - ведь коды для MCS51 можно просто по распечатке с карандашиком в руке и картой команд перед носом расписать??
:dont_know:
Другое дело ассемблер и дебаггер-отладчик - дык и то добро ВАЛОМ имеется.
Заглянь сюда
viewtopic.php?f=62&t=59015
и сюда
viewtopic.php?f=62&t=94201
ежли чего не найдеш/не разбереш - пиши в личку или в "винной"
:beer:

Re: Нормальный дизассемблер для i8048

Вт апр 24, 2018 07:29:51

пробовал?:
DIS8051 кросс-дизассемблер, руководство по использованию
http://microsin.net/programming/MSC51/d ... mbler.html


АгасчаЗЗЗЗ - 8035(8048) и 8051 эттта не одно и тоже посему нужен именно для 8048 дизассемблер


To Moderator: Поправьте в заголовке темы i8051 на i8048

Re: Нормальный дизассемблер для i8035 (i8051)

Вт апр 24, 2018 11:34:37

То же самое, что и по MCS51 относится и к 8035(8048) /касательно распечатки на листочке и карандашика + карта команд/.
Есть и симулятор для ПК (работает в DOS-окне под ХР).
8)

Re: Нормальный дизассемблер для i8035 (i8051)

Вт апр 24, 2018 12:12:43

Тяжко на листочке - кода много, причем код х....ый - много брошеных участков, к которым нет обращений некоторые места непонятны

А есть какие-то симуляторы ? Только для работы программы требуется отработка INT0 с определенной частотой и фазой относительно сигнала на T0 (точнее наоборот - согнал на T0 появляется с некоторой задержкой относительно INT0, основная-ж программа в глухом цикле.

Подобрал более-менее дизассемблер - анализирую код - подскажите (лет 15 лет с 8051 ядром не работал - все забыл)

org 008Eh
MOV R0,#37h
MOV A,@R0
ORL A,#0F0h
JMPP @A

Куда будут переходы

00F0-00FF ?

Там код

d2 d6 da de e2 e6 fe ea e8 ec e4 e0 dc d8 d4 d0

И как это понимать ?
Последний раз редактировалось Wladimir_TS Вт апр 24, 2018 13:21:44, всего редактировалось 2 раз(а).

Re: Нормальный дизассемблер для i8035 (i8051)

Вт апр 24, 2018 13:14:15

Симулятор есть, но старообразный - воздействия на внешнелапы надо вручную кнопами на клаве отрабатывать при пошаговом прогоне.
8)

Re: Нормальный дизассемблер для i8035 (i8051)

Вт апр 24, 2018 13:20:49

Вот я того и боюсь - что только в железе - там динамически только работоспособно. Гляньте код выше - я не понимаю, как это работает ???

В ячейке 37 некий счетчик.

Re: Нормальный дизассемблер для i8035 (i8051)

Вт апр 24, 2018 14:36:31

Воть книжа по 48-й
https://sunduk.radiokot.ru/loadfile/?load_id=1431792142
воть табличка
Mcs48tbl.pdf
(1.58 MiB) Скачиваний: 301

JMPP @A - переход в пределах текущей страницы памяти программ (надо знать точный адрес кодов самой команды)
http://img.radiokot.ru/files/20529/1keqbopmd6.GIF
воть как-то так...
:roll:
Воть добавкой архивчик с симулятором
Новая папка.zip
(22.27 KiB) Скачиваний: 297

:beer:

Re: Нормальный дизассемблер для i8035 (i8051)

Вт апр 24, 2018 14:57:50

Сама инструкция JMPP по адресу 00A0h, но согласно приложеному файлу переход вроде абсолютный, если старшие 4 бита в "1" ....

Просто значений в 37 ячейке может быть 0-15, она даже на 2 не множится нигде.

А в ячейках 00F0 - 00FF бред содержится, тогда как в 00D0-00EE содержится 15 JMPов с шагом в 2 адреса.
Вложения
jmpp.PNG
(63.86 KiB) Скачиваний: 630

Re: Нормальный дизассемблер для i8035 (i8051)

Вт апр 24, 2018 15:33:46

Ежли 0х00A0 то прыгнет на 0х00(содержимое аккумулятора)
т.е адрес страницы + содержимое аккумулятора (не суммируется, а замещает младший байт!!)
находимся на странице 0 - 0х0000 и допустим в аккумуляторе 0х55
прыгаем на 0х0055
А что на момент выполнения того JMP смотреть самому...
:tea:
Возможно задан условный переход по таблице - как раз двухбайтовое значение.
А само условие загружается в аккумулятор и после некотора шаманизму дает смещение на нужный указатель вектора перехода.
8)

Re: Нормальный дизассемблер для i8035 (i8051)

Ср апр 25, 2018 12:05:23

Почему - команда ORL A,#0F0h установит старшие 4 бита в "1"

В ячейке 37 счетчик без ограничения - считает 00h-FFh по кольцу

Вообще программа странная - куски осмысленного кода на которые нет переходов и переходы на куски бессмысленного кода.

ЗЫЖ - программа с бумажной распечатки лохматого года (цифровая версия не сохранилась) а вот теперь изделие возрождаем, а программа зашитая не работает.

Создается ощущение, что фейковая или какая-то промежуточная версия. Среди всего этого главное найти участок основного алгоритма (все-равно в другой процессор пойдет на 8051 ядре), а пока он не найден :cry:

Осталось 20% неразобранного когда, остальное таблицы или мусор.

Вот что делает код:

CPL A
MOV R2, А
MOV R0, #3Bh
MOV R1, #39h
CALL M0

M0:
MOV A, @R0
CPL A
ADD A, R2
JC M1
CPL A
MOV @R1, A
RET
M1:
MOV @R1, #0
RET

Re: Нормальный дизассемблер для i8035 (i8051)

Ср апр 25, 2018 13:42:24

Я по памяти пример дал - главное там ПРОСТАЯ ПОДСТАНОВКА, а не "считать в А данные из ячейки в РС+А и прыгнуть" (на что намекают двойные скобки возле А).
Если "всегда 0хFy" то искомая точка в области 0x00F0 - 0x00FF.
Касательно всяческих восстановлений - проще заново прожку написать под "черный ящик с указанными параметрами", нежли старое раскапывать.
Тем более, что для дизассемблера точное положение команд относительно адреса(а в Ваших фрагментах этого нету) играет весьма немаловажную роль.
Т.е. распечатка должна иметь следующие обязательные поля:
Код:
адрес | код | метка | мнемоника | комментарий
xxxx  | xx  | ..... |...........|....................

и таких строчек в пустографке столько, сколько байт в ПЗУ.
А уж затем те строчки заполняем сначала кодами в соответствии адресу и далее начинаем мозготреп со карандашиком.
8)

Re: Нормальный дизассемблер для i8035 (i8051)

Ср апр 25, 2018 15:17:23

Задача стоит выдернуть очень "хитрый" алгоритм, суть ноу-хау

Эмулятор вами данный посмотрел - сложно с ним - глючит и машину вешает ... видать "быстрая" слишком :-)

Хотчется подыскать какой-нибудь симулятор что-б прогонять куски кода.

Re: Нормальный дизассемблер для i8035 (i8051)

Ср апр 25, 2018 16:40:29

ТАК СТОП КРАН ПРИДЕЛАЙ МНОЖИТЕЛЬ СНИЗЬ У ПРОЦИКА

Re: Нормальный дизассемблер для i8035 (i8051)

Чт апр 26, 2018 12:19:12

На основе 8035/8048 никаких особо хитрых алгоритмов соорудить НЕ ПОЛУЧИТСЯ.
Разве что вариации на тему программно-аппаратной сцепки под конкретный тип кристалла в качестве кодера/декодера - но такой примитив весьма легко раскрывается ибо и структура кристалла ИЗВЕСТНА и система команд СТАНДАРТНА.
Тем более при всего-то 2048 строк с байтовой начинкой (выше нельзя - будет задействовано ВНЕШНЕЕ ПЗУ программ).
8)
С 48-м я под эмулятором не работал (просто там нечего эмулировать при "прожке на листочках" и макете) - а вот аналогия такового под 51-й вполне прекрасно в DOS окне под ХР работает.
:beer:

Да... Ешшо когда-то было в моде IDA PRO - может где инет подскажет или местны ХАКЕРЫ.
:wink:

Re: Нормальный дизассемблер для i8035 (i8051)

Чт апр 26, 2018 22:11:14

Это требуется установить - есть-ли алгоритмы, какие и насколь они хитры.

Дизассемблировано 100% обработано уже более 80%.

Программа занимает в общей сложности 8192 байта естественно во внешнем ПЗУ (I8035 (1816ВЕ35) не имеет встроенного ПЗУ). Страницы переключаются старшими битами порта 2. ОЗУ только внутреннее 60 байт не считая пространства RONов (используются только R0-R3 первого набора и аккумулятор). Примерно 40% таблицы и много табличных вычислений.

Сейчас уже полностью разграничил зоны данных и зоны программы, все метки обработаны. Уже 6 или 7 явных ошибок с формированием адресов для чтения памяти программ - ошибка на "1" бит всегда...

Начал делать таблицы переменных с диапазонами возможных значений.

Хреново что совсем нет контроля выхода переменных за пределы - только образка ANDами (может это и ускоряет - но сложно установить пределы возможного изменения переменных для проверки отдельных участков кода)

Самая проблема в полнейшем непонимании работы многих кусков кода связанных с математикой.

Найден неплохой эмулятор, но на нем опять-же не отработать переферию. Но это я пока не знаю как вообще без полноценного внутрисхемника, который позволяет ставить аппаратные точки останова, а лучше вести лог состояний регистров без замедления работы процессора, как старый ICE4000

ЗЫЖ - привязка к адресам ЖЕСТОЧАЙШАЯ - вставить в код 1 команду и все развалится - данные (таблицы) плотно перемежаются с программым кодом и обращение к их адресам вычисляемо из других таблиц. Да уж - собирали программу явно на бумажках.

Re: Нормальный дизассемблер для i8035 (i8051)

Пт апр 27, 2018 09:59:59

Как я понял у Вас ни опыта работы с ассемблером ни опыта дешифровок поготовому изделию...
8)
Внешняя память программ для 8035 и открыта для доступа и садомазохизм.
Разве что изврат с перебором адресов (аналогия мозготрепа для дешифровки времен Z80/I8080) здесь оправдан.
Ошибок там никаких нету - просто есть разница между обработкой смещения для машинного компилятора и для "ручной" компиляции для "коротких" переходов
Rel_map.pdf
(376.28 KiB) Скачиваний: 264

и "особое ограничение" по области раздела страниц (исключительно особенности 8035) для участков программ, расположенных в пределах нескольких страниц (начало на одной с продолжением на следующей).
8)

Re: Нормальный дизассемблер для i8035 (i8051)

Пт апр 27, 2018 17:59:01

Как я понял у Вас ни опыта работы с ассемблером ни опыта дешифровок поготовому изделию...


Писал для 8051 на ассемблере когда-то и под 8080 а вот 8035 не трогал Опыт дизассемблирования имеется, а вот структуру и особенности работы 8035 - увы.... Давно это было. Пишу под AVR немного (ассемблер)

Код полностью дизассемблирован разделен на данные и собственно программу, контрольно ассемблирован с полным совпадением.

Уже 1 ошибка 100% - переход на середину команды причем на код недопустимой операции. -1 к адресу перехода потребно

SCM Truncated 1.38 некорректно отрабатывает команду JMPP @А- вне зависимости от содержимого аккумулятора - переход на адрес 0 :evil:

Частично уже откоментировано и разобрано. Примерно для 30% переменных установлено их назначение и диапазоны изменения. Потихоньку движусь.

Нужен симулятор i8035, корректно отрабатывающий JMPP @A и MOVP A,@A

Следующий вопрос - как это работает :

MOV R0,#33h
MOV A,@R0 ; В ячейке указатель на ячейку таблицы 03-EF
JZ NEK_M1
XRL A,#1 ; A = A XOR 1
JZ NEK_M1 ; При каких значениях в А установиться флаг Z ?????
MOV A,@R0
Далее процедура чтения из памяти программ 2х последовательных байт

В приведенной таблице (из PDF) не совсем ничего не понял :cry:


ЗЫЖ Как тут более 1 пробела вставить ?

Re: Нормальный дизассемблер для i8035 (i8051)

Пт апр 27, 2018 19:27:08

Корректнее чем то, что я выложил вряд-ли найти удастся.
Литература по 48-м лежит в сундуке КОТА там весьма путево расписано
https://sunduk.radiokot.ru/loadfile/?load_id=1431792682
...
и по другим библиотекам - прочитайте/обновите в памяти.
Мне 35/48 вспоминать смысла нет - давно исчезнувшая и весьма жестко-неудобная мелкосхема.
Далее кой-чего от них к ПИКам среднемладшим перекочевало (относительно сегментации памяти), благо там этот вопрос несколько по-другому решен.

Код:
MOV   R0,#33h ; загрузить в указатель адрес точки назначения
MOV   A,@R0   ; (В ячейке указатель на ячейку таблицы 03-EF) считать в аккумулятор содержимое из ячейки ОЗУ с адресом 0х33
JZ   NEK_M1 ; если А=0 идем на метку
XRL   A,#1 ; (A = A XOR 1) по другому "инверсия содержимого бита 1 аккумулятора"
JZ   NEK_M1   ; (При каких значениях в А установиться флаг Z ?????) если результат = 0 идем на метку
MOV   A,@R0 ; иначе повторяем загрузку аккумулятора содержимым ОЗУ из ячейки 33

Кстати...
У 35/48 ФИЗИЧЕСКОГО флага Z НЕТУ - оценивается текущее содержимое аккумулятора.
Какой реальный физический адрес у того R0 (0х00 или 0х17) зависит от текущего регистрового банка.
Это касается режима косвенной загрузки указателей при работе из другого банка РОН (один из множества спецприемов для изголяжа над любителями дармовщинки и хитрых ветвлений с извратом).
:tea:
Ответить