Что пишут на ассемблере
Перейти к содержимому

Что пишут на ассемблере

  • автор:

Для чего нужен ассемблер?

И следует ли его учить , если его уже заменяют? Так важно ли понимания того, что происходит на более глубоком, машинном уровне.

  • Вопрос задан более трёх лет назад
  • 19208 просмотров

Комментировать
Решения вопроса 0
Ответы на вопрос 9

TrueBers

Гуглю за еду

Скажем так: зачем уметь собирать-разбирать двигатель от машины и понимать как он работает?
99% людей это не нужно в принципе. Но если вы это знаете, вы можете легко диагностировать какую-то проблему, понять как её решить. При этом, каждый день вы не производите двигатели на станке.

То же самое с ассемблером: чтобы понимать как работает программа, как её отладить, диагностировать, понять, что не работает — для этого и нужен ассемблер. Писать на нём что-то конкретное и большое сейчас абсолютно бессмысленно. Его надо знать и понимать, этого достаточно.

Ответ написан более трёх лет назад
Комментировать
Нравится 9 Комментировать

Daemon23RUS

Daemon23RUS @Daemon23RUS

Я не понимаю его назначение

Поймите одну простую вещь, абсолютно любая программа написанная на абсолютно любом языке программирования, в конечном итоге для выполнения будет преобразована в машинный код процессора. А представлением этого кода как раз и является ассемблер.

И следует ли его учить , если его уже заменяют?

Его никто не заменяет, осмелюсь сказать он незаменим. Ассемблер обладает одним свойством, на нем оочень тяжело писать большие программы, даже используя макроассемблер. Представтье, что ассемблерной программе не нужна операционная система, ассемблер напрямую может взаимодействовать с устройствами, без драйверов (надо только написать протокол этого самого взаимодействия) Есть более удобные языки, например «С» или «С++». Решение об изучениии каждый принимает самостоятельно, в некоторых сферах ассемблер -незаменим. А в других — бесполезен и даже вреден.

Ответ написан более трёх лет назад
Комментировать
Нравится 4 Комментировать
Готовые решения — не подаю, но.

Учить, как и проходить — однозначно не надо.
Изучать — да, возможно. Хотя бы с точки зрения понимания работы процессора как такового.

Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать

15432

Системный программист ^_^

А ещё знание ассемблера нужно, если вы хотите понять, как работает та или иная скомпилированная программа (и затем написать схожую по функциональности свою или модифицировать эту).
В сфере информационной безопасности обязательно. Простой пример — в лаборатории Касперского вручную анализировать неизвестные вирусы. (если интересно, ЛК проводит курсы по этой теме и нанимает на стажировку)

Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать
evgeniy_lm @evgeniy_lm

К вашему сведению драйверы это часть ОС. Их как и всю ОС можно написать на СИ, можно на Assembler, а можно, например, на Pascal. Просто сейчас компьютеры настолько быстрые и имеют так много памяти, что оптимизация кода уходит на второй план. Хотя компиляторы современных языков программирования в плане оптимизации фору дадут большинству современных программистов.
Но все таки в серьезных программах есть много так называемых»узких мест» как правило это связано с нехваткой быстродействия, реже нехваткой памяти, тут на помощь приходит ассемблер.
Хотя чудику который говнокодит на PHP или JS этого не понять

PS Язык программирования это инструмент, а не стихотворение его учить не надо, на нем надо писать программы

Ответ написан более трёх лет назад
Нравится 1 2 комментария
А ты сильно глубоко говнокодил на js, пишешь как даун
evgeniy_lm @evgeniy_lm
Виталий: Ну, извини что задел за живое.
Коля К @Kolyagrozamorey
инженер-электроник службы ИТ ХАЕС

Программа правильно написана на ассемблере будет работать в несколько раз быстрее чем аналогичная программа написана на языку высокого уровня. Но если код программы на языке высокого уровня займет страницу, то на ассемблере 10-20 страниц. Так что если важна скорость и не боитесь написать с несколько десятков страниц кода пишите на ассемблере.

Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
«I’m here to consult you» © Dogbert

Для чего нужен ассемблер

