Разновидность программы в машинных кодах какой файл
Не силен в знаниях, касаемо принципа работы ядра операционных систем. Собственно вопрос, если .exe форматы-программ могут компилироваться из разных языков программирования:
1. На каком "языке программированя" инструкции в самом .exe, или "прямые команды" для процессора?
2. Исполняются ли .exe программы как "отдельный поток" напрямую железом или компилируются ядром операционной системы?
3. В чем различие программ для разных операционных систем: Linux, Windows, Android и т.д.?
4. Как взаимодействует программа и операционная система, читал что на Windows так просто не получить к буферу вывода изображения на экран
5. Существенно ли различие архитектур разных устройств, тоесть можно ли к примеру запустить Windows/Linux на Android телефоне?
.exe это довольно сложный формат.
Операционная система умеет прочитать необходимый код программы из exe, поместить его в память на предпочтительных адресах, залинковать ссылки на внешние библиотеки и запустить.
В .exe могут находиться другие ресурсы - иконки, музыка, картинки, которые могут подгружаться по мере необходимости, а не сразу.
Непосредственно код - это инструкции процессора.
Тоесть в .exe инструкции для процессора скомпилированы уже в явном, никак не интерпритируемые? Получается обычный .exe, даже если есть поддержка устройств не запустится?
P747, А почему не могут?
Драйверы это не мифические существа. Это тоже программы, и тоже написанные и скомпилированные в инструкции процессора. Вдобавок при загрузке операционной системы они тоже загружаются в память и висят там уже в виде инструкций процессора.
Вы же можете на ассемблере написать кусочек кода, который вызовет кусочек другого кода?
Ну вот и драйвер так можно вызвать.
А в исполняемых файлах типа .exe даже есть специальная таблица системных вызовов, чтобы программа знала как обращаться к функциям операционной системы стандартными инструкциями процессора типа call
В машинных кодах :) Все в итоге будет в машинных кодах. Хотя внутри .exe может быть много чего разного - вплоть до самораспаковывающегося архива или автономного скрипта, упакованного вместе с интерпретатором. Конкретный .exe может содержать кучу разных вещей, вовсе не относящихся к исполнению - например значки :)
Исполняются ли .exe программы как "отдельный поток" напрямую железом или компилируются ядром операционной системы?
Чо? Ведро - это не компилятор, оно ничего ни во что не компилирует. Ведро - это гигантских размеров привилегированная библиотека, которая может обращаться к дровам и железу.
В том, что они для разных осей написаны. А разные оси предполагают разный формат обращения к API ведра для совершения одних и тех же действий. Например, открытие файла в Windows и Linux - будет выглядеть с точки зрения обращения к ведру - кардинально разными вызовами. Из этого же следует, что можно "имитировать" работу программы для одной ОС в другой. Так, например wine работает.
Как взаимодействует программа и операционная система, читал что на Windows так просто не получить к буферу вывода изображения на экран
Через опубликованное и документированное (а иногда и не очень документированное) API. Верно слышали - просто так не получить :)
Существенно ли различие архитектур разных устройств, тоесть можно ли к примеру запустить Windows/Linux на Android телефоне?
Весьма существенно. Линух на телефоне можно запустить - с танцами и битьем в огромный бубен, но можно - андроид в конце концов тоже линух :) Винду нет - она не поддерживает данную процессорную архитектуру (хотя виндофоны были - но сплыли. )
Как можно программировать в машинных кодах? Есть ли для этого какие среды, и вообще как это делается, есть какие учебники (можно на английском) ? Я знаю что это трудно и утомительно по сравнению с программированием на том же языке ассемблера, но мне это кажется таким интересным делом.
Программировать в машинных кодах это действительно интересно, особенно когда есть возможность пересечения многобайтовых команд, когда можно менять код программы во время исполнения, когда получается синтезировать команды во время исполнения программы. Но для хорошего подобного полёта надо иметь более удобную архитектуру и систему команд. Пока такой удачной архитектурой и системой команд не может похвастаться ни один процессор.
что интересного в том, чтоб задротствовать с машинными кодами? Сегодня и ассемблер, даже в микроконтроллерах стал ненужным.
Для начала надо изучить архитектуру того процессора, который собираетесь программировать. На сайтах производителей есть мануалы по данной теме.
Для этого сойдёт любой HEX-редактор. Вот допустим HelloWorld:
BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21
48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 - Это сама фраза Hello World
Соответственно, мы могем вместо hello world запросто вставить любую другую строку.
А сами инструкции, называются ОПКОДЫ. Писать программы напрямую в hex редакторе, это конечно же майндфак. Но для энтузиазма можно) )
Да, это интересно, но еще интересней вводить побитно, представь у тебя ключ ввода одного бита и как азбукой морзе сидишь и долбишь. какая эффективность же. зачем столько пальцев на руке, так же классно и увлекательно. сидят же люди до сих пор, переговариваются в эфире. романтика однако.
использование любого компилятора это и есть "программирование в машинных кодах"
после компиляции программы на любом языке программирования ты получаешь файл ехе в котором и содержатся те самые пресловутые "машинные коды"
Загляни туда и ты, возможно, осознаешь безмернность тупости твоего вопроса
Забей сразу. Ничего сколь-нибудь сложного таким образом написать все равно невозможно. Нравится низкоуровневое программировние - пиши на Си.
машинные коды пошли от булевой логикиги. где используются элементарные адреса шин и номера операций.
на этом строились первые ЭВМ электронные вычислительные машины
не много о нынешнем применении, некогда не задумывались почему на игровых консолях игрушки со слабым железом идут очень даже нечего? это именно потому что там адаптацию делают на более низком уровне. что дает могократный прирост производительности на сравнительно слабом железе.
на почитай ТЫК вот ещё тык
и ещё ТЫк
Зачем же сразу на машинном коде? Настоящие программеры сразу намагниченной иголкой такие вещи делают.
1. Отметьте все языки программирования высокого уровня.
-Паскаль
-Си
-Python
2. Отметьте языки программирования, которые используются для создания Web-сайтов в Интернете.
-Javascript
-PHP
3. Как называется программа, которая переводит в машинные
коды тексты программ, написанных на языке высокого уровня?
-компилятор?
5. В чем преимущества трансляторов-интерпретаторов в сравнении с компиляторами?
- программы легче отлаживать
9. Как называется программа для поиска ошибок в других программах?
- отладчик
10. Как называется программа, позволяющая оценить время работы каждой процедуры и функции во время выполнения программы?
- тут самому интересно узнать :)
1. Отметьте все языки программирования высокого уровня.
Паскаль
Си
Python
2. Отметьте языки программирования, которые используются для создания Web-сайтов в Интернете.
Javascript
PHP
Perl
3. Как называется программа, которая переводит в машинные
коды тексты программ, написанных на языке высокого уровня?
компилятор
4. Как называется программа, которая переводит в машинные
коды символьную запись машинных команд?
5. В чем преимущества трансляторов-интерпретаторов в сравнении с компиляторами?
программы легче отлаживать
программы переносимы на любую платформу, для которой есть интерпретатор
6. Назовите тип транслятора, который переводит в машинный код сразу всю программу и строит исполняемый файл.
однопроходный компилятор (??)
7. Как называется промежуточный исполняемый код, который выполняется виртуальной машиной?
байт-код
8. Как называется программа, которая собирает разные части (модули) создаваемой программы и функции из стандартных библиотек в единый исполняемый файл?
линковщик (linker)
9. Как называется программа для поиска ошибок в других программах?
отладчик
10. Как называется программа, позволяющая оценить время работы каждой процедуры и функции во время выполнения программы?
профайлер (profiler)
11. Каким термином называется набор стандартных структур данных и функций операционной системы или сервиса, которые программисты могут использовать в своих программах?
интерфейс программирования приложений
12. Отметьте все программы, которые обычно входят в состав интегрированной среды разработки программ (IDE).
текстовый редактор
компоновщик
отладчик
профилировщик (??)
13. Как называются среды программирования, нацеленные на высокую скорость и низкую стоимость разработки программ?
среды быстрой разработки приложений
14. Отметьте языки программирования, программа на которых может быть переведена в псевдокод, выполняемый в виртуальной машине.
Londinium Lysenko Sergey Просветленный (42871) ну тогда просто из вежливости стоило бы выложить правильные ответы, а то так дураком и помру
Программа, записанная в форме машинного кода, выглядит одинаково для всех типов процессоров?
Программы, написанные на низкоуровневых языках, более производительные по отношению к программам на языках высокого уровня?
1 ответ 1
Не всегда программа выглядит одинаково для разных процессоров. Это зависит от архитектуры набора команд (ISA). На этом уровне определяются все инструкции, которые может выполнять CPU, набор регистров, прерывания, модель памяти, модель адресации и так далее.
Таким образом, если два CPU имеют одинаковую ISA, то и программа в машинном коде выглядит для них одинаково. Например, и у Intel и у AMD есть процессоры, реализующие x86 ISA, таким образом, программа будет переносима между такими процессорами.
Совсем не обязательно. Поймите, что в конце концов любая программа будет выполнена на CPU как набор инструкций. Поэтому производительность зависит от того, насколько оптимально программа в этот набор инструкций переведена.
Для примера рассмотрим какой-нибудь язык ассемблера и какой-нибудь компилируемый язык высокого уровня, например, C++. Если вы на языке ассемблера сможете написать код более оптимальный, чем тот, что будет сгенерирован компилятором C++, то ваш код будет работать быстрее. Если же компилятор сгенерирует более оптимальный код (что более вероятно), то быстрее будет работать скомпилированная программа.
Существуют так же интерпретируемые языки. Программы на таком языке не компилируются в машинный код, выполняемый непосредственно на CPU, а интерпретируются специальной программой интерпретатором. Опять же ваша программа предстанет перед CPU как набор инструкций, только сделает это через посредника — интерпретатора. Распространено мнение, что интерпретируемые языки медленнее, чем компилируемые, однако это не совсем так.
Таким образом, нельзя сказать, что программы на языке низкого уровня быстрее, чем программы на языке высокого уровня. Производительность будет зависеть от того, насколько оптимально компилятор или интерпретатор «переводят» программу для того, чтобы CPU мог ее понять и исполнить.
Недавно наткнулся на видео, где некий сумасшедший написал программу, которая выводит в консоль слова "Hello World" на бинарном/машинном коде (если честно я не уверен что это именно).
Расскажите пожалуйста, как можно повторить результат (не советуйте скопировать код из видео, хочу именно понимать как такое сделать)? Может какая-то литература по этому поводу?
Вам достаточно изучить ассемблер и всё станет понятно.
Каждая команда ассемблера транслируется "дословно" в машинный код.
Т.е. например команда pushl %edx превратится в один байт 82
Например программа на ассемблере:
превратится в машинный код:
Почитать можно здесь и здесь . В целом подойдет любая книга по ассемблеру.
Во времена MSDOS было бы понятно - int 21h, и вывод на консоль в кармане. Можно даже структуры exe-файла не знать, писать сразу в com. А сейчас что делать? Поможет ли ассемблер?
Mrrl: Не понял ваш вопрос. На чистом асме писать нет смысла - только для общего развития или для векторизации SIMD инструкций и для реверс инжиниринга. Если нужен асм, то самый простой способ - делать вставки в код на С/С++. А трансляцией в машинный код должен заниматься компилятор
asd111: Я так понял, что вопрос - как написать программу полностью. Желательно, в 16-ричном редакторе. Любая программа, использующая C/C++ займёт огромный объём, без ошибок вручную его не сгенерируешь и не введёшь. Для com-файла в MSDOS такие трюки были вполне реальны, но как это сделать в современных операционных системах?
Mrrl: В современных системах даже если писать всё вручную, меньше чем код на С в любом случае не получится, т.к. необходимо сохранить формат исполняемого файла т.е. для Linux например нужно будет прописать все заголовки ELF файла в то время как С - по сути дела высокоуровневый ассемблер, т.е. код на С практически дословно транслируется в код на ассемблере + готовые заголовки под нужную ОС + оптимизации компилятора.
asd111: Не забывайте, что если вы пишете на С, то вам будет необходимо иметь правильную версию C-библиотеки, а она тоже занимает место (и в какой-нибудь Embedded XP её может сразу не оказаться). Либо использовать статическую линковку, что очень резко увеличит размер кода. Системные вызовы в этом смысле экономнее. Судя по кодам для Linux, у них есть команда syscall (тоже какое-то прерывание?), которая позволяет написать совсем короткую программу. Про ELF-файл пока не скажу, с исполняемыми файлами для Linux мне разбираться пока не пришлось.
Читайте также: