Ассемблерный код одного и того же программного кода, скомпилированного под Linux и Windows одинаков, если не считать разницу в форматах исполняемых файлов? Я имею ввиду разницу именно в наборе (не последовательности) используемых инструкций, который загружается в сегмент кода в памяти.
Здравствуйте, Hard_Club, Вы писали:
H_C>Ассемблерный код одного и того же программного кода, скомпилированного под Linux и Windows одинаков, если не считать разницу в форматах исполняемых файлов? Я имею ввиду разницу именно в наборе (не последовательности) используемых инструкций, который загружается в сегмент кода в памяти.
Очевидно, нет. Как минимум разница в calling convention, которая начинает быть заметной хотя бы при одной реальной функции. Например, на ix64 регистр первого аргумента — RDI для Linux и RCX для Windows. Подробности тут (для ясности ограничимся x86 во всех основных разрядностях).
Далее, я не могу себе представить полный исполняемый файл без системных вызовов (кому он такой нужен?) Если используются стандартные функции C вроде puts, то они вызовут write из libc в Linux, но WriteFile из user*.dll в Windows. Далее эти библиотечные функции сделают системные вызовы, но разные и по-разному. Если код будет использовать другие средства, то видимая разница уже будет в них.
Надеюсь, этого достаточно, чтобы начать копать дальше самому.
Здравствуйте, Hard_Club, Вы писали: H_C>Ассемблерный код одного и того же программного кода, скомпилированного под Linux и Windows одинаков, если не считать разницу в форматах исполняемых файлов? Я имею ввиду разницу именно в наборе (не последовательности) используемых инструкций, который загружается в сегмент кода в памяти.
И да и нет.
С одной стороны набор асм. инструкций зависит от аппаратной платформы (x86, ARM, etc.), так что, в общем случае какой бы код (под Win, Lin, etc.) не работал на некоторой аппаратной платформе, он будет должен использовать инструкции из её набора.
С другой стороны могут использоваться разные подмножества инструкций (что зависит от соглашений принятых в разных ОС и от компилятора), например в Lin взаимодействие с ОС выполняется при помощи 'int', a в Win при помощи 'call' инструкций.
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)