Это ассемблер?


70

В детстве я программировал на советском калькуляторе МК-61 . Он имел четыре рабочих регистра (X, Y, Z, T) и 15 регистров хранения. Программа может иметь 105 шагов.

Насколько я помню, у него были такие команды:

  • Поменять регистры X и Y
  • Сдвиговые регистры (от Z до T, от Y до Z, от X до Y)
  • Копировать из регистра хранения (1..15) в X
  • Копировать из X в регистр хранения (1..15)
  • Если X <0, перейдите к шагу программы ##
  • Выполните операцию (+, -, *, /), используя значения X и Y и поместите результат в X

Эта команда задает язык ассемблера? У меня было общее представление о языках ассемблера с помощью этого устройства?

устройство

Оказывается, это то, что называется «программирование нажатия клавиш» .

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


Приятно! - эта картина возвращает воспоминания. Я все еще получил свой MK-52 в подвале где-то :)
DXM

Это похоже на советский клон HP 65. Он может быть запрограммирован в обратной польской нотации с операциями, которые толкают и тянут стек. Операторы RPN просто записываются в память и интерпретируются тем, что, вероятно, эквивалентно процессору 4004. Код в ПЗУ 4004, вероятно, был скомпилирован из ассемблера 4004, но нажатия клавиш действительно больше похожи на макросы электронных таблиц.
Мередит

Ответы:


13

Это не язык ассемблера, это машинный язык.

Машинный язык - это все, что физически что-то значит для машины. В случае карманных компьютеров это нажатия клавиш, закодированные в числах в машине. Вы не предоставляете больше информации об этом устройстве Electronika MK61 , поэтому я приведу пример TI-57 : машинный язык использовал номер ключа, указанный в столбце в десятках и строку в единицах. Так, например, программа, которая будет увеличивать объем памяти 8, будет иметь вид:

33 8  57 1 58 23

Это машинный язык: это то, что напрямую интерпретируется машиной.

Язык ассемблера будет читаемым человеком текстом:

RCL 8 
+
1
=
STO 8

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

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


36

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

«Язык», на котором запрограммирован этот калькулятор, является довольно низким уровнем, но он все еще представляет абстракцию поверх конструкций более низкого уровня, которые не видны вам как программисту. Я немного догадываюсь, но из вашего описания, а также глядя на клавиатуру (и сравнивая ее с похожими калькуляторами от Hewlett Packard или Texas Instruments с конца 1970-х и начала 1980-х), я бы сказал, что каждая программа "шаг «Это может быть не только простая операция, такая как« add »или« swap X & Y », но также и более сложные операции, такие как тригонометрия, возведение в степень, логарифмы и т. д. Каждый из этих шагов, вероятно, реализован как внутренняя микрокодированная процедура. Этот микрокод, вероятно, запрограммирован на ассемблере, но я не думаю, что

Как уже описывали другие, язык ассемблера обычно находится в очень тесном (если не в 1: 1) соответствии с возможностями базовой машины. Я бы сказал, что программирование на ассемблере включает в себя следующие характеристики, которые, вероятно, отсутствуют при программировании этого калькулятора.

  • Операции включают в себя операции более низкого уровня, такие как побитовое И, ИЛИ, XOR, сдвиг; целочисленная и (возможно) арифметика с плавающей запятой для различных размеров данных (например, с одинарной или двойной точностью); загрузка / хранение различных размеров (байт, полуслово, слово и т. д.).

  • Операции более высокого уровня (триг, логарифмы) обычно являются вызовами подпрограммы, а не инструкциями. Есть некоторые исключения, такие как DEC VAX, в котором была инструкция полиномиальной оценки. [Редактировать: OP указал, что у x87 также есть функции триггера.]

  • Схема адресации машины выставлена. Если адресное пространство сегментировано, вы должны загрузить базовый адрес в регистр, а затем адресный код или данные, относящиеся к этому регистру. Даже с плоским адресным пространством вы знаете адреса и адресную арифметику. Обычно ассемблеры позволяют программистам использовать метки для обозначения адресов. Но если адрес находится в другом сегменте, вам, возможно, придется загрузить регистр сегмента, прежде чем вы сможете добраться до него.

  • Выравнивание памяти выставлено. Например, на многих машинах 4-байтовое слово может быть загружено или сохранено только по адресам, кратным 4 байтам.

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

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

  • Соглашения о вызовах подпрограмм. Аргументы и возвращаемые значения могут быть переданы в регистрах или помещены в стек и извлечены из него. (Этот стек обычно является областью памяти, адресуемой специальным регистром указателя стека, а не фиксированным набором, таким как XYZ и T.)

  • Возможно, вам нужно знать, как взаимодействовать с ОС, или, если ее нет, как обращаться с аппаратными средствами низкого уровня. В ОС вы должны загружать аргументы в регистры (или стек) и перехватывать их в ядре. Без ОС вам, вероятно, придется иметь дело с прерываниями и таймерами.

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


1
1) Ну, это имеет какую - то операцию побитового AND, OR, XOR, NOT - синие символы , , и ИНВ(что означает INV) на клавиатуре. 2) Я думал, что синус, косинус и т. Д. Являются инструкциями по этой ссылке ref.x86asm.net/coder32.html для процессоров x86. Но, конечно, я согласен с вами, что ассемблер намного сложнее.
defhlt

Если вы хотите ссылку на эту операцию набора команд VMS - deathrow.vistech.net/… . Некоторые другие забавные биты могут быть найдены в esolangs.org/wiki/...

25

Да, для меня это определенно звучит как ассемблер.

