SET A, 0x1E против SET A, 0x1F
Это моя первая попытка dpcu, я проверяю машинный код, сгенерированный сборкой dpcu-16
Я использую этот эмулятор: http://dcpu.ru/
Я пытаюсь сравнить код, сгенерированный
SET A, 0x1E
SET A, 0x1F
сгенерированный код выглядит следующим образом:
fc01
7c01 001f
Я не понимаю, почему размер операнда изменяется между этими двумя значениями
2 ответа
0x1F (dec:31) больше не является коротким литералом (значения от -1 до 30), поэтому его следует читать как аргумент "следующего слова".
Таким образом, коды операций:
SET A, 0x1E
SET = 00001
A = 00000
1E = 111111
op = 1111110000000001 = fc01
SET A, 0x1F
SET = 00001
A = 00000
NW = 011111
op = 0111110000000001 = 7c01 + 001f
Этот эмулятор, похоже, использует следующую версию спецификации DCPU-16, которая указывает, что литеральное значение того же слова для a
разрешает значения из 0xFFFF
(-1) до 0x1E
(30). Это означает, что для получения любого литерального значения вне этого диапазона ассемблер должен использовать литеральный синтаксис следующего слова, который делает операнд на один байт больше.