NASM Крис касперски - Assembler
Формулировка задачи:
Не даёт покое статья Криса Касперски хоть написана в ~2010 году.
С YASM такая же вещь
повторюсь статья написана ~2010 года. И nasm и yasm развивались.Вопрос такой: исправлены ли некоторые из этих проблем?
(ниже год опубликования статьи криса касперски)
К минусам NASM'а можно отнести отсутствие поддержки уникода, платформы AMD x86-64, формата отладочной информации CodeView и некоторые странности синтаксиса. В частности, команда "mov eax, 1" не оптимизируется и транслятор умышленно оставляет место для 32-разрядного операнда. Если же мы хотим получить "короткий" вариант, размер операнда необходимо специфицировать явно: "mov eax, byte 1", что очень сильно напрягает или… использовать опцию "-On" для автоматической оптимизации
Непосредственная трансляция примеров из SDK/DDK под NASM'ом невозможна, так что разрабатывать на нем драйвера под Windows может только очень крутой поклонник или извращен. NASM - один из лучших ассемблеров под Liux/BSD, а вот под Windows его позиции уже не так сильны (в основном из-за неполной совместимости с MASM'ом).
Вот основные отличительные черты YASM'а от его предшественника: поддержка платформы AMD x86-64, большое количество исправленных ошибок (которых в NASM'е "нет"), оптимизированный парсер, переваривающий синтаксис как NASM, так и GAS, более полная поддержка COFF (DJGPP) и Win32 obj выходных файлов, генерация отладочной информации в формате CodeView, интернационализация (выполненная через GNU-библиотеку gettext), и прочие мелкие улучшения, которых вполне достаточно, чтобы потеснить NASM особенно в мире UNIX-подобных систем, где GAS-синтаксис по-прежнему играет ведущую роль
Под Windows же YASM не имеет никаких ощутимых преимуществ перед MASM'ом за исключением того, что поддерживает возможность генерации двоичных файлов, особенно удобных для создания shell-кода, но бесполезных для разработчика драйверов.
Решение задачи: «NASM Крис касперски»
textual
Листинг программы
dw __utf16__('Hello world! Привет, друг!'),0 dd __utf32__('Hello world! Привет, друг!'),0
Объяснение кода листинга программы
- В коде определяется двойное слово (word), которое названо
Hello world! Привет, друг!
и записано в формате UTF-16. Значение переменной:Hello world! Привет, друг!
. - За двойным словом следует 0, которое является конечным нулем (null-terminator), обозначающим конец строки.
- В коде определяется двойное число (double word), которое названо
Hello world! Привет, друг!
и записано в формате UTF-32. Значение переменной:Hello world! Привет, друг!
. - За двойным числом следует 0, которое является конечным нулем (null-terminator), обозначающим конец строки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д