Перейти к содержанию

Гайд по RedPower. Low-level №1. Понимание системы.


Alleksh

Рекомендуемые сообщения

Теперь перейдём к более сложным вещам.
В том случае, если Вы сразу перешли сюда после первой части - не спешите, для начала попрактикуйтесь, узнайте получше 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 будет указателем на исполняемую часть другого слова.
Например:

 image.png.036da96be25eefd8754f7daca98641f9.png
Примечание: 
Каждая цифра, адрес и т.п. записывается наоборот(записав 0x4488 в памяти окажется 0x88 0x44). 

Если процессор видит команду 0x22 - он понимает, что далее необходимо брать по два байта, переходить по адресу и исполнять данный код.
У вас, возможно, мог возникнуть вопрос:
-Хмм, что же находится по адресу 0x55C?
Что же, давайте воспользуемся командой >NAME(добавляет в стек адрес строки)

image.png.f0f7a8e94a7b0bdce408a6348d6b4758.png
Не удивительно.
Если бы там не было команды EXIT - он начал бы исполнять то, что находится по адресу 0x0000, где находится всякий мусор.
Давайте теперь узнаем, как записываются числа и строки, ведь у них нет определенного адреса:

image.png.82b548598d714158a14c5c61e876606f.png
Как можно увидеть - используются специальные слова, которые определяют вхождение в строку и число. Так же можно заметить, что строка заканчивается на 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":
image.png.ef6c444e48ba8d2a2de51b05d1ed2e45.png
Все сработало отлично!

Если возникли какие-либо вопросы - пишите их в комментарии к этому посту, постараюсь ответить. Тема достаточно сложная для восприятия.
В следующей части мы ознакомимся как взаимодействовать с периферией(дисководы, сортроны, мониторы и т.п.) напрямую(не используя стандартные команды).

 

Первая часть: 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-компьютеры-пятая-часть-работа-с-сетью-дисками-чат/

 

 

Изменено пользователем Alleksh
  • Нравится 5
  • Рейтинг 4
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...