Имя типа сборки, которое может выполняться в исполняемом файле без ассемблера - PullRequest
0 голосов
/ 11 июня 2018

Я пытался изучить код, который обрабатывается непосредственно процессором, или машинный код, потому что я был сильно не удовлетворен трудностями, которые потребовались для создания интерпретируемого языка программирования *1002*.Вместо того, чтобы создавать практический язык программирования вместо esolang, я решил создать скомпилированный язык ( EDIT : как указывал SO, я был чрезвычайно несовершенен в этом)

ОднакоКогда я начал изучать сборку и машинный код, я понял, что машинный код будет отличаться от операционной системы.Зная это, я изменил свою цель - изучать машинный код и изучать машинный код для процессора Windows / Intel Core ( EDIT : что, как вы, опять же, указали, было действительно глупой идеей).

Затем я понял, что когда я пытался научиться создавать файл .exe (я работал над ним 2 года, поэтому я просто искал все, что связано с машинным кодом, потому что я был в отчаянии), я увидел пост на WikiHow.Это не были двоичные символы или символы Unicode, соответствующие двоичным числам, это была сборка ( EDIT : опять же, это была плохая идея)!

Вот как я понял (по ошибке) что я мог бы просто поместить язык ассемблера в файл .exe для его работы.К сожалению, пример WikiHow не сработал, но у меня все еще есть ощущение, что какой-то тип сборки будет работать.

ПРОБЛЕМА: Проблема в том, что я не знаю, какой типСборка сможет работать в файле .exe (или в исполняемом файле) на моем компьютере.

ВОПРОС : Какой тип сборки можно запустить из исполняемого файла без каких-либо компиляторов/ ассемблеры компилируют ассемблерный код?(Используя 64-битную версию Windows, процессор Intel Core i5-6400T)

ЧТО Я ПОПРОБОВАЛ НА ДАЛЬНЕЙШЕМ: Примечание. Если бы я дал полный список всего, что я пробовал, вы быустал читать это.Поэтому я буду говорить только часть того, что я пытался решить для этой проблемы.

  • Пробовал документацию Intel.
  • Пробовал искать учебники машинного кода
  • Попытался использовать сборку 6502 в эмуляторе Commodore 64, посмотреть на машинный код, который он сгенерировал, и запустить машинный код, который он возвратил в исполняемый файл.
  • Попытаться найти учебник по сборке
  • Попробовал OllyDbg разобрать файл для меня, чтобы я мог понять, как мнемоника сборки превратилась в машинный код
  • Поиск учебника по сборке
  • Просмотр учебника машинного кода
  • Просмотр.exe
  • Посмотрел документацию Intel Core

Справка будет очень признательна.

1 Ответ

0 голосов
/ 11 июня 2018

ПРОБЛЕМА: Проблема в том, что я не знаю, какой тип сборки сможет работать в файле .exe (или исполняемом файле) на моем компьютере.

ВОПРОС:Какой тип сборки можно запустить из исполняемого файла без компиляторов / ассемблеров, компилирующих код сборки?(С использованием 64-разрядной версии Windows, процессора Intel Core i5-6400T)

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

Компиляторы, Cи т. д. компиляция на языке ассемблера, затем компилятор вызывает ассемблер, который превращает его в объектный файл, и затем в зависимости от того, как вы использовали компилятор, может / вызовет компоновщик, чтобы превратить его в конечный исполняемый файл, понятный операционной системе.

Операционные системы будут поддерживать очень ограниченное количество двоичных форматов.Бинарные форматы для известных операционных систем, Windows, Linux и т. Д. Тривиальны для Google и найти подробности, занимает несколько секунд, чтобы попасть на страницу с подробностями.Даже если используется один и тот же формат файла, например, elf, операционная система - это отдельная вещь, у нее есть правила относительно того, что должен содержать двоичный файл и как двоичный файл должен работать для этой операционной системы.Возьмите то же самое оборудование, тот же самый физический ПК, запустите DOS, Linux, Windows, OSX, и двоичные форматы, и правила для того, что содержат эти двоичные файлы, в частности, системные вызовы в операционную систему и то, с чем вы их упаковываете,варьироваться.Уже существующие ассемблер и компоновщик знают двоичный формат для этой операционной системы и целевой набор команд.Если вы хотите создать язык, вы начинаете с внешнего интерфейса, а затем выполняете середину, самую сложную часть всего проекта.Как только вы доберетесь до середины, превратив язык высокого уровня в легко усваиваемые атомарные операции, которые затем можно будет перенести в один или несколько наборов инструкций через бэкэнд.Вызовы операционной системы обрабатываются библиотеками, обычно это не обязательно язык, JAVA, Python и некоторые другие исключения.Таким образом, printf в C связывается с библиотекой C, которая имеет целевой и специфичный для операционной системы язык ассемблера, чтобы связать слой с операционной системой, с некоторым процентом (для printf, который ОГРОМНЫЙ) кода, который в идеале на том же языке и скомпилирован затемили обычно когда-то в прошлом в связываемую библиотеку.

Честно говоря, звучит так, как будто вы не готовы сделать компилятор, вам нужно изучить некоторые основы, изучая некоторые простые инструменты, которые достаточно малы, чтобы быть понятными,Найдите материал курса или онлайн / бесплатный класс (или книгу / книги), который охватывает эти основные темы инструментов, ассемблер и компоновщик, а затем компилятор.Посмотрите на такие языки, как паскаль или ада, которые несколько неуместны, их легче анализировать и превращать во что-то, скажем, в C / C ++.Не смотрите на GNU или LLVM или другие большие проекты по образовательным причинам, они не правильный путь.Как только вы попадаете в GNU, вы обнаруживаете, что он едва удерживается вместе с клейкой лентой и проволокой.У LLVM есть хорошая документация, которая не соответствует реальному инструменту, может быть, много лет назад, но не больше.И с течением времени он также накапливает клейкую ленту и спасательную проволоку, и потребуется некоторое время, чтобы догнать GNU в этом отношении, но я ожидаю, что в конечном итоге это станет природой подобных проектов.

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

короткий ответ:

Вы не можете выполнять язык ассемблера, процессоры исполняют машинный код, а машинный код является специфичным для ПРОЦЕССОРА, а не для операционной системы.

Двоичные файлы, .exe, elf, coff, com, ihex, srec и т. Д. Не являются конкретнымидля операционной системы, но операционная система будет иметь ограниченный набор, возможно, только один, формат файла, который они поддерживают.

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

...