Трудно сказать , является ли или не то, что на самом деле является сборка только из описания, так как определение - это язык , чьи команды отображение 1: 1 с машинным кодом своей целевой платформы - трудно определить без знания самого машинного кода, но это похоже на то, как ASM работает на других платформах.


11

Он, безусловно, имеет некоторое сходство с языком ассемблера, но я собираюсь доказать, что это не то, чем он является на самом деле.

На языке ассемблера операции в основном соответствуют инструкциям ЦП 1-к-1. Существуют некоторые исключения, такие как макросы и псевдооперации (например, инструкция CLEAR, которая действительно XOR регистрирует сам по себе); Суть в том, что программа сборки точно определяет инструкции процессора, которые будут сгенерированы. (Это принципиальное различие между языком ассемблера и языком более высокого уровня, например C; в последнем случае программы определяют поведение ).

В калькуляторе, несомненно, есть ЦП, но я сомневаюсь, что отдельные инструкции ЦП ссылаются на «регистры» X, Y, Z и T или выполняют высокоуровневые операции, такие как xyили sin(или ПРГ, что бы это ни значило!).

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

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

Тем не менее, я бы сказал, что ответ на вторую часть вашего вопроса:

У меня было общее представление о языках ассемблера, использующих это устройство?

Да.


1
В наших коробках также нет AX, BX, CX и DX - языки ассемблера допускаются для символического перевода. Я согласен с тем, что функции высокого уровня, безусловно, не являются сборочными, но учтите, что в том, что он перечислил, их нет. Хотя я думаю, что маловероятно, что это действительно был язык ассемблера (все должно быть фиксированной длины, чтобы работал режим адресации), ни одна из перечисленных команд не выходит за рамки того, что имеет ассемблер на ПК.
Лорен Печтел

2
«если X <0, то перейти к шагу программы ##» - это простая инструкция по сборке BMI (ветвь, если минус).
Мувисиэль

1
@mouviciel И даже если платформа напрямую не поддерживает что-то вроде BMIпримера, IF ... THEN ...обычно читается как две инструкции: сначала сравнение ( x < 0в этом случае), затем действие, основанное на результате этого сравнения (скорее всего, прыжок при работе на ассемблере). В Intel 8086 что-то вроде (при условии, xчто в AX) CMP AX, 0 JNL After_IfThen_Block. (JNL - это Прыжок, если не Меньше; на языке более высокого уровня это читается как что-то вроде того if not (x < 0) then goto After_IfThen_Block, что совпадает с if (x >= 0) then {code until there}.)
CVn

1
ПРГ(PRG - программирование) - это просто мета-ключ для переключения в режим программирования, а не какая-то функция.
Волков Олег Викторович

1
@mouviciel: Я скептически отношусь к тому, что «если X <0, то перейти к шагу программы ##» на самом деле реализовано в виде одной аппаратной инструкции ЦП. Я предполагаю, что программа, введенная в калькулятор, не сохраняется как последовательность инструкций процессора; скорее он хранится как последовательность высокоуровневых инструкций, которые интерпретируются программой прошивки. Я никогда не работал с этим конкретным калькулятором, но я использовал HP-48; видимый пользователю набор инструкций очень отличается от того, который использует процессор Saturn, который он использует.
Кит Томпсон

9

Правильно, фрагмент размещенного кода выглядит как ассемблер . Правильное преобразование этого кода будет определять версию.

Изменить: у него есть определенный язык для этого устройства, но это не сборка.

Это также похоже на калькулятор, сделанный в СССР. Работает ли он на закругленных батареях / шнуре?


3
Правильно, он выпускался в советской Украине с середины 80-х годов. У меня есть один, сделанный в 1991 году. Он имеет оба слота для 3 батареек АА и для адаптера 220В.
defhlt

1
Это действительно ностальгия по мне. Я помню это фирменное наименование "Электроника" :)
Е.Л. Юсубов

3

Я бы сказал, что вы ближе к гибридному языку ассемблера BASIC, но это действительно зависит от базового процессора и архитектуры. Не требуется прямой доступ к памяти, если у вас нет настоящей оперативной памяти. Операции с плавающей точкой также не обязательно должны присутствовать без FPU.

Я думаю, что простым тестом будет операция сложения числа с плавающей запятой и целого числа. Большинство языков программирования более высокого уровня принимают ADD 2.5, 7 и возвращают 9.5. Однако языки ассемблера будут отличаться в зависимости от вызываемой инструкции и в зависимости от основного представления чисел в двоичном формате. Большинство языков ассемблера требуют использования другой инструкции, основанной на использовании операций с плавающей запятой и целочисленных операций. Исключением из этого может быть какой-то формат с фиксированной запятой.


Он может просто рассматривать все числа как числа с плавающей точкой и рассматривать один из аргументов 7.0.
Волков Олег Викторович

@ OlegV.Volkov Возможно, однако тогда вам нужно только выбрать два числа с плавающей запятой, чья сумма не имеет истинного представления. Также вы можете охотиться на ошибки отмены в вычитании.
Питер Смит

3

Калькуляторы обратной польской записи (RPN) были классическими. Нет, хотя обозначения регистра кажутся языком ассемблера, это не так. Расчеты были выполнены путем перевода из алгебраического формата в стек. Используемые числа были помещены в стек, и операции были выполнены с последним сгруппированным рядом с последним сгруппированными значениями.

Вы можете «вращать» стек, чтобы переместить значения, так как отображаемое значение было членом стека. Результаты можно поменять местами или сложить по мере необходимости для выполнения почти сложных расчетов. Если вы понимаете аппаратное обеспечение стека и язык ассемблера, этот калькулятор будет тривиальным для изучения, поскольку его парадигма была наиболее похожа.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.