Почему в двоичном представлении инструкций DCPU-16 стоит начальная 1

В настоящее время я возился с ассемблером DCPU-16 (см. http://0x10c.com/doc/dcpu-16.txt и http://jazzychad.net/dcpu.html).

Я не понимаю, как инструкции ассемблера преобразуются в шестнадцатеричный / двоичный файл.

В качестве примера возьмем инструкцию типа

SET B, 0x0002

который должен установить значение регистра B равным десятичному 2 (или шестнадцатеричный 0x 0002 или двоичный 0b000010)

Формат инструкции для DCPU-16

bbbbbbaaaaaaoooo

таким образом, 4 бита для кода операции на нижнем конце, 6 битов для первого значения, 6 битов для второго значения.

При преобразовании инструкции вручную, вот как я бы это сделал:

SET == 0x1    == 0b0001
  B == 0x01   == 0b000001
       0x0002 == 0b000010

заканчивая с полной инструкцией быть

0b0000100000010001 == 0x811

но правильное значение для DCPU-16

0b1000100000010001 == 0x8811

то есть ведущий 1 добавляется - почему это?

Я совершенно новичок в ассемблере и любых других видах хардкорных машинных инструкций низкого уровня, поэтому, пожалуйста, потерпите меня, если это очень глупый вопрос.

2 ответа

Решение

Согласно спецификации,

Значения: (6 бит)
    0x00-0x07: регистр (A, B, C, X, Y, Z, I или J, в этом порядке)
    ...
    0x20-0x3f: буквальное значение 0x00-0x1f (литерал)

Таким образом, литералы 0x00-0x1f определяются значениями инструкций 0x20-0x3f - то есть установлен самый старший бит (из 6). Итак, буквальный 0x02 будет иметь значение инструкции 0x22,

Значение инструкции 0x02 относится к C-регистру, так что, как вы думаете, должна быть собранная инструкция, 0b0000100000010001 == 0x811, на самом деле будет инструкция SET B, C,

Текстовое описание, на которое вы ссылаетесь, ничего не говорит о том, как инструкции собраны в исполняемый код, но вы можете выполнить обратный инжиниринг из Javascript на странице эмулятора, на которую вы ссылались. Кажется, что есть внутренняя функция с именем "pack", которая создает двоичные инструкции. Функция pack делает это:

words[0] += value << (4 + operand * 6);

который вызывается итеративно для проанализированного ввода. Я бы рекомендовал спросить поставщика / изобретателя (ей) о сборочной документации.

Другие вопросы по тегам