У вас есть предложения по этой сборочной мнемонике? - PullRequest
5 голосов
/ 25 мая 2010

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

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

Был ли у вас когда-либо опыт работы с языками ассемблера в прошлом? Были ли какие-то инструкции, которые, по вашему мнению, должны были быть переименованы во что-то другое? Вы обнаружили, что мыслите нестандартно и с другой парадигмой, в которой названы мнемоники? Если вы можете ответить «да» на любой из этих вопросов, пожалуйста, примите сюда. Субъективные ответы приветствуются!


Управление стеками (IMP: [Space])

Манипулирование в стеке - одна из наиболее распространенных операций, отсюда и краткость IMP [Space]. Есть четыре инструкции стека.

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: [Tab] [Пробел])

Арифметические команды работают с двумя верхними элементами в стеке и заменяют их результатом операции. Первый выдвинутый элемент считается оставленным оператором.

add          Addition
sub          Subtraction
mul          Multiplication
div          Integer Division
mod          Modulo

Доступ к куче (IMP: [Tab] [Tab])

Команды доступа к куче просматривают стек, чтобы найти адрес элементов, которые будут сохранены или получены. Чтобы сохранить элемент, нажмите адрес, затем значение и выполните команду store. Чтобы получить элемент, нажмите на адрес и выполните команду получения, которая поместит значение, хранящееся в месте на вершине стека.

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

I / O (IMP: [Tab] [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

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

Ответы [ 3 ]

4 голосов
/ 25 мая 2010

Я думаю, что первое изменение, которое я предложу, - это изменение удержания и сброса на нажатие и выдвижение соответственно.

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

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

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

2 голосов
/ 25 мая 2010
  • нажмите #n, чтобы прояснить, что n является немедленным.
  • Я думаю, "swap" иногда "exc" или "exch".
  • "сохранить" обычно "st" (магазин)
  • "нагрузка" обычно "ld"
  • "call" также может быть "jsr" или "bl".
  • "goto" - это обычно "jmp" или "бюстгальтер"
  • "if = 0" обычно "beq"
  • "если <0" обычно "blt" </li>
  • «return» - это обычно «ret» или «blr»
  • «exit» обычно означает «halt» / «hlt» в контексте CPU.
  • "print chr" и "print int" могут быть "print.c" и "print.i". Есть много способов указать варианты команд, но обычно их нет в операндах.

EDIT:

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

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

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

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

1 голос
/ 25 мая 2010

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

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

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

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

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

...