Существуют ли языки, которые говорят напрямую с аппаратным обеспечением и не являются сборкой? - PullRequest
2 голосов
/ 24 марта 2009

Просто интересно, как устроен мир ассемблера, и я читал о языке ассемблера на wiki , и эта цитата меня поразила:

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

Я всегда думал, что сборка - это фиксированный язык, основанный на вашем ЦП (с разными компиляторами и языками, основанными на указанном ЦП), поэтому для вашего ЦП вы могли использовать только этот тип сборки для общения с вашим оборудованием.

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

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

Ответы [ 8 ]

7 голосов
/ 24 марта 2009

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

ARM имеет инструкцию ADD. В ассемблере ARM «ADD r0, r0, # 1» представляет 4-байтовый машинный код, который представляет собой инструкцию для приращения регистра 0.

Как бы вы ни называли эту инструкцию, вы не можете изменить набор доступных инструкций и все равно называть ее ассемблером ARM. По сути, это все тот же язык программирования, называете ли вы операцию ADD «ADD», или «SUM», или «PLUS», или «ADDITION». Поскольку легче использовать существующие ссылки, если все используют одинаковые имена для всего, вот что происходит.

Одним из полезных изменений может быть представление команды в виде "INC r0", поскольку ARM не имеет инструкции INC, и это обычная операция. Это приводит к макросам на языках ассемблера. Они действительно меняют язык, но как только у вас есть макросы, которые выдают несколько инструкций ARM, вы начинаете терять WYSIWYG-характер сборки. В конце концов вы начинаете думать, что, возможно, вы могли бы просто написать C. Я говорю по опыту (это был не ARM, а макросизированный ассемблер).

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

4 голосов
/ 24 марта 2009

Вы неправильно поняли (или, возможно, правильно - по вашему вопросу это трудно сказать). Ассемблер является символическим (легким для чтения человеком) представлением двоичных шаблонов инструкций для конкретной архитектуры CP. Иногда можно встретить ссылки на «сборщик portabe» (Скотт Нуддс, кто-нибудь?), Но это действительно языки более высокого уровня.

3 голосов
/ 24 марта 2009

Вот пример из Clozure Common Lisp . Это позволяет писать встроенный ассемблерный код на Лиспе. Далее определяется функция% safe-get-ptr, записанная в нотации ассемблера x86:

(defx86lapfunction %safe-get-ptr ((src arg_y) (dest arg_z))
  (check-nargs 2)
  (save-simple-frame)
  (macptr-ptr src imm0)
  (leaq (@ (:^ done) (% fn)) (% ra0))
  (movq (% imm0) (@ (% :rcontext) x8664::tcr.safe-ref-address))
  (movq (@ (% imm0)) (% imm0))
  (jmp done)
  (:tra done)
  (recover-fn-from-rip)
  (movq ($ 0) (@ (% :rcontext) x8664::tcr.safe-ref-address))
  (movq (% imm0) (@ x8664::macptr.address (% dest)))
  (restore-simple-frame)
  (single-value-return))

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

ЦП не выполняет язык ассемблера. Язык ассемблера - это только некоторое (более или менее прямое) текстовое представление конкретного машинного кода ЦП.

2 голосов
/ 24 марта 2009

Языки ассемблера очень тесно связаны с аппаратной архитектурой целевой системы.

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

Они также позволяют вам обращаться к памяти и манипулировать ею способом, соответствующим архитектуре памяти машины (монолитная, сегментированная, виртуальная и т. Д.).

Ассемблеры сильно отличаются друг от друга: одни делают больше, чем просто переводят трехбуквенные коды в 4-байтовые инструкции, другие, например, почтенный ассемблерный язык OS / 390, сами по себе являются сложной средой программирования.

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

1 голос
/ 25 марта 2009

Конечно, есть много языков, которые напрямую взаимодействуют с оборудованием, которое не является сборкой. Например, на Burroughs B5000 ЦП был запрограммирован в варианте ALGOL, на Лисп-машине ЦП выполнял код Lisp напрямую, на ранних рабочих станциях Smalltalk ЦП выполнял напрямую байт-код Smalltalk. Исследователи создали процессоры, основанные на механизмах сокращения графов, которые непосредственно выполняют Lambda Calculus. Существует более одной компании, занимающейся сборкой процессоров Java, которые, конечно, запрограммированы в байт-коде JVM.

1 голос
/ 24 марта 2009

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

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

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

Для этого также может потребоваться поддержка компоновщика, чтобы ячейки памяти (для отображаемых в памяти входов / выходов) можно было найти по правильным адресам для регистров устройства. Однако некоторые процессоры используют различные инструкции для ввода-вывода, и должна быть какая-то возможность для их вставки в поток кода, поэтому во многих случаях может быть невозможным доступ к H / W, если нет явной поддержки языка.

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

1 голос
/ 24 марта 2009

Сборка, смешанная с C, используется очень часто. Некоторые CPUS (например, чип 8052) поставляются с языком более высокого уровня, записанным в ПЗУ. Эти языки имеют специальные операторы, которые позволяют взаимодействовать с оборудованием на низком уровне.

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

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

0 голосов
/ 24 марта 2009

Ваш вопрос был:

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

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

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

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

Забавные штуки .... заставляет меня желать, чтобы я мог вернуться и снова выполнить всю свою работу по EE / CE ....

...