| Разработка и ромхакинг > Программирование |
| Ребенок изучает asm [SMD] |
| (1/11) > >> |
| SeregaZ:
значится ребенок это я... товарищ Томахомэ дал замечательную ссылку с примерами и объяснениями: https://mrjester.hapisan.com/04_MC68/Index.html на буржуйском правда... и не все понятно. вот полистал там всяко разно и пытаюсь все как-то в единую систему в голове привести. вот собственно вопрос про move. сначала простое: movea.l насколько я понимаю у него может быть только один набор параметров: --- Код: ---movea.l #$00000002, a0 --- Конец кода --- то есть пишем значение $2 в регистр a0. точнее не значение, а адрес памяти. то есть никакого другого варианта сочетания параметров тут быть не может? сами параметры пока собрались следующие: --- Код: ---d0, a0, (a0), $02(a0), (a0)+, -(a0), $02, #$02 --- Конец кода --- неисключено что какие-то варианты я конечно пропустил... хотелось бы вывести возможные сочетания параметров. типа если для movea.l может быть первым параметром #$00000002, а вторым а0(а0 до а7), то тогда это может выглядеть примерно так: то есть для первого параметра может быть вид только такой: #$00000002, а второй соответственно а0. для move вариантов сочетаний больше: вот пока какие варианты мне попадались: --- Код: ---move.w d0, d1 копирование из регистра d0 в регистр d1 на длину .w - 2 байта d0 = 8765 4321 d1 = 1234 5678 после этого копирования: d1 = 1234 4321 move.w d0, $0000104E копирование 2 байт (так как .w) из регистра d0 в адрес памяти $0000104E move.w $00001062, d0 копирование из памяти по адресу $00001062 2 байт (потому что .w) в регистр d0 move.w $00001061, d0 нельзя читать из памяти по нечетному адресу более 1 байта (.w или .l). приведет к ошибке. только если .b - 1 байт move.l $00000800, $00000822 копирование 4 байт (потому что .l) из памяти $00000800 в память $00000822 move.b #$44, (a0) (a0) будучи в скобках это не регистр, а указатель (адрес) на память. пишем значение $44 по адресу из a0 move.b #$9B, $04(a0) читаем адрес из а0, прибавляем к этому адресу $04, пишем по этому новому полученному адресу значение $9B move.b #$B5, (a0)+ пишем значение $B5 по адресу из a0. увеличиваем адрес в а0 на единичку. видимо если будет move.w - прибавляем не 1, а 2. move.l - прибавляем 4. move.b #$2E, -(a0) читаем адрес из а0, вычитаем единичку из этого адреса, пишем в полученный новый адрес значение $2E --- Конец кода --- то есть я предполагаю что варианты со скобами (а0) могут быть только в качестве второго параметра. а голая а0 наоборот не может быть вторым параметром, а только первым. какие варианты конструкций параметров и их сочетания для move я мог пропустить? |
| Sharpnull:
https://web.njit.edu/~rosensta/classes/architecture/252software/code.pdf страница 56, перечислены Addressing Mode. Как там и замечено, в ассемблерах, если у move указать регистр адреса как конечный, то будет movea. |
| Беларус:
Добавь в заголовок платформу - [SMD] Ребёнок изучает asm Сказал бы, что тема не в том разделе, но ты явно изучаешь ведь для создания программ для ромхакинга, да? :) --- Цитата: SeregaZ от 05 Июнь 2023, 09:15:11 ---какие варианты конструкций параметров и их сочетания для move я мог пропустить? --- Конец цитаты --- Глянь тут: https://info.sonicretro.org/SCHG:68000_ASM-to-Hex_Code_Reference |
| SeregaZ:
только только начинала вырисовываться схема... а тут началось. --- Код: ---move.b #$64, ($FFFFFFE0).w --- Конец кода --- чего это оно в скобках, а еще и .w ? вроде ж move.b - то есть про один байт. а там .w... потом выяснилось что варианты в скобках могут быть первым параметром тоже... --- Код: ---move.b (a3), d1 --- Конец кода --- потом ваще какая-то вакханалия начала творится: --- Код: ---move.b $14(a2,d6.w), ($FFFFE446).w --- Конец кода --- потом появляется pc --- Код: ---move.b $5E(pc,d0.w), d2 --- Конец кода --- потом оказалось что movea.l не единственный возможный вариант, но еще и movea.w потом movep.w, movep.l, moveq (ну хоть тут один вариант) и контрольным в голову: --- Код: ---movep.l 0(a0), d3 --- Конец кода --- накой ноль перед скобками? вроде ж надо прибавлять к а0 то число, что перед скобками... но там 0. какой с мысл в этой конструкции? чушь какая-то :) |
| Беларус:
Вот ещё глянь, специально поискал для тебя в своих сохранках: https://vladikcomper.scanf.su/sonic_guides_view.htm?2 Наиболее разжёванный вариант, вроде как. M68k замудрёнее x86 как по мне. Пару лет назад я ничего этого не знал и начал писать свой дизассемблер x86. После месяца мучений начал понимать, что тут что-то не так, и префиксы у него слишком сложные, чтобы брать их нахрапом. Потом уже засел за дизассемблер m68k с мыслью, что проц старенькой приставки уж точно должен даться легко :lol: Оказалось, новичкам не всегда везёт, а мне не повезло аж дважды - дважды наткнуться на сложнейшие CISC. Но зато очень повезло потом узнать про существование Capstone Engine - оно настолько облегчило мои страдания, что я потом долго присылал им донаты, пока России не перекрыли международные переводы. Так что если что - даже не вздумай браться за дизассемблер m68k, Capstone Engine очень просто подключить и использовать. Добавлено позже: Вот что может помочь разобраться - онлайн ассемблер. Покажет все валидные параметры при вводе. move.b #$64, ($FFFFFFE0).w действительно не принимает, хочет без .w, но это зависит от ассемблера, похоже. Добавлено позже: --- Цитата: SeregaZ от 05 Июнь 2023, 16:18:32 ---накой ноль перед скобками? --- Конец цитаты --- Скорее всего, это просто пример, чтобы не нагружать понимание лишними битами там справа. |
| SeregaZ:
этот онлайн ассемблер класс... но он точно работает? |
| Марат:
A7 - это стек поинтер Добавлено позже: Есть ещё симулятор easy68k. Я на нём компилирую код. |
| Беларус:
SeregaZ, как уже написал Марат, это указатель вершины стёка (sp - stack pointer). Его автоматически ставит на самый конец памяти этот онлайн компилятор (или процессор?), но можно поставить и вручную. В других системах он обычно выделяется отдельно, но тут в m68k он маскируется под обычный адресный регистр. Придётся запомнить. movea.l #$000010ff, a7 будет аналогичен movea.l #$000010ff, sp - можно писать и так, и так. Кстати, лучше сразу установи стёк с movea.l #$000010ff, sp, чтобы он указывал не на конец памяти где-то за экраном справа, а на конец памяти, который сейчас виден на экране. Добавлено позже: --- Цитата: Марат от 06 Июнь 2023, 11:41:38 ---easy68k --- Конец цитаты --- Интерфейс не страшноват ли для новичка? И он показывает валидные параметры при вводе и наведении, или только подсвечивает ошибки? |
| Марат:
--- Цитата: perfect_genius от 06 Июнь 2023, 12:22:02 ---И он показывает валидные параметры при вводе и наведении, или только подсвечивает ошибки? --- Конец цитаты --- Не думаю. Подсветка какая-то была. |
| SeregaZ:
ясно что ничего не ясно... это пока ладно. листаю https://info.sonicretro.org/SCHG:68000_ASM-to-Hex_Code_Reference и там есть такой момент: --- Код: ---move.b (a2,d0.w), d1 --- Конец кода --- и как его осознать то? :) как бы понятно что move это копирование чего-то куда-то. скопировать a2 куда-то я еще понимаю. скопировать (а2) куда-то я еще понимаю. но здесь что происходит (a2,d0.w)? второе: --- Код: ---move.b $5E(pc,d3.w), ($FFFFE446).w 0001 0001 1111 1011 11FB 305E E446 --- Конец кода --- что за pc? и второе, главное - в этой таблице указан результат 11FB 305E E446 - НО! если втулить в ASM68K.EXE эту конструкцию он родит на единицу меньше. 11FB 305C E446 где ашипка? у того парня на сайте, в компиляторе ASM68K.EXE или моих кривых руках? |
| Марат:
--- Цитата: SeregaZ от 06 Июнь 2023, 13:03:45 ---ясно что ничего не ясно... это пока ладно. листаю https://info.sonicretro.org/SCHG:68000_ASM-to-Hex_Code_Reference и там есть такой момент: --- Код: ---move.b (a2,d0.w), d1 --- Конец кода --- и как его осознать то? :) как бы понятно что move это копирование чего-то куда-то. скопировать a2 куда-то я еще понимаю. скопировать (а2) куда-то я еще понимаю. но здесь что происходит (a2,d0) --- Конец цитаты --- Это индексная адресация. Надо сложить содержимое регистров А2+D0. Причем у d0 надо брать только два младших байта на что указывает .w. Это будет адрес откуда надо прочитать один байт и поместить его в d1. Добавлено позже: --- Цитата: SeregaZ от 06 Июнь 2023, 13:03:45 ---второе: --- Код: ---move.b $5E(pc,d3.w), ($FFFFE446).w 0001 0001 1111 1011 11FB 305E E446 --- Конец кода --- что за pc? --- Конец цитаты --- pc - это program counter. Здесь относительная адресация. Означает взять адрес по-которому происходит исполнение + 2 байта(размер команды) + $5E + D3.w. Полученное значение будет адрес по которому нужно прочитать один байт в память по адресу $ffe446 |
| SeregaZ:
--- Цитата ---нужно прочитать один байт в память по адресу $ffe446 --- Конец цитаты --- точно $ffe446 ? не $ffffe446 или не $e446 ? просто меня смущает во первых: ($FFFFE446).w - w за скобками. во вторых компилируется это как: --- Код: ---11FB 305C E446 --- Конец кода --- то есть только E446, а не 00FF E446 или FFFF E446 не говоря уже про то расхождение: 11FB 305E E446 - у него на сайте 11FB 305C E446 - то что рожает ASM68k.EXE хотя видимо эта разница 5Е - 5С как раз и есть те 2 байта размера команды: --- Цитата ---адрес по-которому происходит исполнение + 2 байта(размер команды) + $5E + D3.w --- Конец цитаты --- то есть на сайте у него все-таки ошибка? |
| Марат:
--- Цитата: SeregaZ от 06 Июнь 2023, 16:36:57 ---точно $ffe446 ? не $ffffe446 или не $e446 ? --- Конец цитаты --- Да без разницы, всё равно запись будет в ОЗУ по адресу ffe446. Видимо, в самой команде уже указано, что запись идёт в ОЗУ. Поэтому компилируется более короткий код без ff. |
| SeregaZ:
продолжаю упарываться: 1. первое --- Код: --- movea.w #$6000, a4 move.w #$6000, a4 move.l (a1)+, a2 movea.l (a1)+, a2 --- Конец кода --- компилируется одинаковый результат что move что movea. я так понимаю нет никакой разницы? чисто визуально добавлена movea, а так вполне можно всегда писать move ? 2. второе дальше там movep --- Код: ---movep.w 0(a0), d3 movep.l 0(a0), d3 --- Конец кода --- что оно делает? 3. третье moveq (причем без вариантов типов переменной .w или .l или .b видимо существует только что-то одно) --- Код: ---moveq #$80, d1 --- Конец кода --- где видимо ошибка у него на сайте - 7280, так как компилятор ругается и вместо 7280 рожает 7261. видимо #$7F это максимально возможное значение. что оно делает? на этих вопросах видимо с move всё. |
| Марат:
--- Цитата: SeregaZ от 07 Июнь 2023, 07:42:32 ---moveq (причем без вариантов типов переменной .w или .l или .b видимо существует только что-то одно) --- Конец цитаты --- MoveQ - Move quick - передача с расширением знака. Например Moveq #$80,D0 Теперь в D0 = $FFFFFF80; Moveq #$7F, D0 - > D0 = $0000007F; Т.е. самый старший знаковый бит в байте копируется во все старшие биты. Это нужно, чтобы отрицательное число всегда оставалось отрицательным, а положительное - положительным. А quick, видимо, потому операнд дата занимает всего один байт. |
| SeregaZ:
опять у него ашипка >:( --- Код: ---pea d2 0100 1000 0100 0010 4842 swap d0 0100 1000 0100 0000 4840 --- Конец кода --- смотрю думаю фигня какая-то. как может быть практически одинаковый код... сунул в ASM68K.asm - аааа заругался :) я же знал что такого быть по идее не должно :) pea d2 улетает в черную дыру. нет такой буквы в алфавите. |
| paul_met:
Засев за изучения ассемблера Моторолы после Хитачи Сатурна и Мипса ПС1, меня сразу стала напрягать перемудрённая конструкция инструкций первого. Куча разных названий однотипных инструкций, перемешанный со значениями код инструкций, постоянно меняющийся размер инструкций, ограничения по использованию типов регистров и т.д. Хорошо хоть порядок байт не перевёрнутый, а то был бы "полный восторг". |
| Беларус:
--- Цитата: paul_met от 09 Апрель 2021, 21:30:20 ---А что сложного в преобразовании машинного кода в инструкции, если есть документация под рукой? --- Конец цитаты --- :) +ещё и несколько разных синтаксисов, что вон злит SeregaZ. В x86-64 всё то же самое, но ещё и порядок байт перевёрнутый :lol: --- Цитата: MetalliC от 09 Апрель 2021, 23:53:59 ---в CISC процессорах, с паровозом legacy-костылей 40-летней давности, типа x86 мозгами поехать можно --- Конец цитаты --- |
| SeregaZ:
ну... пока только сами конструкции разбираю. с вопросами что именно они делают - пока повременю. с того сайта большую половину уже внёс. почти везде понятно как разбирать эти команды. хотя думаю было бы не плохо внести на тот сайт исправления как с ошибками, так и недостающими вариациями вводимых параметров. а еще докучи новую колонку добавить с кратким описанием простыми словами что там происходит. |
| Беларус:
Рекомендую тебе поделить все инструкции на три группы - перемещение (move), операции над данными (add, div, or...), изменения хода исполнения инструкций (jmp, rte...). |
| Навигация |
| Главная страница сообщений |
| Следующая страница |