2010-05-25 5 views
5

Последний семестр в колледже, мой преподаватель в классе Computer Languages ​​научил нас эзотерическому языку по имени Whitespace. В интересах изучения языка лучше с очень напряженным графиком (midterms), я написал interpreter и assembler в Python. assembly language был разработан для облегчения написания программ, и sample program был записан с данным сборкой mnemonics.У вас есть предложения для этой сборной мнемоники?

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

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


Стек Манипуляция (ИМФ: [Пробел])

Стек манипуляции является одним из наиболее распространенных операций, следовательно, затрудненное МВП [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 

Heap доступа (IMP: [Tab] [Tab])

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

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])

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

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

Святое дерьмо, простой ассемблер? Я считаю, что ваш geek-o-meter просто поднялся до одиннадцати! – Martin

ответ

2
  • push #n, чтобы было ясно, что n является немедленным.
  • «swap» иногда «exc» или «exch» Я думаю.
  • «сохранить», как правило, «улица» (магазин)
  • «нагрузка», как правило, «ЛД»
  • «вызов» также может быть «JSR» или «бл».
  • "перейти", как правило, "JMP" или "бюстгальтер"
  • "если = 0", как правило, "BEQ"
  • "если < 0", как правило, "BLT"
  • "Возвращение" обычно " ret "или" blr "
  • « Выход »обычно« останавливается »/« hlt »в контексте процессора.
  • «print chr» и «print int» могут быть «print.c» и «print.i». Существует много способов указать варианты команд, но обычно это не в операндах.

EDIT:

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

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

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

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

+0

Спасибо! Инструкция удержания была оригинальной, и инструкция по отбросу первоначально отсутствовала. Поп считался, но ни толчок, ни поп не описывают операцию очень хорошо (хотя они и стандартные). Ваше предложение об изменении выхода на остановку имеет смысл. «print chr» - это инструкция: у нее нет операнда. Может быть, изучение 4D доходит до меня. Они странно задают пробелы в своих инструкциях. :) –

+0

Это зависит от того, какую парадигму вы используете. X87 имеет «fstp», что означает «хранилище с плавающей запятой и поп», т. Е. Хранение ортогонально к появлению (много команд x87 имеют варианты «и поп»). Добавление редактирования ... –

+0

Из Wapedia: 'В Unix halt - это команда для выключения компьютера. На языке ассемблера x86 HLT - это инструкция, которая останавливает CPU до тех пор, пока не будет запущено следующее внешнее прерывание. Это может пригодиться позже, когда Whitespace будет развиваться в другие версии. Программирование системы прерываний на языке будет отличным опытом обучения. –

4

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

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

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

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

+0

Объяснения взяты из учебника, найденного здесь: http://compsoc.dur.ac.uk/whitespace/tutorial.php –

1

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

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

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

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

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

+0

Поскольку я не писал этот язык и намеревался в настоящее время просто переписать интерпретатор для версии 0.3 языка, варианты его изменения ограничены. Если все пойдет хорошо, я могу позволить себе внести небольшие изменения в набор команд и сосредоточиться прежде всего на ассемблере для версии версии 0.4 языка. Продолжая дальше, версия 0.5, вероятно, сосредоточится на инструкции и потребует значительно большего капитального ремонта сборки Whitespace. Кроме того, перемещение языка с использованием трех символов пробела во все шесть пробельных символов является небольшой дополнительной целью. –