Ещё пара ниш к уже перечисленным: разработка компиляторов и процессорных эмуляторов.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Павел @electronik777

Что бы было понятнее, лет 20 назад Asm еще использовался для оптимизации приложения, т.е для более оптимальной приложения. С развитием фрэймворков, эта надобность отпала как таковая, т.к сейчас производительность железа намного больше чем 20 лет назад, а ресурсы этого железа используются в среднем процентов на 30( не учитываем игры и 3д графику), да и мало кто уже использует низкоуровневые функции(привет от int13h). Единственное где еще может использоваться так это в real-time OS, где критически важны доли-долей микро-нано-секунд. В повседневной жизни это не пригодится, конечно если Вы не ходите разговаривать с процессором на его родном языке.

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать

dimonchik2013

Dimonchik @dimonchik2013
non progredi est regredi

. ну или вирусок какой на заказ

Что такое ассемблер и нужно ли его изучать

Этому языку уже за 70, но на пенсию он пока не собирается.

Полина Суворова для Skillbox Media

Марина Демидова

Марина Демидова

Программист, консультант, специалист по документированию. Легко и доступно рассказывает о сложных вещах в программировании и дизайне.

Есть традиция начинать изучение программирования с вывода на экран строки «Hello world!». На языке Python, например, это всего одна команда:

Стоит ли начинать изучение программирования с языка ассемблера?

Нет, так делать не нужно. Для этого есть несколько причин:

  • Ассемблер слишком сильно отличается от языков высокого уровня, и переходить с него на другой язык будет сложно.
  • Опыт, полученный при изучении ассемблера, в другом языке вам не пригодится. Изучение высокоуровневых языков после ассемблера придётся начинать с чистого листа.
  • Ассемблер — слишком подробный язык. Все рутинные действия, которые в других языках берёт на себя транслятор, в ассемблере приходится описывать программисту. Это может быстро наскучить.

Поэтому, даже если вы решили заняться профессией, связанной с ассемблером, изучение программирования вам лучше начинать с языка высокого уровня. А уж ассемблер после него будет выучить несложно.

Микропроцессор, выпущенный компанией Intel в 1979 году. Использовался в оригинальных компьютерах IBM PC.

Данные, которые обрабатываются командой — грамматической конструкцией языка программирования, обозначающей аргумент операции.

Центральная часть операционной системы, координирующая доступ приложений к процессорному времени, памяти, внешним устройствам.

Программа, которая обеспечивает загрузку самой OC сразу после включения компьютера.

Что такое ассемблер: где используется и актуален ли этот язык программирования в 2023 году

Язык ассемблера (от англ. assembly language) — это императивный язык низкого уровня, который используется для представления команд CPU. При этом команды процессора остаются читабельными для программиста. Под термином «ассемблер» также может подразумеваться ПО, которое преобразует соответствующий исходный код в машинный код. Обратный процесс (конвертация машинного кода в ассемблер-код) выполняет дизассемблер.

Простыми словами, язык ассемблера — это низкоуровневый язык, позволяющий программисту обращаться непосредственно к процессору машины.

Схема функционирования

Как работает язык ассемблера

Это самый низкоуровневый человекочитаемый язык программирования. Сегодня он используется для точного управления процессором и памятью на «голом» железе. Важно отметить: нет единого языка ассемблера. Существует множество таких языков.

Языки разнятся в зависимости от архитектуры, на которой функционирует машина (например, x86, x32, ARM или PowerPC).

Assembly language позволяет работать с читаемым машинным байт-кодом, который выполняется компьютером напрямую.

Оригинальный assembly language для Motorola MC6800

Оригинальный assembly language для Motorola MC6800

Процессор и память

Компьютеры состоят из множества аппаратных средств. Самым важным из них является процессор (CPU), который способен выполнять вычисления. Процессор состоит из множества компонентов, например, схем для выполнения основных математических операций (ALU и FPU) и регистров. Регистры можно представить как небольшие ячейки, в которых хранится горстка небольших чисел.

Представление программной модели CPU

Представление программной модели CPU

Помимо процессора, компьютер имеет и другие компоненты, такие как память (ОЗУ) и устройства ввода-вывода (такие как мышь, клавиатура, монитор и динамики). Для работы с этим оборудованием мы также можем использовать язык ассемблера.

Плашки оперативной памяти DDR4

Плашки оперативной памяти DDR4

Проблема в том, что процессор не понимает ассемблер. Слова и буквы типа «mov eax, 5» — ничего не значат для него. CPU понимает только двоичные числа, которые показывают ему то, что он должен делать со своим оборудованием. Это и есть машинный код. И у процессоров разных производителей свой набор таких чисел и команд.

Как это работает

Представьте, что у нас простой компьютер: он считывает три числа за один раз и далее решает, что делать. Первое прочитанное число — может сказать процессору, какую команду нужно выполнить. Например,

      • 0 — сложить два числа вместе, используя аппаратное обеспечение ALU.
      • 1 — поместить некоторое постоянное число в регистр.
      • 2 — выполнить следующую команду, только если определенный регистр имеет определенное значение.
      • 3 — заставить динамики воспроизвести звуковой сигнал.
      • . и так далее.

    Следующие два числа, которые считывает компьютер, могут сообщить ему аргументы команды. Например, когда он видит число 0, которое означает «сложить два числа», следующие два числа могут означать, какие именно два регистра компьютер должен сложить. Помните, регистры — это просто маленькие ячейки, в которых хранятся числа. Например:

    0 [команда] 3 [первый аргумент] 1 [второй аргумент] — добавить число в регистре №3 к числу в регистре №1 и поместить ответ в специальный регистр №0

    Мы, как создатели компьютера, просто решили, что при сложении — результат попадает в регистр №0 (нам так захотелось).

    Запоминание того, какое число что делает — может надоесть, а программа, представляющая собой просто набор чисел — станет очень запутанной. Вместо этого — мы можем создать код на языке ассемблера, который поможет убить всех зайцев сразу. В нашем языке не будут использоваться только нули и единицы, а будут также команды add (добавить) и put (поместить). Например, так:

        • add 3 1 = 0 3 1 (сложить регистры 3 и 1).
        • put 7 3 = 1 7 3 (поместить число 7 в регистр 3).
        • check 4 5 = 2 4 5 (проверить, что регистр 4 равен 5, и только в этом случае запустить следующую строку).
        • beep = 3 0 0 — воспроизвести звуковой сигнал. Обратите внимание, что мы не используем вторые два числа: на ассемблере мы можем просто написать «beep». Всё!

      Итак, у нас есть слова, соответствующие имеющимся командам. Затем мы используем программу, называемую ассемблером — она читает слова, написанные программистом на языке ассемблера, и преобразует их в числа машинного кода. Позже, программы обязательно станут еще более сложными и захочется писать на еще более читабельном языке. Тут и появится компилятор: он берет более сложный язык программирования и преобразует его в код на языке ассемблера, который затем преобразуется в машинный код ассемблером. Например, так:

          • if (3 + 7 == 10) then beep() (код на высокоуровневом языке программирования).
          • put 3 1 put 7 3 add 1 3 check 0 10 beep (код на языке ассемблера).
          • 1 3 1 1 1 7 3 0 1 3 2 0 10 3 0 0 (машинный код).

        Видите, как становится труднее читать код с каждым разом? Да, изначально наш компьютер и сам язык ассемблера были элементарными, но в конечном итоге все языки так усложняются . В них есть сотни команд, каждая из которых использует тот или иной аспект аппаратного обеспечения компьютера. Каждая команда представлена числами, а язык ассемблера — определяет красивый способ записи команд.

        Так работает язык ассемблера

        Так работает язык ассемблера

        Разные производители процессоров по-разному сопоставляют числа с командами и, соответственно, имеют разные машинные коды и язык ассемблера. Эти версии называются различными компьютерными архитектурами.

        Шестнадцатеричная система счисления также применяется в этих языках

        Шестнадцатеричная система счисления также применяется в этих языках

        Зачем нужен язык ассемблера и где он применяется

        Этот язык — прямое представление фактического машинного языка, который понимает компьютер. В конечном итоге все, что делает компьютер, сводится к этому машинному языку.

        Пример машинного кода программы на языке Java

        Пример машинного кода программы на языке Java

        Обычно разработчики применяют компиляторы или интерпретаторы, чтобы не приходилось осуществлять перевод команд вручную. Но, если вы сами захотите написать компилятор, то без понимания ассемблер-машины, сделать это не удастся.

        Если вы работаете с ОС напрямую (либо — напрямую с драйверами устройств), без языка ассемблера не обойтись. Кроме того, переход на язык ассемблера может осуществляться по соображениям скорости / производительности. Сегодняшние компиляторы эффективно справляются с теми задачами для которых они разработаны. Но код во внутреннем цикле непосредственно для процессора, оперативной памяти или другого компонента машины — может быть оптимизирован гораздо эффективнее, чем при использовании компилятора.

        Вот еще 5 сценариев, зачем нужен язык ассемблера:

            1. Доступ к специфическим аппаратным возможностям компьютера, которые являются очень редкими или нестандартными для конкретной платформы, чтобы компилятор выбранного языка мог их использовать или оптимизировать. Такая ситуация может возникать, например, если программирование осуществляется для конкретного оборудования (например, для конкретной модели видеокарты).
            2. Действительно важна производительность. Трудно превзойти компилятор языка C (например), но когда это необходимо — язык ассемблера действительно может помочь. Кроме того, это как правило единственный способ обогнать компилятор по быстродействию.
            3. Вы любопытны и хотите узнать, как работает компьютер на самом низком уровне. Assembly language практически напрямую связан с архитектурой аппаратного обеспечения. Поэтому, изучение assembly language — отличный способ узнать о том, как работает компьютер.
            4. Вы хотите лучше использовать дизассемблирование для отладки скомпилированных языков. Это справедливо для байткода Java и других битовых кодов LLVM.
            5. Вы самонадеянный новичок и наивно полагаете, что сможете победить хорошо оптимизированную (или даже не очень оптимизированную) программу на C, написав код на языке ассемблера.

            Кому нужен язык ассемблера

            Если вы заинтересованы в низкоуровневом программировании (в смысле операционных систем и драйверов устройств, а не в смысле «Hello, World»), встроенный ассемблерный код иногда включается в программы на языке C для выполнения тех задач, которые C не смог бы решить самостоятельно.

            Этот компилятор языка C имеет графический интерфейс

            Этот компилятор языка C имеет графический интерфейс

            Если вы интересуетесь проектированием микросхем или высокопроизводительными вычислениями, имея некоторое представление об ассемблере, вам будет гораздо легче понять, что происходит на самом деле (даже если вы не используете этот язык непосредственно для выполнения каких-либо действий).

            Изучение этих языков — способ привить себе опыт в необходимости программировать очень тщательно, потому что здесь очень мало того, что язык может сделать за вас (в отличие от типичного компилятора).

            Как устроен язык ассемблера: команды + пример

            В очень упрощенном виде, исполняемый язык во время выполнения может быть приближен к следующему представлению:

            [ label ] [ opcode [ operand [ ,operand [ ,operand ] ] ] ] [ ; comment ]

            Если перевести на русский язык, то получим такое представление:

            [ метка ] [ опкод [ операнд [ , операнд [ , операнд ] ] ] ] [ ; комментарий ]

            [ . ] — это необязательная часть строки.

            Большинство ассемблеров допускают гораздо более гибкий синтаксис, в котором все или часть необязательных компонентов являются выражениями, оцениваемыми во время сборки, а также — реализуют более или менее сложные директивы, макросы, библиотеки и так далее. Так что синтаксис может быть довольно сложным.

            Часто, opcode обозначает какой-либо стандартный оператор (ADD, OR . ) в трехадресном наборе инструкций. Например, так:

            opcode source 1, source 2, destination stands for 
            source 1 opcode source 2 => destination

            В зависимости от архитектуры целевого процессора и набора инструкций, опкод может иметь от нуля до трех операндов. Вот примеры:

                • NOP ; нет операции, не имеет операндов. Неявным является счетчик программы — он указывает на первую инструкцию после NOP.
                • CLeaR operand ; 0 => operand.
                • ADD D, S ; Destination Destination (Источник0 + Источник1 => Место назначения).

              Еще примеры команд:

                  • ADD A, B — добавить число в ячейке памяти B к числу в ячейке A.
                  • MOVE B, C — переместить число в ячейке C в ячейку памяти B.
                  • Команды ADD и MOVE называются кодами команд или мнемониками.

                Востребован ли сегодня ассемблер

                Мы нашли специализированного программиста, который много лет работает с языками этого типа и задали ему простой вопрос: «Стоит ли изучать эти языки сегодня?». Ответ ниже:

                «Нет. Как программист на языке ассемблера, я не думаю, что вам нужно его изучать (если только вы не окажетесь одним из немногих, кому он реально нужен). Или, если ваше интеллектуальное любопытство подтолкнет вас к этому языку, в таком случае — добро пожаловать в клуб. Таким образом, язык ассемблера — такой краеугольный навык, жизненно важный — лишь для единиц, интересный — чуть для большего количества программистов. Ну а для подавляющего большинства — он просто не нужен.

                Язык ассемблера всегда будет где-то необходим. Является ли это гарантией того, что вы получите хорошую работу? Нет. Но и пустой тратой времени его изучение точно не будет».

                Вот ещё несколько сценариев, когда этот язык точно понадобится:

                    1. Когда вы беретесь за написание компилятора.
                    2. Когда вы изучаете устройство процессора.
                    3. При чтении внутренних частей ядра ОС.
                    4. При изучении производительности компьютера.
                    5. Портирование операционных систем на новые архитектуры
                    6. Проектирование атомарных операций и примитивов синхронизации, блокировки и разблокировки и тому подобное.
                    7. Написание генераторов кода компилятора.
                    8. Написание высокопроизводительных математических библиотек и библиотек времени выполнения.
                    9. Некоторые задачи цифровой обработки сигналов и коммуникаций.
                    10. Программы ядра для использования с крайне низким энергопотреблением (AirPods и тому подобное).

                    Подборка книг и полезные видео

                    Напоследок — три книги, которые должен прочитать каждый, кто хочет научиться работать на этих языках:

                        1. Программирование на ассемблере на платформе x86-64, Руслан Аблязов. Обложка книги «Программирование на ассемблере на платформе x86-64»Обложка книги «Программирование на ассемблере на платформе x86-64»
                        2. Профессиональное программирование на ассемблере x64 с расширениями AVX, AVX2 и AVX-512, Куссвюрм Даниэль. Обложка книги «Профессиональное программирование на ассемблере x64 с расширениями AVX, AVX2 и AVX-512»
                          Обложка книги «Профессиональное программирование на ассемблере x64 с расширениями AVX, AVX2 и AVX-512»
                        3. Программирование на ассемблере х64. От начального уровня до профессионального использования AVX. Йо Ван Гуй. Обложка книги «Программирование на ассемблере х64. От начального уровня до профессионального использования AVX»Обложка книги «Программирование на ассемблере х64. От начального уровня до профессионального использования AVX»

                    Также обязательно посмотрите эти видео:

                    Assembly Language in 100 Seconds. Изучите основы Ассемблера с NASM за 100 секунд.

                    What is assembly language?. Краткое введение в язык ассемблера и то, как он может создавать машинный код.

                    What Is Assembly Language?. Язык ассемблера является основополагающим для работы компьютеров. Вкратце автор видео рассмотрит очень простой язык ассемблера и покажет, какое место он занимает в системе.

                    Why should I learn assembly language in 2020? (complete waste of time?). В этом видео вы найдёте ещё несколько важных причин изучать язык в 2023 году.

                    Is it worth learning assembly language today? | One Dev Question. Нужно ли разработчикам знать язык ассемблера в наше время? Ларри Остерман из Microsoft высказывает свое мнение.

                    Почему Ассемблер — это круто, но сложно

                    Есть высокоуровневые языки — это те, где вы говорите if — else, print, echo, function и так далее. «Высокий уровень» означает, что вы говорите с компьютером более-менее человеческим языком. Другой человек может не понять, что именно у вас написано в коде, но он хотя бы сможет прочитать слова.

                    Но сам компьютер не понимает человеческий язык. Компьютер — это регистры памяти, простые логические операции, единицы и нули. Поэтому прежде чем ваша программа будет исполнена процессором, ей нужен переводчик — программа, которая превратит высокоуровневый язык программирования в низкоуровневый машинный код.

                    Ассемблер — это собирательное название языков низкого уровня: код всё ещё пишет человек, но он уже гораздо ближе к принципам работы компьютера, чем к принципам мышления человека.

                    Вариантов Ассемблера довольно много. Но так как все они работают по одинаковому принципу и используют (в основном) одинаковый синтаксис, мы будем все подобные языки называть общим словом «Ассемблер».

                    Как мыслит процессор

                    Чтобы понять, как работает Ассемблер и почему он работает именно так, нам нужно немного разобраться с внутренним устройством процессора.

                    Кроме того, что процессор умеет выполнять математические операции, ему нужно где-то хранить промежуточные данные и служебную информацию. Для этого в самом процессоре есть специальные ячейки памяти — их называют регистрами.

                    Регистры бывают разного вида и назначения: одни служат, чтобы хранить информацию; другие сообщают о состоянии процессора; третьи используются как навигаторы, чтобы процессор знал, куда идти дальше, и так далее. Подробнее — в расхлопе ↓

                    Какими бывают регистры

                    Общего назначения. Это 8 регистров, каждый из которых может хранить всего 4 байта информации. Такой регистр можно разделить на 2 или 4 части и работать с ними как с отдельными ячейками.

                    Указатель команд. В этом регистре хранится только адрес следующей команды, которую должен выполнить процессор. Вручную его изменить нельзя, но можно на него повлиять различными командами переходов и процедур.

                    Регистр флагов. Флаг — какое-то свойство процессора. Например, если установлен флаг переполнения, значит процессор получил в итоге такое число, которое не помещается в нужную ячейку памяти. Он туда кладёт то, что помещается, и ставит в этот флаг цифру 1. Она — сигнал программисту, что что-то пошло не так.

                    Флагов в процессоре много, какие-то можно менять вручную, и они будут влиять на вычисления, а какие-то можно просто смотреть и делать выводы. Флаги — как сигнальные лампы на панели приборов в самолёте. Они что-то означают, но только самолёт и пилот знают, что именно.

                    Сегментные регистры. Нужны были для того, чтобы работать с оперативной памятью и получать доступ к любой ячейке. Сейчас такие регистры имеют по 32 бита, и этого достаточно, чтобы получить 4 гигабайта оперативки. Для программы на Ассемблере этого обычно хватает.

                    Так вот: всё, с чем работает Ассемблер, — это команды процессора, переменные и регистры.

                    Здесь нет привычных типов данных — у нас есть только байты памяти, в которых можно хранить что угодно. Даже если вы поместите в ячейку какой-то символ, а потом захотите работать с ним как с числом — у вас получится. А вместо привычных циклов можно просто прыгнуть в нужное место кода.

                    Команды Ассемблера

                    Каждая команда Ассемблера — это команда для процессора. Не операционной системе, не файловой системе, а именно процессору — то есть в самый низкий уровень, до которого может дотянуться программист.

                    Любая команда на этом языке выглядит так:

                    Метка — это имя для фрагмента кода. Например, вы хотите отдельно пометить место, где начинается работа с жёстким диском, чтобы было легче читать код. Ещё метка нужна, чтобы в другом участке программы можно было написать её имя и сразу перепрыгнуть к нужному куску кода.

                    Команда — служебное слово для процессора, которое он должен выполнить. Специальные компиляторы переводят такие команды в машинный код. Это сделано для того, чтобы не запоминать сами машинные команды, а использовать вместо них какие-то буквенные обозначения, которые проще запомнить. В этом, собственно, и выражается человечность Ассемблера: команды в нём хотя бы отдалённо напоминают человеческие слова.

                    Операнды отвечают за то, что именно будут делать команды: какие ячейки брать для вычислений, куда помещать результат и что сделать с ним дополнительно. Операндом могут быть названия регистров, ячейки памяти или служебные части команд.

                    Комментарий — это просто пояснение к коду. Его можно писать на любом языке, и на выполнение программы он не влияет. Примеры команд:

                    mov eax, ebx ; Пересылаем значение регистра EBX в регистр EAX mov x, 0 ; Записываем в переменную x значение 0 add eax, х ; Складываем значение регистра ЕАХ и переменной х, результат отправится в регистр ЕАХ

                    Здесь нет меток, первыми идут команды (mov или add), а за ними — операнды и комментарии.

                    Пример: возвести число в куб

                    Если нам понадобится вычислить х³, где х занимает ровно один байт, то на Ассемблере это будет выглядеть так.

                    Первый вариант

                    mov al, x ; Пересылаем x в регистр AL imul al ; Умножаем регистр AL на себя, AX = x * x movsx bx, x ; Пересылаем x в регистр BX со знаковым расширением imul bx ; Умножаем AX на BX. Результат разместится в DX:AX

                    Второй вариант

                    mov al, x ; Пересылаем x в регистр AL imul al ; Умножаем регистр AL на себя, AX = x * x cwde ; Расширяем AX до EAX movsx ebx, x ; Пересылаем x в регистр EBX со знаковым расширением imul ebx ; Умножаем EAX на EBX. Поскольку x – 1-байтовая переменная, результат благополучно помещается в EAX

                    На любом высокоуровневом языке возвести число в куб можно одной строкой. Например:

                    на худой конец x = x*x*x.

                    Хитрость в том, что когда каждая из этих строк будет сведена к машинному коду, этого кода может быть и 5 команд, и 10, и 50, и даже 100. Чего стоит вызов объекта Math и его метода pow: только на эту служебную операцию (ещё до самого возведения в куб) может уйти несколько сотен и даже тысяч машинных команд.

                    А на Ассемблере это гарантированно пять команд. Ну, или как реализуете.

                    Почему это круто

                    Ассемблер позволяет работать с процессором и памятью напрямую — и делать это очень быстро. Дело в том, что в Ассемблере почти не тратится зря процессорное время. Если процессор работает на частоте 3 гигагерца — а это примерно 3 миллиарда процессорных команд в секунду, — то очень хороший код на Ассемблере будет выполнять примерно 2,5 миллиарда команд в секунду. Для сравнения, JavaScript или Python выполнят в тысячу раз меньше команд за то же время.

                    Ещё программы на Ассемблере занимают очень мало места в памяти. Именно поэтому на этом языке пишут драйверы, которые встраивают прямо в устройства, или управляющие программы, которые занимают несколько килобайт. Например, программа, которая находится в брелоке сигнализации и управляет безопасностью всей машины, занимает всего пару десятков килобайт. А всё потому, что она написана для конкретного процессора и использует его возможности на сто процентов.

                    Справедливости ради отметим, что современные компиляторы С++ дают машинный код, близкий по быстродействию к Ассемблеру, но всё равно немного уступают ему.

                    Почему это сложно

                    Для того, чтобы писать программы на Ассемблере, нужно очень любить кремний:

                    • понимать архитектуру процессора;
                    • знать устройство железа, которое работает с этим процессором;
                    • знать все команды, которые относятся именно к этому типу процессоров;
                    • уметь работать с данными в побайтовом режиме (забудьте о строках и массивах, ведь ваш максимум — это одна буква);
                    • понимать, как в ограниченных условиях реализовать нужную функциональность.

                    Теперь добавьте к этому отсутствие большинства привычных библиотек для работы с чем угодно, сложность чтения текста программы, медленную скорость разработки — и вы получите полное представление о программировании на Ассемблере.

                    Для чего всё это

                    Ассемблер незаменим в таких вещах:

                    • драйверы;
                    • программирование микроконтроллеров и встраиваемых процессоров;
                    • куски операционных систем, где важно обеспечить скорость работы;
                    • антивирусы (и вирусы).

                    На самом деле на Ассемблере можно даже запилить свой сайт с форумом, если у программиста хватает квалификации. Но чаще всего Ассемблер используют там, где даже скорости и возможностей C++ недостаточно.

                    Получите ИТ-профессию

                    В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *