Задать вопрос
@flexpc

Как программировать на машинных кодах?

Точно не знал какой какой тег поставить, если тег поставлен не правильно - не обессудьте.
У меня есть идея, создать свой диалект ассемблера с простым синтаксисом, что бы на нем мог программировать любой человек, не проигрывая в скорости (идея скорее теоретическая нежели практическая, просто хочу понять как такое можно реализовать и как это работает). Я подразумеваю, что для этого нужно написать интерпретатор (написанный на машинном коде), который будет транслировать этот язык в машинный код и исполнять на процессоре. Соответственно мне надо понять, как писать программу чисто на машинных кодах. Как можно это сделать? И есть ли другие варианты реализации этой идеи? Спасибо.
  • Вопрос задан
  • 3261 просмотр
Подписаться 2 Простой 12 комментариев
Пригласить эксперта
Ответы на вопрос 7
@Belvarm
Java TeamLead, интеграционные решения
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
У меня есть идея, создать свой диалект ассемблера с простым синтаксисом, что бы на нем мог программировать любой человек, не проигрывая в скорости.

Это очень наивная идея. Она была работоспособной в XX веке, когда система команд была простая и процессоры
были однопоточные и без кешей и конвейеров и микро-кода (КР580, Z80...)

Современный компиллятор знает больше чем обычный человек-разработчик. И очень мало людей в мире
в состоянии писать машинный код думая одновременно
1) О состоянии кешей
2) О состоянии всех регистров
3) О микрокоде и о загрузке конвейеров
4) Об таймингах mmx, sse, avr командах и сравнивать их на ходу по скорости исполнения
5) О прогнозировании переходов

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

Обычный кейс - надо писать код.
Надо писать МНОГО кода.
Надо не делать ошибок.
Надо гарантировать хорошую производительность этого кода.
Ответ написан
Комментировать
mindtester
@mindtester
http://iczin.su/hexagram_48
контрольные вопросы (вам, отвечать сюда не обязательно, важнее самому себе):
- сколько ассемблеров вы освоили?
- на сколько свободно?
- что такое макроассемблер?
- что такое язык "B"?
- как зародился язык "C"?
- и что нового вы хотите изобрести?
- для какого процессора?
- для какого потребителя?
...
PS... вы в курсе, что далеко не один язык позволяет вставки ассемблера?... и еще больше языков имеют специальные библиотеки для использования векторных команд, не говоря уже о библиотеках GPU
Ответ написан
Комментировать
@unclegluk
Напишите эмулятор простенького процессора. Какого? Да хоть сами придумайте. Или возьмите 6502 за основу. Для этого не нужно программировать в машинных кодах, сойдет даже Python.
Ответ написан
@kaka888
C, C++, Qt, Python Flask, MySQL, Lua
Ассемблер не надо писать на машинном коде. Ассемблер можно написать на любом языке программирования. Выхлоп ассемблера не зависит от языка, на котором он написан.
Ответ написан
Комментировать
@bymsx
Знаком ваш интерес, поэтому отвечу именно на теоретическую часть, не обсуждая "надо ли".
Самый простой способ (на мой взгляд): напишите свой компилятор, который будет формировать машинные коды команд под конкретный процессор. У каждой команды ассемблера есть свой машинный код, гуглится легко. Вам нужно просто их генерировать.
Дальше в зависимости от целевой платформы; познакомиться со структурой исполнимого файла или алгоритмом работы загрузчика, если хотите написать сразу под BIOS
Ответ написан
Комментировать
@guest2342
Не думаю, что вам стоит писать интерпретатор команд ассемблера. Он как-раз и нужен для того, чтобы напрямую взаимодействовать с процессором компьютера, а интерпретатор влияет на скорость исполнения при каждом запуске кода.

Язык ассемблера это просто текстовое представление команд машинного кода, и ассемблером (программа, которая переводит команды языка ассемблера в машинные коды) переводится сразу в него, минуя этап компиляции.

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

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

Невозможно написать более простой диалект ассемблера для процессора, который работал бы на сложных современных процессорах, таких как серия x86, потому что тогда бы он протеворечил своему определению, "представление команд процессора в виде, доступном для чтения человеком." Вместо этого, рекомендую создать свой язык программирования с нуля, написав для него компилятор. Компилятор может быть написан на любом языке кроме интерпретируемых (python, javascript, php и т.д.) Наиболее частым выбором является C или C++. Компилятор открывает файл с программой, извлекает команды вашего языка и переводит их либо на язык ассемблера и потом собирается таким ассемблером как NASM, либо же сразу в машинный код.

Также, выберите процессор, для которого вы пишете этот компилятор, например Intel 8080 (был в компьютерах Altair 8800), или 8086, с которым совместимы почти все процессоры Intel. Для x86 легко собирать файлы .COM под DOS т.к. для них не нужен линкер.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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