Разработка и ромхакинг > Программирование
Ребенок изучает asm [SMD]
Segaman:
Вот опкоды в хексе.
Тут две странички с сортировкой:
1) по битам
2) по названию команды
На счет отличий MOVE от MOVEA:
* Размер данных: MOVE автоматически определяет размер данных, основываясь на размерности операндов, тогда как MOVEA работает только с адресами и не учитывает размер самих данных.
* Расширение адресов: Когда MOVEA копирует 16-битный адрес в 32-битный регистр, она расширяет адрес, добавляя ведущие нули, чтобы заполнить оставшиеся биты. MOVE не выполняет автоматического расширения адреса.
Расширение адреса крутая штука, потому что адрес можно записать как 2 байта вместо 4, но адрес должен быть в диапозоне с $FFFF8000 до $FFFFFFFF
Тогда адрес можно записать как ($FFFFC400).w и в роме команда будет содержать 2 байта адреса $C400 вместо $FFFFC400
Ti_:
--- Цитата: Segaman от 11 Июнь 2023, 04:38:49 ---На счет отличий MOVE от MOVEA:
* Размер данных: MOVE автоматически определяет размер данных, основываясь на размерности операндов, тогда как MOVEA работает только с адресами и не учитывает размер самих данных.
* Расширение адресов: Когда MOVEA копирует 16-битный адрес в 32-битный регистр, она расширяет адрес, добавляя ведущие нули, чтобы заполнить оставшиеся биты. MOVE не выполняет автоматического расширения адреса.
--- Конец цитаты ---
Все 16-битные операции с An регистрами знако-расширяемые до 32 сами по себе, включая "cmpa.w", а не только move.
Но только с .w , так как с .l расширять уже некуда, а .b не бывает с Ax регистрами. Но отличие в том, что movea не меняет никакие флаги статуса (xnzvc).
MetalliC:
--- Цитата: paul_met от 08 Июнь 2023, 19:00:33 ---Засев за изучения ассемблера Моторолы после Хитачи Сатурна и Мипса ПС1, меня сразу стала напрягать перемудрённая конструкция инструкций первого. Куча разных названий однотипных инструкций, перемешанный со значениями код инструкций, постоянно меняющийся размер инструкций, ограничения по использованию типов регистров и т.д. Хорошо хоть порядок байт не перевёрнутый, а то был бы "полный восторг".
--- Конец цитаты ---
это потому что SuperH и MIPS это наборы инструкций типа RISC, а МС680х0 это классический CISC
можешь еще глянуть на систему команд более старых хитачей, семейство "Hitachi H8", там тоже CISC с плюс-минус схожими наворотами как у моторол 68К
--- Цитата: perfect_genius от 06 Июнь 2023, 12:22:02 ---Кстати, лучше сразу установи стёк с movea.l #$000010ff, sp, чтобы он указывал не на конец памяти где-то за экраном справа, а на конец памяти, который сейчас виден на экране.
--- Конец цитаты ---
так как ты пишешь делать низя, в указателе стека должно быть чётный адрес, на старте обычно в него пишется [последний адрес ОЗУ]+1
а если сделать по твоему, по идее, при первой же попытке прыжка в подпрограмму проц улетит в исключение, от попытки записи 32бит значения по нечетному адресу
Беларус:
MetalliC, спасибо, действительно. Изучаю m68k вместе с автором темы и надеялся на подстраховку того онлайн ассемблера. А он действительно глючный, похоже.
SeregaZ:
я кароче ослепну скоро... уже глаз дергается :)
сидел такой возмущался почему move без знаков (.w, .l, .b) мне все портит с not, neg и lea... плевался плевался, но вроде все сделал и стало разбирать... вроде бы. потом дошла очередь до rol, ror, roxl, roxr, asr, lsl, lsr... и причем некоторые еще без знаков. да твою ж мать... решил отвлечаться - сделал разукраску битов, и только после неё что-то вроде начало прояснятся:
Беларус:
Не пробовал искать в сети что-то подобное? Вдруг ты повторяешь уже созданное?
Ты собрался вводить биты вручную, чтобы не прибегать к помощи ассемблера? :)
Я собирался делать что-то подобное для x86, но всё же сначала поищу готовые варианты. У тебя получается что-то любопытное :thumbup:
SeregaZ:
ориентируюсь на сайт, что мне здесь в теме посоветовали: https://info.sonicretro.org/SCHG:68000_ASM-to-Hex_Code_Reference
но там местами ошибки, неточности, и бывает не хватает команд и вариантов параметров к ним.
Добавлено позже:
--- Код: --- addq.l #4, a7
addq.l #4, sp
--- Конец кода ---
опять одинаковый код на выходе - $588F. зачем этот sp придумали?
Добавлено позже:
азазазаз пришло время практики :)
понятно что перепрыгивать кусочки данных, как Ида делает - мое творение не умеет, но ежели там код идет сплошняком, как оставшиеся у меня кусочки функций от мк3, когда там пытался переместить данные после гемс банков вверх, чтобы новые банки писать уже после всех важных данных и до конца рома, не стесняясь в размерах. так вот втулил первый кусочек и почти как в Иде :)
на втором кусочке правда спотыкнулось... jsr ему видите ли не понравилось... пойду смотреть.
Добавлено позже:
тааааак... Ида глючная? (естесно моя программа не может быть глючная :))))
1. скармливаем ASM68K.exe код
--- Код: --- jsr $1E(pc)
--- Конец кода ---
2. рожается файл с содержимым:
--- Код: ---4E BA 00 1C
--- Конец кода ---
3. втуливаем этот файл Иде и она его понимает как:
--- Код: ---jsr $1E
--- Конец кода ---
эм... а куда оно потеряло (pc) ?
4. моя приблуда родит как:
--- Код: ---jsr $001C(pc)
--- Конец кода ---
это то понятно, что мне пока не понятно почему этот самый pc дает минус 2 к числу, стоящему перед... но пока не в этом вопрос, а в том почему Ида брыкается?
соответственно в коде мк3 есть момент:
--- Код: ---4E BA FF D0
--- Конец кода ---
то есть 4E BA должно по идее разобрать как jsr $*(pc)
но Ида этот момент показывает как:
--- Код: ---jsr $FFFFE2
--- Конец кода ---
я так понимаю она уже изначально просчитывает этот нюанс с pc и вычитает заранее, показывая готовый результат. так сказать упрощает визуально код. ноооо это не точно :)
кто может прокомментировать сию ситуацию?
Добавлено позже:
Ида 6.8, 64 битная, с установленными какими-то там дополнительными файлами для 68000, взятые отсюда с форума сто писят лет назад.
Добавлено позже:
*забился в угол и плачет, случайно найдя еще одну неизвестную доселе команду: movem.l d1/a1,-(sp)
Марат:
--- Цитата: SeregaZ от 13 Июнь 2023, 12:51:55 ---это то понятно, что мне пока не понятно почему этот самый pc дает минус 2 к числу, стоящему перед...
--- Конец цитаты ---
Ты даёшь команду процессору прыгнуть на адрес $1E и выполнить что-то. Он вычисляет адрес так. $1E - текущий адрес pc (после того, как он прочитал код команды, который равен два байта, то адрес pc уже на два байта больше, чем адрес по которому стоит команда jsr $1E(pc)). Соответственно, если адрес команды jsr $1E(pc) = $0, то адрес pc в момент вычисления будет = $2. $1E - 2 = $1C.
Беларус:
--- Цитата: SeregaZ от 13 Июнь 2023, 12:51:55 ---опять одинаковый код на выходе - $588F. зачем этот sp придумали?
--- Конец цитаты ---
Специально ведь выделял тебе красным до этого. Или не знаешь зачем нужен стёк? Он нужен как временная память для адресов возврата из функции, для её параметров и других временных данных. Когда функция вызывает другую, а та третью, то где-то надо складировать все эти адреса для возврата назад.
--- Цитата: SeregaZ от 13 Июнь 2023, 12:51:55 ---найдя еще одну неизвестную доселе команду: movem
--- Конец цитаты ---
Если бы не пропускал то, что скинул Sharpnull, то это для тебя не было бы неожиданностью.
Я потому и скинул разные источники, т.к. в каждом могут быть ошибки или другой синтаксис, и поэтому надо бы уточнять собирая информацию.
Марат:
--- Цитата: SeregaZ от 13 Июнь 2023, 12:51:55 ---эм... а куда оно потеряло (pc) ?
--- Конец цитаты ---
Это уже обсуждалось
https://www.emu-land.net/forum/index.php/topic,26905.msg385479.html#msg385479 здесь. Потом это было исправлено, возможно, в новых версиях.
SeregaZ:
да вааааще без понятия что такое стек. и даже знать не хочу. с точки зрения Незнайки из Солнечного Города эта дикая ахинея лепить одни и те-же параметры по сути, но разного написания, разводя не нужную путанницу (и панику, как в моем случае).
по поводу того мануала - я листал. и расстройства были не из-за незнакомой команды, а их, я полагаю, еще прилично всплывет уже непосредственно на практике - меня расстроило больше наличие замудреного параметра d1/a1, который ранее не попадался. плюс сама научная писанина для меня не понятна. визуально бы, как на том сайте https://info.sonicretro.org/SCHG:68000_ASM-to-Hex_Code_Reference чтоб как для детей было - вот тогда дааа :) а пока придется пихать всевозможные варианты в ASM68K.exe смотреть что он рожает и пытаться увидеть там схему как это выстраивается. либо на совсем крайний случай - сразу запилить всевозможные готовые варианты. но это моветон... желательно бы осмыслить как это выстраивается.
по поводу pc - я рад, что у меня оказывается верно. хотя и несколько расстроен, что Иде доверять оказывается полностью нельзя...
paul_met:
SeregaZ, В твоём случае следовало бы сперва потренироваться на более простом и логичном ассемблере для SH2 (Сатурн) или MIPS r3000A (PS1). Там все инструкции постоянного размера и без таких жёстких ограничений, как (регистр для адреса или регистр для значения). Да и генерировать их проще, так как есть проги для этого (SSIG и PSIG).
SeregaZ:
только только что-то вроде стало выяснятся... и на тебе. это самое d1/a1 вылезло опять :) я так понимаю что это просто своеобразное перечисление по порядку? типа запятую нельзя ставить - не так поймет, а вот дробь или минус (точнее тире) - как бы запятая...
--- Код: --- asm68k.exe ida
movem.l a1/a2, (a6) movem.l a1-a2,(a6)
movem.l a2/a1, (a6) movem.l a1-a2,(a6)
movem.l a1-a2, (a6) movem.l a1-a2,(a6)
movem.l a3/a2, (a6) movem.l a2-a3,(a6)
movem.l a2/a3, (a6) movem.l a2-a3,(a6)
;movem.l a3-a2, (a6) ; ошибка
movem.l d1/a2, (a6) movem.l d1/a2,(a6)
movem.l a2/d1, (a6) movem.l d1/a2,(a6)
movem.l a1/a2/a3, (a6) movem.l a1-a3,(a6)
movem.l a1/a2/a3/d4, (a6) movem.l d4/a1-a3,(a6)
movem.l d4/a1-a3,(a6) movem.l d4/a1-a3,(a6)
movem.l a1/a5/a3, (a6) movem.l a1/a3/a5,(a6)
--- Конец кода ---
не говоря уже про movem.l a1, -(a4), где определение a или d и их номера идут задом наперед по отношению к остальным вариантам (a4), (a4)+ и так далее. вот жеж проблемы на ровном месте придумывают :)
Добавлено позже:
paul_met, тренироваться конечно хорошо... но я бы хотел практическое применение. поскольку фанат SMD, то хотелось бы сразу в неё упоротся.
paul_met:
SeregaZ, Значит, будешь дольше разбираться с не самым нелёгким процем ввиду отсутствия должного опыта.
Лучше отслеживать результат исполнения инструкций непосредственно в отладчике. Тогда синтаксис станет понятнее.
SeregaZ:
доделал первую часть с декомпиляцией и все... второй день аппатия напала. хотя думаю надо теперь обратную операцию из текста в код переводить. а к ней еще надо окошко редактора, но чот все что форуме моего языка подсмотрел - все не совсем то. да, близко, круто... но не совсем то :) есть на канвасе, есть на синтриле. и текст вводится, и красится цветами, и автозамена, и сохранение табуляций при прыге ентыром на новую строку... но кода километры и хрен в нем разберешься. мне то все свистоперделки, что там есть - нафиг не нужны. мне надо что-то типа 3 колонки. в первой номерация строк, во второй метки, как ИДА ставит, и третье уже сами команды. пока просто стандартное окошко ввода текста... начну наверное потихоньку добавлять разбор текстовых команд... но тут еще мои секс игрушки с алиэкспреса начали приходить. значит осталось времени от силы дня 2-3, а потом упрусь с этими игрушками надоооооооооолго...
Беларус:
Вот тебе ещё один вариант таблицы всех опкодов. Правда, они тут в бинарном порядке.
qq108201645:
easy68k source code
GManiac:
Был ещё такой вариант, пояснения смотреть на обоих листах.
https://www.emu-land.net/forum/index.php/topic,42330.msg567560.html#msg567560
SeregaZ:
дааааа вторая часть пока так и зависла... как бы с регулярками вроде разобрался - осталось нудятина: вбить эти команды, чтоб система парсила команды и параметры и рожала бин файл на выходе... а по первой части то все в принципе уже отлажено. осталось только неизвестные команды нарыть и научить метки ставить как в иде. там еще пару мыслей есть.
но затык то в чем: вчера с алиэкспресса последние игрушки долетели - сижу вот играюсь... думаю как бы их на плате разместить, чтоб красиво и функционально было :)
Беларус:
GManiac, сравнил с вариантом от Segaman'а, и твоя версия будто дополненная, уточнённая.
Навигация
Перейти к полной версии