В прошлом семестре в колледже, мой учитель в классе языков программирования преподавал нам тайный язык под названием Пробел. В интересах изучения языка лучше с очень плотным графиком (промежуточные выборы), я записал интерпретатор и ассемблер в Python. Ассемблер был разработан для упрощения программ записи легко, и пример программы был записан с данной мнемоникой блока.
Теперь, когда это - лето, новый проект начался с цели быть для перезаписи интерпретатора и ассемблера для Пробела 0.3 с дальнейшим развитием, происходящим впоследствии. С тех пор существует так много дополнительного времени, чем прежде для работы над его дизайном, Вы представлены здесь со схемой, которая обеспечивает пересмотренный набор мнемоники для ассемблера. Это сообщение отмечено как Wiki для их обсуждения.
У Вас когда-либо был опыт с ассемблерами в прошлом? Были ли некоторые инструкции, что Вы думали, должен был быть переименован к чему-то другому? Вы думали вне поля и с другой парадигмой, чем, в котором мнемоника были названы? Если можно ответить на да на какой-либо из тех вопросов, Вам очень рады здесь. Ценятся субъективные ответы!
Управление стеком (IMP: [Пространство])
Управление стеком является одной из более общих операций, следовательно краткость IMP [Пространство]. Существует четыре инструкции по стеку.
hold N Push the number onto the stack
copy Duplicate the top item on the stack
copy N Copy the nth item on the stack (given by the argument) onto the top of the stack
swap Swap the top two items on the stack
drop Discard the top item on the stack
drop N Slide n items off the stack, keeping the top item
Арифметика (IMP: [Вкладка] [Пространство])
Арифметические команды воздействуют на лучшие два объекта на стеке и заменяют их результатом операции. Первый продвинутый объект считается левым из оператора.
add Addition
sub Subtraction
mul Multiplication
div Integer Division
mod Modulo
Доступ "кучи" (IMP: [Вкладка] [вкладка])
Команды доступа "кучи" смотрят на стек, чтобы найти, что адрес объектов сохранен или получен. Для хранения объекта продвиньте адрес затем значение и выполните команду хранилища. Для получения объекта продвиньте адрес и выполните получать команду, которая поместит значение, сохраненное в местоположение наверху стека.
save Store
load Retrieve
Управление потоком (IMP: [LF])
Операции управления потоком также распространены. Подпрограммы отмечены маркировками, а также целями условных и безусловных переходов, которыми циклы могут быть реализованы. Программы должны быть закончены посредством [LF] [LF] [LF] так, чтобы интерпретатор мог выйти чисто.
L: Mark a location in the program
call L Call a subroutine
goto L Jump unconditionally to a label
if=0 L Jump to a label if the top of the stack is zero
if<0 L Jump to a label if the top of the stack is negative
return End a subroutine and transfer control back to the caller
halt End the program
ВВОД-ВЫВОД (IMP: [Вкладка] [LF])
Наконец, мы должны смочь взаимодействовать с пользователем. Существуют инструкции IO для чтения и записи чисел и отдельных символов. С ними могут быть записаны стандартные программы обработки строк. Инструкции по чтению берут адрес "кучи", в котором можно сохранить результат вершины стека.
print chr Output the character at the top of the stack
print int Output the number at the top of the stack
input chr Read a character and place it in the location given by the top of the stack
input int Read a number and place it in the location given by the top of the stack
Вопрос: Как Вы перепроектировали бы, переписать или переименовать предыдущую мнемонику и для какой причины?
EDIT:
Если вы не возражаете против смешения опкодов и режимов адресации, используя синтаксис CISCy,
С другой стороны, код на основе стека обычно рассматривает push и pop как неявные. В этом случае "imm n" (немедленный) вместо "push". Тогда все стековые операции являются чисто стековыми операциями, что приятно и последовательно.
Я не уверен, как бы я написал «drop N» — в описании звучит так, как будто «drop 1» не эквивалентно «drop», что кажется странным.
Думаю, первое изменение, которое я бы предложил, это замена hold и drop на push и pop соответственно.
Затем, возможно, я бы переименовал copy в dup (я думаю, это наиболее распространенное название этой операции в языках, ориентированных на стек).
Я немного озадачен, почему часто у вас есть короткие однословные объяснения, которые отличаются от мнемоники. Например, мнемоника - Save, объяснение - Store. Мнемоника - Load, объяснение - Retrieve. Кстати, это две мнемоники, которые недостаточно объяснены для меня. Сохранить что где? Загрузить что откуда? (Edit вопрос был впоследствии отредактирован, чтобы сделать эти значения понятными)
Спасибо за интересный пост.
Я не уверен, что полностью понимаю ваш вопрос, так что, если я ошибаюсь, простите меня.
В дополнение к вашему стеку я, вероятно, добавил бы «регистр состояния», который содержит множество различных флагов (например, перенос, переполнение и ноль), которые устанавливаются арифматическими операторами.
Затем я бы добавил формы «если», которые проверяют эти флаги.
Я бы добавил инструкции битового сдвига и поворота (как влево, так и вправо), а также операции AND / OR / XOR / NOT, которые работают с битами.
Вы, скорее всего, захотите иметь какой-то доступ к памяти, если только вы не намерены, чтобы инструкции ввода-вывода обрабатывали память как поток значений, как в старой доброй машине Тьюринга.