У Вас есть предложения для них мнемоникой блока?

В прошлом семестре в колледже, мой учитель в классе языков программирования преподавал нам тайный язык под названием Пробел. В интересах изучения языка лучше с очень плотным графиком (промежуточные выборы), я записал интерпретатор и ассемблер в 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

Вопрос: Как Вы перепроектировали бы, переписать или переименовать предыдущую мнемонику и для какой причины?

5
задан 10 revs, 3 users 73% 26 November 2014 в 02:35
поделиться

3 ответа

  • толкнуть #n, чтобы было ясно, что n является немедленным.
  • «swap» иногда есть «exc» или «exch», я думаю.
  • "save" обычно "st" (store)
  • "load" обычно "ld"
  • "call" также может быть "jsr" или "bl".
  • "goto" обычно "jmp" или "bra"
  • "if=0" обычно "beq"
  • "if<0" обычно "blt"
  • "return" обычно "ret" или "blr"
  • "exit" обычно "halt"/"hlt" в контексте процессора.
  • «print chr» и «print int» могут быть «print.c» и «print.i». Существует много способов указания вариантов инструкций, но обычно это не в операндах.

EDIT:

Если вы не возражаете против смешения опкодов и режимов адресации, используя синтаксис CISCy,

  • "push (sp)" вместо "copy"
  • "push N(sp)" вместо "copy N" (по модулю умножая на размер слова)
  • "push *(sp)" вместо "load" (за исключением того, что он делает pop перед нажатием загруженных значений)
  • "pop *1(sp)" вместо "push" (за исключением того, что он фактически всплывает дважды)

С другой стороны, код на основе стека обычно рассматривает push и pop как неявные. В этом случае "imm n" (немедленный) вместо "push". Тогда все стековые операции являются чисто стековыми операциями, что приятно и последовательно.

Я не уверен, как бы я написал «drop N» — в описании звучит так, как будто «drop 1» не эквивалентно «drop», что кажется странным.

2
ответ дан 14 December 2019 в 08:44
поделиться

Думаю, первое изменение, которое я бы предложил, это замена hold и drop на push и pop соответственно.

Затем, возможно, я бы переименовал copy в dup (я думаю, это наиболее распространенное название этой операции в языках, ориентированных на стек).

Я немного озадачен, почему часто у вас есть короткие однословные объяснения, которые отличаются от мнемоники. Например, мнемоника - Save, объяснение - Store. Мнемоника - Load, объяснение - Retrieve. Кстати, это две мнемоники, которые недостаточно объяснены для меня. Сохранить что где? Загрузить что откуда? (Edit вопрос был впоследствии отредактирован, чтобы сделать эти значения понятными)

Спасибо за интересный пост.

4
ответ дан 14 December 2019 в 08:44
поделиться

Я не уверен, что полностью понимаю ваш вопрос, так что, если я ошибаюсь, простите меня.

В дополнение к вашему стеку я, вероятно, добавил бы «регистр состояния», который содержит множество различных флагов (например, перенос, переполнение и ноль), которые устанавливаются арифматическими операторами.

Затем я бы добавил формы «если», которые проверяют эти флаги.

Я бы добавил инструкции битового сдвига и поворота (как влево, так и вправо), а также операции AND / OR / XOR / NOT, которые работают с битами.

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

1
ответ дан 14 December 2019 в 08:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: