За что я люблю Assembler?
Метки asm, assembler, assembly language, fasm, gas, masm, masm32, nasm, tasm, асм, ассемблер, язык ассемблера
За что я люблю Assembler? Оговорочки Хочу сразу оговориться, что правильно говорить не "ассемблер" (assembler), а "язык ассемблера" (assembly language), потому как ассемблер – это транслятор кода на языке ассемблера (т.е. по сути, программа MASM, TASM, fasm, NASM, UASM, GAS и пр., которая компилирует исходный текст на языке ассемблера в объектный или исполняемый файл). Тем не менее, из соображения краткости многие, говоря "ассемблер" (асм, asm), подразумевают именно "язык ассемблера". Синтаксис различных диалектов (к примеру, MASM, fasm, GAS), включая директивы, стандартные макросы и пр. структурные элементы, могут отличаться довольно существенно. Мнемоники (имена) инструкций (команд) одного и того же процессора одинаковы почти во всех диалектах (заметным исключением среди популярных ассемблеров является разве что GAS, где к именам инструкций могут добавляться суффиксы, обозначающие размер обрабатываемых ими данных, что бывает довольно удобно, но там есть и другие нюансы, сбивающие с толку программиста, привыкшего к классическому ассемблеру, к примеру, иной порядок указания операндов, хотя это лечится специальной директивной). Поскольку ассемблер – самый низкоуровневый язык программирования, практически невозможно написать код, который корректно компилировался бы для разных архитектур процессоров (например, x86 и ARM), для разных режимов одного и того же процессора (16-битный код реального режима, 32-битный код защищённого режима, 64-битный код long mode; а ещё можно захотеть генерировать код как с использованием различных технологий вроде SSE, AVX или AES-NI, так и без них) и для разных операционных систем (Windows, Linux, MS-DOS). Хотя иногда можно встретить "универсальный" код (например, отдельные библиотеки), скажем, для 32- и 64-битного кода ОС Windows (или даже для Windows и Linux), но это бывает нечасто . Ведь каждая строка кода на ассемблере (не считая управляющих директив, макросов и тому подобного) – это отдельная инструкция процессора, для которого пишется этот код, и сделать кроссплатформенный вариант можно только с помощью макросов и условных директив препроцессора (получая в итоге порой весьма нетривиальные конструкции, довольно сложные для понимания). Откуда растут ноги? Ассемблером я увлёкся лет в 12-13, и он меня изрядно "затянул". Почему?
Перейдём к сути! Приведу свои доводы относительно того, чем так хорош ассемблер.
Быть или не быть? Так, нужно ли изучать ассемблер современному программисту? Если вы уже не новичок, и у вас серьёзные амбиции, то изучение ассемблера, внутреннего устройства операционных систем и функционирования железа (особенно процессоров, памяти), а также использование различных инструментов для дизассемблирования, отладки и анализа кода полезно тем, кто хочет писать эффективные программы. Иначе будет сложно в полной мере понять, что происходит "под капотом" любимого компилятора (хотя бы в общих чертах) и какой приём стоит предпочесть. Необязательно погружаться слишком глубоко в эту тему, если вы пишете на Python или JavaScript. А вот если ваш язык – C++, лучше изучить ассемблер более глубоко. Вместе с тем, необходимо помнить не только о тактике, но и о стратегии, поэтому не менее важно изучать и алгоритмы, правильный подбор которых зачастую более важен для создания эффективных программ, нежели низкоуровневая оптимизация. Если вы решили изучить ассемблер и окунуться в низкоуровневое программирование, вам будет полезна моя подборка литературы и инструментов. To be continued... |
Всего комментариев 12
Комментарии
-
64 байта наверно иногда можно и без помощи ассемблера написать.
Особенно если команды ЭВМ удобно кодируются.
"Исходный код" поместится в 3-4 строчки.Запись от ОС размещена 27.07.2018 в 18:08 -
Цитата:
Ну там или будет тот же ассемблер (HIEW) или нужно будет кодировать инструкции "вручную". Но есть ли в этом смысл? Если "чисто по приколу", тогда ок.
А так ведь наверняка придётся этот код оптимизировать (есть у меня тут самописная 64b intro, исходник которой не сразу получился готовым "как надо", я его ужимал и ужимал, чтобы "сие творение" влезло-таки в 64 байта). В итоге доужимался так, что и на добавление звука место осталосьЗапись от Jin X размещена 27.07.2018 в 18:18
Обновил(-а) Jin X 27.07.2018 в 18:19 -
Как люди кодили до ассемблеров и шестнадцатиричных редакторов?
Запись от ОС размещена 27.07.2018 в 19:23 -
Запись от ildwine размещена 27.07.2018 в 20:33 -
Ассемблер - это конечно хорошо. Но ассемблер не может заменить язык высокого уровня. Обратное тоже верно. Может лучше Золотая Середина? То есть язык высокого уровня плюс ассемблерные вставки там, где это необходимо.
Что мне не нравится в ассемблере? ... почему бы в ассемблере не использовать привычную для языков высокого уровня символику? ... например для присвоения можно использовать знак "=". У вас иное мнение?Запись от wer1 размещена 27.07.2018 в 20:37 -
Цитата:Сообщение от нтчМожет лучше Золотая Середина? То есть язык высокого уровня плюс ассемблерные вставки там, где это необходимо.
Цитата:Сообщение от нтчНо ассемблер не может заменить язык высокого уровня. Обратное тоже верноЗапись от Eva Rosalene размещена 27.07.2018 в 22:48 -
Спасибо!
Раньше много чего по-другому было, биты тумблерами переключали, насколько мне известно . Я ж говорю: если хочется и вы видите в этом смысл – не вопрос. У К.К. даже есть статья про программирование в машинных кодах.
Цитата:Ассемблер - это конечно хорошо. Но ассемблер не может заменить язык высокого уровня. Обратное тоже верно. Может лучше Золотая Середина? То есть язык высокого уровня плюс ассемблерные вставки там, где это необходимо.
Что мне не нравится в ассемблере? ... почему бы в ассемблере не использовать привычную для языков высокого уровня символику? ... например для присвоения можно использовать знак "=". У вас иное мнение?
Что касается высокоуровневого синтаксиса, то некоторые люди пытаются сделать что-то удобоваримое (HLA, к примеру). Но всё равно большой популярностью это не пользуется. Не могу сказать почему, ведь конструкции вроде .IF и .WHILE есть в том же masm32, и люди их вовсю применяют. Исходники на HLA выглядят вот так:
Код:begin BitCnt_1; push( ebx ); push( ecx ); mov( bits2Cnt, ebx ); mov( 0, eax ); for( mov( 32, ecx ); ecx > 0; dec( ecx )) do shr( 1, ebx ); if( @c ) then inc( eax ); endif; endfor; pop( ecx ); pop( ebx ); end BitCnt_1; . . . BitCnt_1( 1234567890 ); if( eax <> edx ) then stdout.put ( "BitCnt_1 produced an incorrect result: ", (type uns32 eax), " (Should have been ", (type uns32 edx), ")" nl ); endif;
Но конструкции видаax = bx
можно написать макросами в нормальных ассемблерах типа MASM, fasm, NASM (правда, выглядеть это будет скорее как@ax = bx
или. ax = bx
).Запись от Jin X размещена 28.07.2018 в 09:13
Обновил(-а) Jin X 28.07.2018 в 18:36 -
Цитата:
https://upload.wikimedia.org/w... source.svg
Электронщикам можно использовать привычную для языков высокого уровня символику.
Со всех сторон наседают на ассемблеры!Запись от ОС размещена 29.07.2018 в 10:13 -
Бывают такие задачки, что их легче запрограммировать на языке ассемблера, чем на языке высокого уровня, в частности на С++. Например сцепление строки, с определенной частью другой строки, кода известно индекс первого символа и длина подстроки. При этом подстрока может быть в начале, в середине или в конце второй строки, которая задается в параметрах функции
Запись от Melamed размещена 30.07.2018 в 14:23 -
Цитата:Спасибо!
Раньше много чего по-другому было, биты тумблерами переключали, насколько мне известно . Я ж говорю: если хочется и вы видите в этом смысл – не вопрос. У К.К. даже есть статья про программирование в машинных кодах.
Заменять одно другим не стоит, разумеется. Я примерно об этом и говорю в последних 2-х абзацах. Каждый инструмент должен быть применён к месту и разумно – это касается всего, не только языков программирования. Когда я пишу на чистом асме, то делаю это чаще по приколу, чем по необходимости, потому что в большинстве случаев достаточно вставок.
Что касается высокоуровневого синтаксиса, то некоторые люди пытаются сделать что-то удобоваримое (HLA, к примеру). Но всё равно большой популярностью это не пользуется. Не могу сказать почему, ведь конструкции вроде .IF и .WHILE есть в том же masm32, и люди их вовсю применяют. Исходники на HLA выглядят вот так:
Код:begin BitCnt_1; push( ebx ); push( ecx ); mov( bits2Cnt, ebx ); mov( 0, eax ); for( mov( 32, ecx ); ecx > 0; dec( ecx )) do shr( 1, ebx ); if( @c ) then inc( eax ); endif; endfor; pop( ecx ); pop( ebx ); end BitCnt_1; . . . BitCnt_1( 1234567890 ); if( eax <> edx ) then stdout.put ( "BitCnt_1 produced an incorrect result: ", (type uns32 eax), " (Should have been ", (type uns32 edx), ")" nl ); endif;
Но конструкции видаax = bx
можно написать макросами в нормальных ассемблерах типа MASM, fasm, NASM (правда, выглядеть это будет скорее как@ax = bx
или. ax = bx
).Запись от Konst2016 размещена 30.07.2018 в 23:06 -
Цитата:Что же касается демосцены, то написать, скажем, intro, уместив исполняемый файл в 256 байт [1, 2, 3, 4] (а то и 128, 64, 32 или даже ещё меньше) на чём-то отличном от ассемблера вы вряд ли сможете.
На x64 не запускается видимо из-за нестандартного выравнивания секций.Запись от locm размещена 19.10.2018 в 21:37 -
locm, 816 байт – это далеко не предел.
Вот 97 байт для x86 и 286 байт для x64.
А demo/intro пишут не только под DOS, но и даже под паяльникиЗапись от Jin X размещена 25.10.2018 в 14:20
Обновил(-а) Jin X 25.10.2018 в 14:23