ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Синтаксис русскоязычного ассемблера

Сообщений 1 страница 9 из 9

1

Код:
  0     иск      %р0, 	%р0, 	%р0           // р0 = р0 ^ р0
  1     иск      %р3, 	%р3, 	%р3           // р3 = р3 ^ р3
  2     слжч     %р0, 	$1000, 	%р0           // р0 = р0 + 1000
  3     слжч     %р3, 	$10000, %р3           // р3 = р3 + 10000
  4     умнб     %р0, 	%р3, 	%р3           // р3 = р0 * р3   (беззнаковое)
  5     иск      %р4, 	%р4, 	%р4           // р4 = р4 ^ р4
  6     дек3                    %р3           // р3--
  7     вен      %р3,   %р4                   // ск += (р3 != р4) ? 0 : 1
  8     пч       $-2                          // ск += -2
  9     прмч           $1,      %р3           // р3 = 1
 10     свыз                                  // регистры[0] = syscall(регистры[1], ...)
 11     стоп

Распечатка дизассемблера языковой виртуальной машины. Сделано по мотивам GAS.
р0 .. р31  - регистры общего назначения
ск - счетчик команд

Есть ли какие-то мысли по синтаксису ассемблера и мнемоникам команд?

0

2

Евгений написал(а):

Есть ли какие-то мысли по синтаксису ассемблера

да, не надо доллар использовать - Символ символа

0

3

Код:
  0     иск      %р0, %р0,    %р0           // р0 = р0 ^ р0
  1     иск      %р3, %р3,    %р3           // р3 = р3 ^ р3
  2     слжч     %р0, *1000,  %р0           // р0 = р0 + 1000
  3     слжч     %р3, *10000, %р3           // р3 = р3 + 10000
  4     умнб     %р0, %р3,    %р3           // р3 = р0 * р3   (беззнаковое)
  5     иск      %р4, %р4,    %р4           // р4 = р4 ^ р4
  6     дек3                  %р3           // р3--
  7     вен      %р3, %р4                   // ск += (р3 != р4) ? 0 : 1
  8     пч       *-2,                       // ск += -2
  9     прмч           *1,    %р3           // р3 = 1
 10     свыз                                // регистры[0] = syscall(регистры[1], ...)
 11     стоп

Можно такой вариант. Или не очень интуитивно понятно?

0

4

Евгений написал(а):

Можно такой вариант

Да любой вариант можно, если его задокументировать.

Я бы использовал . и @,
перед десятичными числами бы ничего не ставил, для шестнадцатеричных другая тема была (0шАБВ, 0б1111)

Отредактировано Лис (2023-04-13 12:38:45)

0

5

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

0

6

Евгений написал(а):

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

Как такое происходит у людей? Бывает два вида стандартов - де юре и дефакто.

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

Второе (де факто) - это когда документы делать не умеют (не освоили TeX,
не умеют использовать цифровую подпись, или ещё что-нибудь).
Тогда на всех плюют и делают как получится.
Задокументирует потом кто-то другой, кто умеет (или, если никого не найдётся, поделка загниёт и сгинет).

Зачем ты спрашиваешь что делать? Либо делай как умеешь, либо учись новому.

Отредактировано Лис (2023-04-13 12:58:18)

0

7

Лис написал(а):

Либо делай как умеешь, либо учись новому.

Именно так я и поступаю: делаю, как умею и учусь новому.

Лис написал(а):

Задокументирует потом кто-то другой, кто умеет (или, если никого не найдётся, поделка загниёт и сгинет).

Ничто не помешает даже задокументированной поделке загнить и сгинуть.

0

8

Евгений написал(а):

Ничто не помешает даже задокументированной поделке загнить и сгинуть.

Ей это будет труднее. Рукописи не горят.

0

9

мнемоники

целочисленные арифметические

ЦСУМ
ЦРАЗ
ЦУМН
ЦДЕЛ
ЦСУМЗ
ЦРАЗЗ
ЦУМНЗ
ЦДЕЛЗ
ЦОСТ - остаток
ЦОСТЗ - остаток для знаковых

Научный формат (с плавающей точкой)

НСУМ
НРАЗ
НУМН
НДЕЛ
НСУМЗ
НРАЗЗ
НУМНЗ
НДЕЛЗ
НОСТ - остаток
НОСТЗ - остаток для знаковых

