Добавлю от себя.
Сейчас вирусы на ассемблере пишут редко, и этому есть две причины.
1. Сложная полезная вредная нагрузка: загрузка чего-то через Интернет, сетевые эксплойты, дистанционное управление.
2. Сложный формат PE, крайне редкий обмен софтом, цифровые подписи на критических файлах и UAC. Потому встраиваться в файлы тяжело и малопродуктивно. UPD — существует немало «вирусов-спутников», но цифровые подписи на критических файлах и UAC не пробить и им.
Эксплойту с внедрением кода нужно небольшое тело, и его пишут на ассемблере или Visual C. А если это обычный EXE/DLL — то на языке, для которого в ОС гарантированно есть runtime-среда. В основном Visual C и .NET старых версий.
Вирусы, эксплуатирующие ошибки в runtime-средах (JS-движках, Java, .NET) — разумеется, на языке среды (JS/Java/C#). Если ошибка предполагает внедрение кода — см. выше.
UPD2. Я не писал вируса, но как бы я его заставил работать?
Прошёлся бы по дискам. Создал бы скрытую папку с микрософтоподобным именем и потихонечку бы шифровал в неё файлы. Вдруг в момент Икс я переименовываю исходные файлы в ту самую папку, затираю пару килобайт начала, переименовываю скрытые на их место и вывожу: ваш компутер зашифрован! Если человек мешкает — затираю остатки файлов, а потом и удаляю их.
Остаётся придумать, как этот вирус протащить на компьютер жертвы и как прикинуться легитимной программой. Простейший вариант, по-моему — прикинуться сайтом программ, в каждую поместить вирус и сделать активное SEO. Что будет, когда попадусь — не знаю. А прикинуться программой — придумаю какую-нибудь службу-технотуфту от Microsoft. Хотя настоящие вирусописатели покупают на чёрном рынке эксплойты, я с этим делом не знаком.