Процессоры понимают программы с точки зрения кодов операций, поэтому ваше понимание исполняемых файлов, содержащих коды операций, является правильным, и вы правильно догадались, что любой исполняемый файл должен иметь коды операций и операнды для выполнения программы на процессоре.
Однако программы в основном выполняются с помощью операционных систем (вы можете писать программы, которые не используют ОС для выполнения, но это было бы большой ненужной работой) - которые предоставляют абстракции поверх аппаратного обеспечения, которое программы можешь использовать. ОС отвечает за настройку «контекста» для любой программы, то есть обеспечивает программу необходимой памятью, предоставляет библиотеки общего назначения, которые программа может использовать для выполнения общих задач, таких как запись в файлы, печать на консоль и т. Д.
Однако, чтобы установить контекст для программы (предоставить ей память, загрузить ее данные, настроить для нее стек), ОС должна прочитать исполняемый файл программы и знать кое-что о программе, например: как данные, которые программа ожидает использовать, размер этих данных, начальные значения, хранящиеся в этой области данных, список кодов операций, составляющих программу (также называемый текстовой областью процесса), их размер и т. д. эти данные и многое другое (отладочная информация, данные только для чтения, такие как жестко закодированные строки в программе, таблицы символов и т. д.) хранятся в исполняемом файле. Каждая ОС понимает свой формат этого исполняемого файла, поскольку они ожидают, что вся эта информация будет храниться в исполняемом файле по-разному. Проверьте ссылки, предоставленные Groo.
Пара форматов, которые использовались для хранения информации в исполняемом файле: ELF и COFF в системах UNIX и PE в Windows.
P.S. - Не всем программам нужны исполняемые форматы. Посмотрите загрузчики в Google. Это специальные программы, которые занимают первый сектор загрузочного раздела на жестком диске и используются для загрузки самой ОС.