Почему в двоичном представлении инструкций 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);
который вызывается итеративно для проанализированного ввода. Я бы рекомендовал спросить поставщика / изобретателя (ей) о сборочной документации.