мнемоники (логические):
ЛСУМ - логическое суммирование
ЛУМН - логическое умножение
ЛОТР - логическое отрицание
ЛИСК - логическое исключение (исключающее или)

мнемоники (сдвиги):
СДЛ - сдвиг влево
СДП - сдвиг вправо
СДЛЦ - сдвиг влево циклический
СДПЦ - сдвиг вправо циклический
СДЛЗ - сдвиг влево знаковый (знак сохраняется, число удваивается)
СДПЗ - сдвиг вправо знаковый (знак сохраняется, число уполовинивается)
СДПЗР - сдвиг вправо знаковый (знак размножается, число уполовинивается)

Только команды переходов. Зачем нужны проверки сами-по-себе?
УА - уйти на адрес
УР - уйти взяв адрес из регистра
УАПБ, УРПБ
УАПМ, УРПМ
УАПР, УРПР
УАПС, УРПС
УАПH, УРПH
УАПП, УРПП
- уйти при выполнении условия
/*
ПБ - проверка больше
ПМ - проверка меньше
ПР - проверка разницы
ПС - проверка совпадения
ПН - проверка на ничто
ПП - проверка на не́что
*/

Команды вызова (не проверяют условия) - начать подпрограмму
ВЫЗА - вызов по адресу
ВЫЗР - вызов по регистру

ВОЗ - возврат

СИСТ - вызов операционной системы

Допустим я придумал такой вариант, а у тебя уже есть другой.
И теперь мы потратим пару месяцев в обсуждениях как переделать?
Или не будем заниматься фигнёй и будем пользоваться тем что есть?

Лис, где синус?

НСИН - научный формат, синус
НКОС - научный формат, косинус
НТАН - научный формат, тангенс
НАРК - научный формат, арккосинус
НСТЕ - научный формат, степень
НКОР - научный формат, корень
НЛОГ - научный формат, логарифм
НЭКС - научный формат, экспонента

Лис, а как будешь в калькуляторе в отрицательную дробную степень возводить без комплексных чисел?

КСИН (ЙСИН) - комплексные числа, синус
ККОС (ЙКОС) - комплексные числа, косинус
КТАН (ЙТАН) - комплексные числа, тангенс
КАРК (ЙАРК) - комплексные числа, арккосинус
КСТЕ (ЙСТЕ) - комплексные числа, степень
ККОР (ЙКОР) - комплексные числа, корень
КЛОГ (ЙЛОГ) - комплексные числа, логарифм
КЭКС (ЙЭКС) - комплексные числа, экспонента

Или можно букву Й ставить первой, использовать её для обозначения мнимой части
(потому что буква К может пригодиться в каких-нибудь других инструкциях. Полезная часто употребимая буква, эта 'К')

Как данные перемещаются между памятью и регистрами?
ДПР - двигаем память в регистр
ДРП - двигаем регистр в память
ДППРЙ - двигаем память в пару регистров (для комплексных чисел)
ДРЙПП - двигаем пару регистров в память (для комплексных чисел)

Ещё может быть несколько режимов адресации? Ну, чтобы не только по фиксированным адресам размещать.
ДПМР - режим адресации для работы с массивами
ДРПМ
так-то эти команды вроде бы и не нужны, адреса можно повычислять отдельными командами
ДАПР - LEA (двигаем адрес памяти в регистр)
ДАПМР (то же самое для адресации с массивами)

А данные ты, Лис, собираешься сохранять в стеке? Или всё в ку́че?
А вот! Сначала объясните зачем в стеке нужны данные.
1) Передавать параметры в функцию?
Давно такое через регистры делают, регистров достаточно много стало.
2) Ну, там, а автоматическая очистка компилятором локальных переменных, он может вычислить количество и сразу их все очистить при выходе из подпрограммы?
Ну, компилятор может это вычислить и для кучи, и второй стек может сам вести.
3) Но управление памятью в куче сложное!
Ну так всё равно надо будет его делать, ведь плохо, когда память не используется, вот пусть компилятор и мучается.
4) Ну хотя бы снять адрес со стека можно, чтобы не возвращаться туда, откуда вызывали?
А зачем такие хаки. Ну, можно поместить новое значение в регистр стека командой загрузки регистра (прибавить 8 байтов, например)...

ДРС - двигать из регистра стек
ДСР - двигать из стека в регистр
ДРЙСС - двигать из регистра стек комплексное число
ДССРЙ - двигать из стека в регистр комплексное число

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

Отредактировано Лис (2023-04-19 07:41:16)

0