Assembler Linux/Windows
От: Hard_Club  
Дата: 19.11.13 13:09
Оценка:
Ассемблерный код одного и того же программного кода, скомпилированного под Linux и Windows одинаков, если не считать разницу в форматах исполняемых файлов? Я имею ввиду разницу именно в наборе (не последовательности) используемых инструкций, который загружается в сегмент кода в памяти.
Re: Assembler Linux/Windows
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 19.11.13 13:26
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Ассемблерный код одного и того же программного кода, скомпилированного под Linux и Windows одинаков, если не считать разницу в форматах исполняемых файлов? Я имею ввиду разницу именно в наборе (не последовательности) используемых инструкций, который загружается в сегмент кода в памяти.


Очевидно, нет. Как минимум разница в calling convention, которая начинает быть заметной хотя бы при одной реальной функции. Например, на ix64 регистр первого аргумента — RDI для Linux и RCX для Windows. Подробности тут (для ясности ограничимся x86 во всех основных разрядностях).

Далее, я не могу себе представить полный исполняемый файл без системных вызовов (кому он такой нужен?) Если используются стандартные функции C вроде puts, то они вызовут write из libc в Linux, но WriteFile из user*.dll в Windows. Далее эти библиотечные функции сделают системные вызовы, но разные и по-разному. Если код будет использовать другие средства, то видимая разница уже будет в них.

Надеюсь, этого достаточно, чтобы начать копать дальше самому.
The God is real, unless declared integer.
Re: Assembler Linux/Windows
От: C.A.B LinkedIn
Дата: 20.11.13 07:25
Оценка:
Здравствуйте, Hard_Club, Вы писали:
H_C>Ассемблерный код одного и того же программного кода, скомпилированного под Linux и Windows одинаков, если не считать разницу в форматах исполняемых файлов? Я имею ввиду разницу именно в наборе (не последовательности) используемых инструкций, который загружается в сегмент кода в памяти.

И да и нет.
С одной стороны набор асм. инструкций зависит от аппаратной платформы (x86, ARM, etc.), так что, в общем случае какой бы код (под Win, Lin, etc.) не работал на некоторой аппаратной платформе, он будет должен использовать инструкции из её набора.
С другой стороны могут использоваться разные подмножества инструкций (что зависит от соглашений принятых в разных ОС и от компилятора), например в Lin взаимодействие с ОС выполняется при помощи 'int', a в Win при помощи 'call' инструкций.
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.