Разработка и ромхакинг > Программирование
Ребенок изучает asm [SMD]
Марат:
DrMefistO, у меня вопрос, как обратно добавить ром в проект? Изначально при открытии проекта Генс знает какой ром запускать. Но потом по какой-то причине это сломалось. И теперь надо каждый раз при открытии проекта открывать нужный ром через генс.
DrMefistO:
--- Цитата: Марат от 07 Февраль 2024, 14:54:43 ---DrMefistO, у меня вопрос, как обратно добавить ром в проект? Изначально при открытии проекта Генс знает какой ром запускать. Но потом по какой-то причине это сломалось. И теперь надо каждый раз при открытии проекта открывать нужный ром через генс.
--- Конец цитаты ---
В smd_ida_tools2 как сам Gens, так и ром в нём нужно выбирать вручную, т.к. сейчас gens не собирается в один файл с плагином для иды.
SeregaZ:
тут в процессе запиливания очередного шедевра у меня возникли некоторые затруднения... как бы нормальная программа состоит из блоков. типа тут функция такая, тут сякая и все они взаимосвязаны между собой. почему с ромами на сегу это не работает? то есть зная адрес начальной функции Reset - заходим по этому адресу, читаем код, и если там есть ссылки на другие участки рома с кодом - прыгаем туда тоже и читаем. но чото у меня таким образом находит не все. хотелось бы понять почему :) ведь если прямой связи между участками кода нет, то как при сборе рома эти участки в ром попадают? на ум приходит только одна мысль, что типа возможно что основной код крутится на 68к и, скажем, частично какой-то код отправляется в Z80, там работает и предположим должен вернутся в 68к в другое место. тогда я еще пойму почему при разборе 68к код находится, но не весь. нооооо эта моя теория такая себе... слабенькая.
Марат:
Потому что не у всех функций адреса абсолютные. А такие jsr (a0, d0), т.е. адрес заранее не известен. Или такие jmp (a0).
Беларус:
Да, блоки инструкций соединены друг с другом - блоки вызывают другие блоки и возвращаются назад, или же прыгают без возврата. Но есть и прыжки по адресу, который в регистре или памяти. Этот адрес создаётся инструкциями перед тем как прыгнуть по нему. Зачем это нужно? Например, switch примерно так работает. Есть адрес первого элемента массива адресов для прыжка (пусть этот массив начинается с 0x1234, например). В регистр записываем case (пусть это 2), умножаем его на размер адреса (2 байта) и прибавляем этот самый адрес начала массива. Вот мы получили адрес адреса в массиве (0x1238) и теперь можем прыгать по нему. Получается эффективнее, чем проходить по огромному ряду if'ов. Поправьте меня, если уже забыл детали.
Можно узнать адрес этого массива увидев, как инструкции записывают его в регистр и начинают что-то мутить с ним, а потом заканчиваются прыжком по этому регистру. Но как определить размер массива - уже непонятно, это меня и интересует в работе Иды. Видимо, надёжного варианта нет? Обычно, этот массив можно увидеть после блока с прыжком по регистру, но не всегда. Придётся реверсить Иду ^_^
В своём дебаггере я планирую сделать функцию, собирающую эти адреса. Но это уже динамический анализ, не статический. Т.е. придётся проходить игру несколько раз по разному.
SeregaZ:
ну пока моя первоначальная цель сделать парсер, чтобы он на выходе рожал 100% совместимый код с существующим ASM68K.exe. понятно что ASM68K.exe кривой и косой и местами прозёвывает команды с ошибками, но очень удобно что он в количестве одна штука и очень маленький и простой в использовании. и можно пихать копию в каждую папку с проектом. ида так делать код не умеет. да и докучи ида еще и с ашипкаме код рожает :) я прям удивился когда увидел. святая ида и на тебе!
DrMefistO:
--- Цитата: SeregaZ от 14 Февраль 2024, 02:02:09 ---ну пока моя первоначальная цель сделать парсер, чтобы он на выходе рожал 100% совместимый код с существующим ASM68K.exe. понятно что ASM68K.exe кривой и косой и местами прозёвывает команды с ошибками, но очень удобно что он в количестве одна штука и очень маленький и простой в использовании. и можно пихать копию в каждую папку с проектом. ида так делать код не умеет. да и докучи ида еще и с ашипкаме код рожает :) я прям удивился когда увидел. святая ида и на тебе!
--- Конец цитаты ---
Нельзя автоматически сконвертировать ассемблированный код в исходный. Есть множество причин, вот некоторые:
1. Нет различий между засовыванием в регистр адреса и засовыванием в регистр числа
2. Какие-то данные могут использоваться относительно разных базовых адресов.
3. Выше уже написали: относительные прыжки и вызовы.
Добавлено позже:
Хочешь, чтобы ида тебе сразу весь ром красиво разложила - такого не бывает. Работа реверс-инженера в этом и заключается - нужно помогать интеррактивному дизассемблеру.
SeregaZ:
тем временем меня расстраивает слишком долгое время загрузки кода. сам парсинг на команды то шустрый, ноооооо потом, чтобы это все выводить в окошке - я делаю копию массива текстовых строчек кода, и форматирую, добавляя пустые строки между блоками и добавляю "бэшки" (dc.b) где код не разобран. вот этот процесс и занимает кучу времени при запуске.
решил перейти от массива к лист. хотя меня смущает этот самый лист, так как по логике ведь там происходит каждый раз как бы редим массива. при редиме как раз и жрется куча времени. если в первом случае я просто создаю большой массив с запасом, а потом просто не использую пустые незаполненные строчки в конце массива, то есть редима каждый раз никакого нет, то вот при работе листа, по идее, при добавлении нового элемента, как раз и должен происходить этот самый "как-бы редим". зато лист будет удобен, если я начну делать редактирование. удалить строчку, добавить - там все делается влегкую. с массивом тупизм в этом плане.
пойду сделаю копию проекта, и попробую с листом. хотя настроен я весьма скептически на этот лист :)
DrMefistO:
--- Цитата: SeregaZ от 14 Февраль 2024, 10:45:25 ---тем временем меня расстраивает слишком долгое время загрузки кода. сам парсинг на команды то шустрый, ноооооо потом, чтобы это все выводить в окошке - я делаю копию массива текстовых строчек кода, и форматирую, добавляя пустые строки между блоками и добавляю "бэшки" (dc.b) где код не разобран. вот этот процесс и занимает кучу времени при запуске.
решил перейти от массива к лист. хотя меня смущает этот самый лист, так как по логике ведь там происходит каждый раз как бы редим массива. при редиме как раз и жрется куча времени. если в первом случае я просто создаю большой массив с запасом, а потом просто не использую пустые незаполненные строчки в конце массива, то есть редима каждый раз никакого нет, то вот при работе листа, по идее, при добавлении нового элемента, как раз и должен происходить этот самый "как-бы редим". зато лист будет удобен, если я начну делать редактирование. удалить строчку, добавить - там все делается влегкую. с массивом тупизм в этом плане.
пойду сделаю копию проекта, и попробую с листом. хотя настроен я весьма скептически на этот лист :)
--- Конец цитаты ---
Есть виртуальные листы. Выводить строчки не все целиком, а чанками, по количеству Видимых.
SeregaZ:
с отображением то в окне я так и делаю. в зависимости от положения вертикального скроллбара делается вывод с какого значения по какое надо выводить... тут все в порядке. не в порядке форматирование главного общего массива :) где бы строчки шли друг за другом для удобства отслеживания и привязки к положению вертикального скроллбара.
SeregaZ:
чот так и не смог победить версию с листом :) где-то повылазили глюки... никак не могу найтить где именно. но есть одна теория...
в общем смотря на иду, где она останавливает блоки и разделяет - пока определил для себя что во время парсинга надо останавливаться на следующих функциях:
--- Код: ---rte, rtr, rts, jmp, bra
--- Конец кода ---
понятно, что я еще пока только начал и может там еще какие есть "финальные" функции... и вроде как bsr туда не входит. в смысле после неё есть дальше код в иде. но в одном месте она все-таки срабатывает как "конец функции".
вон чуть ниже точно такая-же bsr и концом она не является. каким образом ида все-таки поняла что первый bsr это конец функции? потому что всплыл дальше адрес, как вторая функция, на последующий адрес после brs? и типа поэтому ида решила что после первого bsr есть конец функции?
Марат:
Видимо, потому что sub_7EC, вызывается из других мест типа JSR sub_7EC или просто JMP sub _7EC. А после второго bsr, даже метки нет.
SeregaZ:
непутевый ASM... по моему этот дальтоник не различает :cry:
--- Код: --- exg d1, d0
exg d0, d1
--- Конец кода ---
Беларус:
Ты уже приходишь к алгоритму дизассэмблера. Не лучше ли тебе тогда делать его? :lol:
Недавно в теме по GensIDA один чел тоже так начал писать проходчик по блокам, но бинаринка.
SeregaZ:
так в этом и суть. но пока что-то он ошибочно начал прыгать и все путать :) но меня убивает оооооооочень долгая загрузка. понятно еще куча команд не внесена, ошибочные параметры местами, прыжки не верно читает, и читает только то что явно связано с Reset... но я доволен как слон.
Добавлено позже:
и я так понимаю что не стоит рассматривать suba как указатель куда-либо? а то программа моя там начитала в заголовке с адреса Reset на свою голову несуществующих команд...
SeregaZ:
пока не представляю как реализовать "горячее" дизассемблирование по клику мышкой в необработанный участок в окошке редактора... так-же надо сделать клик по метке, чтобы она подсвечивалась и прыгала во втором окошке в то место где она собственно и находится. потом уже предвижу проблему, которую хрен знает как победить :) как бы если метка прыгает на начало команды я еще пойму... но что делать если метка получается прыгнет не на саму команду, а на её данные?
типа
0x1234 0x4567
где 1234 команда джамп, а 4567 адрес джампа куда прыгать. и предположим где-то в коде попалась метка, которая ссылается не на начало всей этой конструкции - то есть не на 0х1234, а сразу на 0х4567. но у меня то эти данные уже "съедены" внутри функции и тогда в моем случае метка будет влеплена после джампа и после данных джампа, то есть метка станет ошибочной. а значит ром соберется с ошибкой, если вообще соберется. пока конечно такой проблемы еще не попадалось, но я разбирал то только парочку ромов всего... да и я явно какие-то редкие команды вовсе пропустил :)
SeregaZ:
конечно не все хотелки реализовал, но вполне доволен результатом :)
глюки конечно фиксю... но и добавляю новые :)
SeregaZ:
в очередной раз ASM68K.exe подводит :cry: может конечно эти команды равнозначны... но по итогу это разные опкоды и ром получается не идентичный.
--- Код: --- cmp.b #$B, d4
cmpi.b #$B,d4
--- Конец кода ---
типа должно было сделать для
cmp.b #$B, d4 ==== B83C
а делает 0С04, как если бы там было cmpi.b #$B,d4
или я может какой-то обязательный параметр в консоли прозевываю... потому что хз для чего они нужны. с /p собирает. но видел другие проекты, где этих параметров... куча навалено. что делают - хз.
--- Код: ---asm68k /p BCout.asm,BCout.bin
--- Конец кода ---
Добавлено позже:
а вот тут то почему ида решила пропустить два байта? и так она дальше кусками идет. код, такие двухбайтовые пропуски распарсеного кода, опять код. ведь addq это не конец функции или процедуры или еще чего. не понятно нифига... естественно что на таком месте у меня все спотыкнулось :)
Томахомэ:
--- Цитата: SeregaZ от 22 Февраль 2024, 14:05:50 ---в очередной раз ASM68K.exe подводит :cry: может конечно эти команды равнозначны... но по итогу это разные опкоды и ром получается не идентичный.
--- Код: --- cmp.b #$B, d4
cmpi.b #$B,d4
--- Конец кода ---
типа должно было сделать для
cmp.b #$B, d4 ==== B83C
а делает 0С04, как если бы там было cmpi.b #$B,d4
или я может какой-то обязательный параметр в консоли прозевываю... потому что хз для чего они нужны. с /p собирает. но видел другие проекты, где этих параметров... куча навалено. что делают - хз.
--- Код: ---asm68k /p BCout.asm,BCout.bin
--- Конец кода ---
Добавлено позже:
а вот тут то почему ида решила пропустить два байта? и так она дальше кусками идет. код, такие двухбайтовые пропуски распарсеного кода, опять код. ведь addq это не конец функции или процедуры или еще чего. не понятно нифига... естественно что на таком месте у меня все спотыкнулось :)
--- Конец цитаты ---
Конечно, неравнозначны. Ибо CMPI это сравнение с непосредственным операндом.
SeregaZ:
а вот чего я и боялся :) когда метка прыгает не на саму команду, а на её параметр. в результате у меня метка путается и ставится неверно... у меня предполагается что метка идет всегда перед командой, а никак не может прыгать на параметр команды. то есть получается метка должна была быть между командой и её параметрами.
хотелось бы конечно надеяться что это изначально афторы накосячили. тем более что это Stone Potectors, которая вроде как не выходила...
Навигация
Перейти к полной версии