Alleksh Опубликовано 3 января, 2019 Поделиться Опубликовано 3 января, 2019 (изменено) Теперь перейдём к более сложным вещам. В том случае, если Вы сразу перешли сюда после первой части - не спешите, для начала попрактикуйтесь, узнайте получше FORTH.Сейчас я вам поведаю о том, как формируются слова в памяти. Для начала - создадим функцию DUMP: Она принимает на вход адрес, два значения. addr n1 n2 DUMP Выводит n1 строк по n2 байт по адресу addr.VARIABLE PARAM DECIMAL : DUMP 16 RADIX ! PARAM ! 0 DO CR DUP I PARAM @ * + DUP U. BS ." : " PARAM @ 0 DO DUP I + C@ DUP 16 < IF ." 0" THEN . LOOP PARAM @ 0 DO DUP I + C@ EMIT LOOP DROP LOOP ;Когда вы напишете в консоли ' %word% - в стек запишется адрес исполняемой части слова, которую можно выполнить написав EXECUTE. Перейдём к байт-коду данного слова.Инструкции RedCPU:http://www.eloraam.com/nonwp/redcpu.phpКаждое созданное Вами слово будет начинаться с 0x22, что является инструкцией ENT. Каждая следующая инструкция после ENT будет указателем на исполняемую часть другого слова. Например: Примечание: Каждая цифра, адрес и т.п. записывается наоборот(записав 0x4488 в памяти окажется 0x88 0x44). Если процессор видит команду 0x22 - он понимает, что далее необходимо брать по два байта, переходить по адресу и исполнять данный код. У вас, возможно, мог возникнуть вопрос: -Хмм, что же находится по адресу 0x55C? Что же, давайте воспользуемся командой >NAME(добавляет в стек адрес строки)Не удивительно. Если бы там не было команды EXIT - он начал бы исполнять то, что находится по адресу 0x0000, где находится всякий мусор. Давайте теперь узнаем, как записываются числа и строки, ведь у них нет определенного адреса:Как можно увидеть - используются специальные слова, которые определяют вхождение в строку и число. Так же можно заметить, что строка заканчивается на 0x00. Давайте теперь, учитывая это, напишем декомпилятор:HEX VARIABLE NOW_ADDR: DECOMPILE OVER 1 + NOW_ADDR ! 0 DO CR NOW_ADDR @ U. BS ." : " NOW_ADDR @ @ DUP 550 = IF DROP NOW_ADDR @ 2 + @ . NOW_ADDR @ 4 + NOW_ADDR ! ELSE FE2 = IF NOW_ADDR @ BEGIN 1 + DUP C@ DUP EMIT ." " 0= UNTIL NOW_ADDR ! ELSE NOW_ADDR @ @ >NAME TYPE NOW_ADDR @ 2 + NOW_ADDR ! THEN THEN LOOP ;Давайте теперь попробуем декомпилировать функцию SAVE":Все сработало отлично! Если возникли какие-либо вопросы - пишите их в комментарии к этому посту, постараюсь ответить. Тема достаточно сложная для восприятия. В следующей части мы ознакомимся как взаимодействовать с периферией(дисководы, сортроны, мониторы и т.п.) напрямую(не используя стандартные команды). Первая часть: https://f.simpleminecraft.ru/index.php?/topic/5936-redpower-компьютеры/ Вторая часть: https://f.simpleminecraft.ru/index.php?/topic/5941-redpower-компьютеры-вторая-часть-понимание-системы/ Третья часть: https://f.simpleminecraft.ru/index.php?/topic/5951-redpower-компьютеры-третья-часть-еще-глубже-ускорение-заводов/ Четвертая часть: https://f.simpleminecraft.ru/index.php?/topic/5965-redpower-компьютеры-четвёртая-часть-собственные-структуры-данных/ Пятая часть: https://f.simpleminecraft.ru/index.php?/topic/5989-гайд-по-redpower-компьютеры-пятая-часть-работа-с-сетью-дисками-чат/ Изменено 5 января, 2019 пользователем Alleksh 5 4 Ссылка на комментарий Поделиться на другие сайты Поделиться
EgorZH Опубликовано 3 января, 2019 Поделиться Опубликовано 3 января, 2019 Не знаю что это и зачем это, но лайк.? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти