Как моя инструкция знает, на что указывает адрес в стеке операндов?

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

Но теперь я добавляю глобальные переменные, которые хранятся в области виртуальной памяти, которую я называю "Ram". Значения, которые я там храню, конечно же, будут также проиндексированы по адресу, как и константы. Допустим, я помещаю два адреса в стек операндов, а затем запускаю свой FADD (Floating Add) - когда инструкция извлекает два адреса из стека для выполнения сложения, как он узнает, что эти адреса приходят из глобальной памяти, а не в постоянный пул? Каков стандартный подход?

1 ответ

Решение

FADD не должны быть адресации стека, это должны быть значения.

Вы должны иметь инструкции для констант и для чтения памяти. Эти инструкции должны помещать результирующее значение в стек, а не индекс в таблице констант или адрес. Индекс константы никогда не должен помещаться в стек - значение самой константы должно.

FADD Затем следует просто извлечь два значения из стека и добавить их - ему не нужно ничего искать в таблице констант или в памяти, потому что это уже должно было быть обработано инструкциями, посвященными этому.

Например, учитывая постоянную таблицу [0: 1.0, 1: 0x10]инструкция по добавлению 1.0 в зависимости от того, какое значение хранится по адресу 0x10 (скажем, 4.2) может выглядеть так (при условии CONST инструкции, которые помещают значение по заданному индексу в таблицу констант в стек и LOAD инструкции, которые выталкивают адрес стека и помещают значение по этому адресу в стек):

FCONST 0  // Stack: [1.0]
ICONST 1  // Stack: [1.0, 0x10]
FLOAD     // Stack: [1.0, 4.2]
FADD      // Stack: [5.2]
Другие вопросы по тегам