Язык ассемблера во многом такой же и похожий. Однако ни Windows, ни Linux не будут пытаться выполнить произвольный файл. Большинство современных операционных систем отказывается выполнять программу, если у нее нет подходящих исполняемых заголовков (например, PE или ELF).
В Windows файл должен иметь правильное расширение (например, .exe, .dll, .com), а файл должен иметь формат, соответствующий формату Portable Executable (PE), прежде чем Windows даже попытается выполнить файл.
В Linux файл должен соответствовать формату ELF (Исполняемый и Связываемый формат) и иметь бит разрешения на выполнение (может быть установлен / снят с помощью chmod).
На практике это означает, что Windows, которая не распознает формат ELF, откажется выполнять программу Linux; и Linux откажется выполнять программу PE / Windows, если у вас нет Wine. Вирус, написанный на ассемблере, необходимо пересобрать (запустить через ассемблер) в правильный исполняемый формат (PE или ELF), соответствующий ОС.
После этого возникает проблема различий между вызовами функций между Windows и Linux (и даже между разными версиями Windows и разными версиями Linux); также различный набор системных вызовов API и различные методы для выполнения системных вызовов даже для самых простых вещей. На практике практически невозможно написать ассемблерный код, переносимый между Windows и Linux, поскольку даже базовые операции, такие как печать ввода / вывода, отличаются.