Разработка и ромхакинг > Программирование
Ребенок изучает asm [SMD]
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...).
Навигация
Перейти к полной версии