Ассемблер для начинающих / Хабр
В любом деле главное — начать. Или вот еще хорошая поговорка: «Начало — половина дела». Но иногда даже не знаешь как подступиться к интересующему вопросу. В связи с тем, что воспоминания мои еще свежи, спешу поделиться своими соображениями с интересующимися.
Скажу сразу, что лично я ассемблирую не под PC, а под микроконтроллеры. Но это не имеет большого значения, ибо (в отличие от микроконтроллеров AVR) система команд данных микроконтроллеров с PC крайне схожа. Да и, собственно говоря, ассемблер он и в Африке ассемблер.
Конечно, я не ставлю своей целью описать в этой статье всё необходимое от начала и до конца. Благо, по ассемблеру написано уже невообразимое число литературы. И да, мой опыт может отличаться от опыта других программистов, но я считаю не лишним изложить основную концепцию этого вопроса в моем понимании.
Для начала успокою любознательных новобранцев: ассемблер — это совсем не сложно, вопреки стереотипному мнению.
bset P2.0
И, как говорится, никаких проблем. Нужно включить сразу штуки четыре, подключенных последовательно? Да запросто:
mov P2, #000fh
Да, тут я подразумеваю, что начинающий боец уже знаком хотя бы со системами счисления. Ну хотя бы с десятичной. 😉
Итак, для достижения успеха в деле ассемблирования, следует разбираться в архитектуре (в моем случае) микроконтроллера. Это раз.
Кстати, одно из больных мест в познании архитектуры — это организация памяти. Тут на Хабре я видела соответствующую статью: habrahabr.ru/blogs/programming/128991. Еще могу упомянуть ключевые болевые точки: прерывания. Штука не сложная, но по началу (почему-то) тяжелая для восприятия.
Если перед вами стоит сложная задача и вы даже не знаете как по началу к ней подступиться, лучше всего написать алгоритм. Это воистину спасает. А по началу, даже если программа совершенно не сложная, лучше всё же начать с алгоритма, ибо этот процесс помогает разложить всё в голове по местам. Возвращаясь к примеру с вычислением двойного интеграла по экспериментальным данным, обдумывала алгоритм я весь день, но зато потом программку по нему написала всего за 20 минут. Плюс алгоритм будет полезен при дальнейшей модернизации и/или эксплуатации программы, а то ассемблерный код, временами, если и будет понятен построчно, то чтобы разобраться в чем же общая идея, придется немало потрудиться.
Итак, второй ключ к успеху — подробно написанный и хорошо продуманный алгоритм. Настоятельно рекомендую не садиться сразу за аппарат и писать программу. Ничего дельного вы с ходу не напишете. Это два.
Собственно, хотелось бы как Фандорин написать: «Это т-т-три»… Но, боюсь, на этом пока можно остановиться. Хотя хотелось бы добавить еще несколько рекомендаций и пряников.
Подводя итог моему несколько сумбурному монологу, ключевые моменты в программировании на ассемблере — это знание архитектуры и связное построение мыслей. Конечно, не обязательно сразу с головой кидаться в штудировании литературы с описанием внутренностей того же PC, но общее представление (повторюсь, хотя бы для начала) будет очень нужно.
А теперь обещанные пряники! Вот я тут распинаюсь о каком-то непонятном ассемблере, а что же в нем, собственно говоря, хорошего? Да много всего! Во-первых, конечно, не нужно запоминать много команд, используемых библиотек и прочей сопутствующей дребедени. Всего парочка команд и, считайте, вы во всеоружии. Во-вторых, в связи с крайней близостью к машинным кодам, вы можете делать практически всё, что душе угодно (в отличие от тех же языков высокого уровня)! В-третьих, ассемблерный код, по причине максимальной лаконичности в формулировках, выполняется крайне быстро.
В общем, сплошные плюсы. На этой оптимистической ноте разрешите откланяться.
Ассемблер_для_чайников
Поляков А.В. Ассемблер для чайников. | 1 | |
Информация об авторе: |
| |
Автор: | Поляков Андрей Валерьевич |
|
Web: | http://info-master.su |
|
e-mail: |
| |
Блог: | av-inf.blogspot.ru |
|
В контакте: | vk. com/id185471101 |
|
Фейсбук: | facebook.com/100008480927503 |
|
Страница книги: | http://av-assembler.ru/asm/afd/assembler-for-dummy.htm |
|
ВНИМАНИЕ!
Все права на данную книгу принадлежат Полякову Андрею Валерьевичу. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без согласования с автором.
Информация, содержащаяся в данной книге, получена из источников, рассматриваемых автором как надёжные. Тем не менее, имея в виду возможные человеческие или технические ошибки, автор не может гарантировать абсолютную точность и полноту приводимых сведений и не несёт ответственности за возможные ошибки и ущерб, связанные с использованием этого документа.
1. РАЗРЕШЕНИЯ
Разрешается использование книги в ознакомительных и образовательных целях (только для личного использования). Разрешается бесплатное распространение книги.
2. ОГРАНИЧЕНИЯ
Запрещается использование книги в коммерческих целях (продажа, размещение на ресурсах с платным доступом и т.п.). Запрещается вносить изменения в текст книги. Запрещается присваивать авторство.
См. также ЛИЦЕНЗИОННОЕ СОГЛАШЕНИЕ.
Поляков А.В. Ассемблер для чайников. | 2 |
Поляков А.В.
Ассемблер для чайников
2015 г.
Поляков А.В. Ассемблер для чайников. | 3 |
СОДЕРЖАНИЕ |
|
СОДЕРЖАНИЕ……………………………………………………………………………………………………………………………………………… | 3 |
ПРЕДИСЛОВИЕ …………………………………………………………………………………………………………………. ………………………… | 4 |
ВВЕДЕНИЕ ………………………………………………………………………………………………………………………………………………….. | 5 |
НЕМНОГО О ПРОЦЕССОРАХ ……………………………………………………………………………………………………………………………………. | 6 |
1. БЫСТРЫЙ СТАРТ ……………………………………………………………………………………………………………………………………… | 8 |
1.1. ПЕРВАЯ ПРОГРАММА……………………………………………………………………………………………………………………………………… | 8 |
1.1.1. Emu8086………………………………… …………………………………………………………………………………………………………. | 8 |
1.1.2. Debug ……………………………………………………………………………………………………………………………………………… | 12 |
1.1.3. MASM, TASM и WASM………………………………………………………………………………………………………………………. | 17 |
1.1.3.1. Ассемблирование в TASM …………………………………………………………………………………………………………………………… | 18 |
1.1.3.2. Ассемблирование в MASM………………………………………………………………………………………………………………………….. | 19 |
1. 1.3.3. Ассемблирование в WASM………………………………………………………………………………………………………………………….. | 19 |
1.1.3.4. Выполнение программы …………………………………………………………………………………………………………………………….. | 19 |
1.1.3.5. Использование BAT-файлов ………………………………………………………………………………………………………………………… | 20 |
1.1.4. Шестнадцатеричный редактор …………………………………………………………………………………………………….. | 22 |
Резюме………………………………………………………………………………………………………………………………… ………………….. | 25 |
2. ВВЕДЕНИЕ В АССЕМБЛЕР ………………………………………………………………………………………………………………………… | 26 |
2.1. КАК УСТРОЕН КОМПЬЮТЕР …………………………………………………………………………………………………………………………….. | 26 |
2.1.1. Структура процессора …………………………………………………………………………………………………………………… | 27 |
2.1.2. Регистры процессора ……………………………………………………………………………………………………………………… | 29 |
2.1.3. Цикл выполнения команды ……………………………………………………… ……………………………………………………… | 31 |
2.1.4. Организация памяти………………………………………………………………………………………………………………………. | 32 |
2.1.5. Реальный режим …………………………………………………………………………………………………………………………….. | 33 |
2.1.6. Защищённый режим ……………………………………………………………………………………………………………………….. | 34 |
2.2. СИСТЕМЫ СЧИСЛЕНИЯ ………………………………………………………………………………………………………………………………….. | 34 |
2.2.1. Двоичная система счисления …………… …………………………………………………………………………………………….. | 34 |
2.2.2. Шестнадцатеричная система счисления ……………………………………………………………………………………….. | 36 |
2.2.3. Другие системы ……………………………………………………………………………………………………………………………… | 37 |
2.3. ПРЕДСТАВЛЕНИЕ ДАННЫХ В ПАМЯТИ КОМПЬЮТЕРА………………………………………………………………………………………………. | 38 |
2.3.1. Положительные числа ……………………………………………………………………………………………………………………. | 38 |
2.3.2. Отрицательные числа………….. ……………………………………………………………………………………………………….. | 39 |
2.3.3. Что такое переполнение………………………………………………………………………………………………………………… | 40 |
2.3.4. Регистр флагов ………………………………………………………………………………………………………………………………. | 42 |
2.3.5. Коды символов………………………………………………………………………………………………………………………………… | 43 |
2.3.6. Вещественные числа………………………………………………………………………………………………………………………. | 44 |
2. 3.6.1. Первая попытка………………………………………………………………………………………………………………………………………….. | 44 |
2.3.6.2. Нормализованная запись числа…………………………………………………………………………………………………………………… | 45 |
2.3.6.3. Преобразование дробной части в двоичную форму …………………………………………………………………………………….. | 47 |
2.3.6.4. Представление вещественных чисел в памяти компьютера ………………………………………………………………………….. | 47 |
2.3.6.5. Числа с фиксированной точкой………………………………………………………………………………………………………………….. .. | 49 |
2.3.6.6. Числа с плавающей точкой………………………………………………………………………………………………………………………….. | 49 |
ЛИЦЕНЗИОННОЕ СОГЛАШЕНИЕ ………………………………………………………………………………………………………………….. | 52 |
Поляков А.В. Ассемблер для чайников. | 4 |
ПРЕДИСЛОВИЕ
Ассемблер – это магическое слово взывает благоговейный трепет у начинающих программистов. Общаясь между собой, они обязательно говорят о том, что где-то у кого-то есть знакомый «чувак», который может читать исходные коды на языке ассемблера как книжный текст. При этом, как правило, язык ассемблера воспринимается как нечто недоступное простым смертным.
Отчасти это действительно так. Можно выучить несколько простых команд и даже написать какую-нибудь программку, но настоящим гуру (в любом деле) можно стать только в том случае, когда человек очень хорошо знает теоретические основы и понимает, что и зачем он делает.
Есть другая крайность – бывалые программисты на языках высокого уровня убеждены, что язык ассемблера – это пережиток прошлого. Да, средства разработки за последние 20 лет шагнули далеко вперёд. Теперь можно написать простенькую программу вообще не зная ни одного языка программирования. Однако не стоит забывать о таких вещах, как, например, микроконтроллеры. Да и в компьютерном программировании некоторые задачи проще и быстрее решить с помощью языка ассемблера.
Данная книга предназначена для тех, кто уже имеет навыки программирования на языке высокого уровня, но хотел бы перейти «ближе к железу» и разобраться с тем, как выполняются команды процессора, как происходит распределение памяти, как управляются разные «железяки» типа дисководов и т.п.
Книга разбита на несколько разделов. Первый раздел – быстрый старт. Здесь очень кратко описаны основные принципы программирования на языке Ассемблера, сами ассемблеры (компиляторы) и методы работы с ассемблерами. Если вы уверенно себя чувствуете в программировании на высоком уровне, но хотели бы освоить азы низкоуровневого программирования, то, быть может, вам будет достаточно прочитать только этот раздел.
Второй раздел описывает такие вещи, как системы исчисления, представления данных в памяти компьютера и т.п., то есть вещи, которые непосредственно к программированию не относятся, но без которых профессиональное программирование невозможно. Также во втором разделе более подробно рассматриваются общие принципы программирования на языке Ассемблера.
Остальные разделы описывают некоторые конкретные примеры программирования на языке Ассемблера, содержат справочные материалы и т.п.
Основы программирования вообще в этой книге не описаны, поэтому для начинающих настоятельно рекомендую ознакомиться с книгой Как стать программистом, где разъяснены «на пальцах» общие принципы программирования и подробно рассмотрены примеры создания простых программ от программ для компьютеров до программ для станков с ЧПУ.
Поляков А.В. Ассемблер для чайников. | 5 |
ВВЕДЕНИЕ
Для начала разберёмся с терминологией.
Машинный код – система команд конкретной вычислительной машины (процессора), которая интерпретируется непосредственно процессором. Команда, как правило, представляет собой целое число, которое записывается в регистр процессора. Процессор читает это число и выполняет операцию, которая соответствует этой команде. Популярно это описано в книге Как стать программистом.
Язык программирования низкого уровня (низкоуровневый язык программирования) – это язык программирования, максимально приближённый к программированию в машинных кодах. В отличие от машинных кодов, в языке низкого уровня каждой команде соответствует не число, а сокращённое название команды (мнемоника). Например, команда ADD – это сокращение от слова ADDITION (сложение). Поэтому использование языка низкого уровня существенно упрощает написание и чтение программ (по сравнению с программированием в машинных кодах). Язык низкого уровня привязан к конкретному процессору. Например, если вы написали программу на языке низкого уровня для процессора PIC, то можете быть уверены, что она не будет работать с процессором AVR.
Язык программирования высокого уровня – это язык программирования, максимально приближённый к человеческому языку (обычно к английскому, но есть языки программирования на национальных языках, например, язык 1С основан на русском языке). Язык высокого уровня практически не привязан ни к конкретному процессору, ни к операционной системе (если не используются специфические директивы).
Язык ассемблера – это низкоуровневый язык программирования, на котором вы пишите свои программы. Для каждого процессора существует свой язык ассемблера.
Ассемблер – это специальная программа, которая преобразует (ассемблирует, то есть собирает) исходные тексты вашей программы, написанной на языке ассемблера, в исполняемый файл (файл с расширением EXE или COM). Если быть точным, то для создания исполняемого файла требуются дополнительные программы, а не только ассемблер. Но об этом позже…
В большинстве случаев говорят «ассемблер», а подразумевают «язык ассемблера». Теперь вы знаете, что это разные вещи и так говорить не совсем правильно. Хотя все программисты вас поймут.
ВАЖНО!
В отличие от языков высокого уровня, таких, как Паскаль, Бейсик и т.п., для КАЖДОГО АССЕМБЛЕРА существует СВОЙ ЯЗЫК АССЕМБЛЕРА. Это правило в корне отличает язык ассемблера от языков высокого уровня. Исходные тексты программы (или просто «исходники»), написанной на языке высокого уровня, вы в большинстве случаев можете откомпилировать разными компиляторами для разных процессоров и разных операционных систем. С ассемблерными исходниками это сделать будет намного сложнее. Конечно, эта разница почти не ощутима для разных ассемблеров, которые предназначены для одинаковых процессоров. Но в том то и дело, что для КАЖДОГО ПРОЦЕССОРА существует СВОЙ АССЕМБЛЕР и СВОЙ ЯЗЫК АССЕМБЛЕРА. В этом смысле программировать на языках высокого уровня гораздо проще. Однако за все удовольствия надо платить. В случае с языками высокого уровня мы можем столкнуться с такими вещами как больший размер исполняемого файла, худшее быстродействие и т.п.
Поляков А.В. Ассемблер для чайников. | 6 |
В этой книге мы будем говорить только о программировании для компьютеров с процессорами Intel (или совместимыми). Для того чтобы на практике проверить приведённые
вкниге примеры, вам потребуются следующие программы (или хотя бы некоторые из них):
1.Emu8086. Хорошая программа, особенно для новичков. Включает в себя редактор исходного кода и некоторые другие полезные вещи. Работает в Windows, хотя программы пишутся под DOS. К сожалению, программа стоит денег (но оно того стоит))). Подробности см. на сайте http://www.emu8086.com.
2.TASM – Турбо Ассемблер от фирмы Borland. Можно создавать программы как для DOS так и для Windows. Тоже стоит денег и в данный момент уже не поддерживается (да и фирмы Borland уже не существует). А вообще вещь хорошая.
3.MASM – Ассемблер от компании Microsoft (расшифровывается как МАКРО ассемблер, а не Microsoft Assembler, как думают многие непосвящённые). Пожалуй, самый популярный ассемблер для процессоров Intel. Поддерживается до сих пор. Условно бесплатная программа. То есть, если вы будете покупать её отдельно, то она будет стоить денег. Но она доступна бесплатно подписчикам MSDN и входит в пакет программ Visual Studio от Microsoft.
4.WASM – ассемблер от компании Watcom. Как и все другие, обладает преимуществами и недостатками.
5.Debug — обладает скромными возможностями, но имеет большой плюс — входит в стандартный набор Windows. Поищите ее в папке WINDOWS\COMMAND или WINDOWS\SYSTEM32. Если не найдете, тогда в других папках каталога WINDOWS.
6.Желательно также иметь какой-нибудь шестнадцатеричный редактор. Не помешает и досовский файловый менеджер, например Волков Коммандер (VC) или Нортон Коммандер (NC). С их помощью можно также посмотреть шестнадцатеричные коды файла, но редактировать нельзя. Бесплатных шестнадцатеричных редакторов в Интернете довольно много. Вот один из них: McAfee FileInsight v2.1. Этот же редактор можно использовать для работы с исходными текстами программ. Однако мне больше нравится делать это с помощью следующего редактора:
7.Текстовый редактор. Необходим для написания исходных текстов ваших программ. Могу порекомендовать бесплатный редактор PSPad, который поддерживает множество языков программирования, в том числе и язык Ассемблера.
Все представленные в этой книге программы (и примеры программ) проверены на работоспособность. И именно эти программы используются для реализации примеров программ, приведённых в данной книге.
И еще – исходный код, написанный, например для Emu8086, будет немного отличаться от кода, написанного, например, для TASM. Эти отличия будут оговорены.
Большая часть программ, приведённых в книге, написана для MASM. Во-первых, потому что этот ассемблер наиболее популярен и до сих пор поддерживается. Во-вторых, потому что он поставляется с MSDN и с пакетом программ Visual Studio от Microsoft. Ну и в третьих, потому что я являюсь счастливым обладателем лицензионной копии MASM.
Если же у вас уже есть какой-либо ассемблер, не вошедший в перечисленный выше список, то вам придётся самостоятельно разобраться с его синтаксисом и почитать руководство пользователя, чтобы научиться правильно с ним работать. Но общие рекомендации, приведённые в данной книге, будут справедливы для любых (ну или почти для любых) ассемблеров.
Немного о процессорах
Процессор – это мозг компьютера. Физически это специальная микросхема с несколькими сотнями выводов, которая вставляется в материнскую плату. Если вы с трудом представляете себе, что это такое, рекомендую ознакомиться со статьёй Чайникам о компьютерах.
Поляков А.В. Ассемблер для чайников. | 7 |
Процессоров существует довольно много даже в мире компьютеров. Но кроме компьютеров ещё есть телевизоры, стиральные машины, кондиционеры, системы управления двигателями внутреннего сгорания и т. п., где также очень широко используются процессоры (микропроцессоры, микроконтроллеры).
Каждый процессор обладает своим набором регистров. Регистры процессора – это такие специальные ячейки памяти, которые находятся непосредственно в микросхеме процессора. Регистры используются для разных целей (более подробно о регистрах будет написано ниже).
Каждый процессор имеет свой набор команд. Команда процессора записывается в определённый регистр, и тогда процессор выполняет эту команду. О командах процессора и регистрах мы будем говорить много и часто на протяжении всей книги. Для начинающих рекомендую книгу Как стать программистом, где в самых общих чертах, но зато понятным языком рассказано о принципах выполнения программы компьютером.
Что такое команда с точки зрения процессора? Это просто число. Однако современные процессоры могут иметь несколько сотен команд. Запомнить все их будет сложно. Как же тогда писать программы? Для упрощения работы программиста был придуман язык Ассемблера, где каждой команде соответствует мнемонический код. Например, число 4 соответствует мнемонике ADD. Иногда язык ассемблера ещё называют языком мнемонических команд.
Поляков А.В. Ассемблер для чайников. | 8 |
1. БЫСТРЫЙ СТАРТ
1.1. Первая программа
Обычно в качестве первого примера приводят программу, которая выводит на экран строку «Hello World!». Однако для человека, который только начал изучать Ассемблер, такая программа будет слишком сложной (вы будете смеяться, но это действительно так – особенно в условиях отсутствия доходчивой информации). Поэтому наша первая программа будет еще проще – мы выведем на экран только один символ – английскую букву «A». И вообще – если вы уж решили стать программистом – срочно установите по умолчанию английскую раскладку клавиатуры. Тем более что некоторые ассемблеры и компиляторы не воспринимают русские буквы. Итак, наша первая программа будет выводить на экран английскую букву «А». Далее мы рассмотрим создание такой программы с использованием различных ассемблеров.
1.1.1. Emu8086
Если вы скачали и установили эмулятор процессора 8086 (см. раздел «ВВЕДЕНИЕ»), то вы можете использовать его для создания ваших первых программ на языке ассемблера. На текущий момент (ноябрь 2011 г) доступна версия программы 4.08. Справку на русском языке вы можете найти здесь: http://www.avprog.narod.ru/progs/emu8086/help.html.
Программа Emu8086 платная. Однако в течение 30 дней вы можете использовать её для ознакомления бесплатно.
Итак, вы скачали и установили программу Emu8086 на свой компьютер. Запускаем её и создаём новый файл через меню FILE – NEW – COM TEMPLATE (Файл – Новый – Шаблон файла COM). В редакторе исходного кода после этого мы увидим следующее:
Рис. 1.1. Создание нового файла в Emu8086.
Поляков А.В. Ассемблер для чайников. | 9 |
Здесь надо отметить, что программы, создаваемые с помощью Ассемблеров для компьютеров под управлением Windows, бывают двух типов: COM и EXE. Отличия между этими файлами мы рассмотрим позже, а пока вам достаточно знать, что на первое время мы будем создавать исполняемые файлы с расширением COM, так как они более простые.
После создания файла в Emu8086 описанным выше способом в редакторе исходного кода вы увидите строку «add your code hear» — «добавьте ваш код здесь» (рис. 1.1). Эту строку мы удаляем и вставляем вместо неё следующий текст:
MOV AH, 02h
MOV DL, 41h
INT 21h
INT 20h
Таким образом, полный текст программы будет выглядеть так:
ORG 100h
MOV AH, 02h
MOV DL, 41h
INT 21h
INT 20h
RET
Кроме этого в верхней части ещё имеются комментарии (на рис. 1.1 – это текст зелёного цвета). Комментарий в языке Ассемблера начинается с символа ; (точка с запятой) и продолжается до конца строки. Если вы не знаете, что такое комментарии и зачем они нужны, см. книгу Как стать программистом. Как я уже говорил, здесь мы не будем растолковать азы программирования, так как книга, которую вы сейчас читаете, рассчитана на людей, знакомых с основами программирования.
Также отметим, что регистр символов в языке ассемблера роли не играет. Вы можете написать RET, ret или Ret – это будет одна и та же команда.
Вы можете сохранить этот файл куда-нибудь на диск. Но можете и не сохранять. Чтобы выполнить программу, нажмите кнопку EMULATE (с зелёным треугольником) или клавишу F5. Откроется два окна: окно эмулятора и окно исходного кода (рис. 1.2).
Вокне эмулятора отображаются регистры и находятся кнопки управления программой. В окне исходного кода отображается исходный текст вашей программы, где подсвечивается строка, которая выполняется в данный момент. Всё это очень удобно для изучения и отладки программ. Но нам это пока не надо.
Вокне эмулятора вы можете запустить вашу программу на выполнение целиком (кнопка RUN) либо в пошаговом режиме (кнопка SINGLE STEP). Пошаговый режим удобен для отладки. Ну а мы сейчас запустим программу на выполнение кнопкой RUN. После этого (если вы не сделали ошибок в тексте программы) вы увидите сообщение о завершении программы (рис. 1.3). Здесь вам сообщают о том, что программа передала управление операционной системе, то есть программа была успешно завершена. Нажмите кнопку ОК в этом окне и вы увидите, наконец, результат работы вашей первой программы на языке ассемблера (рис.
1.4).
Поляков А.В. Ассемблер для чайников. | 10 |
Рис. 1.2. Окно эмулятора Emu8086.
Рис. 1.3. Сообщение о завершении программы.
Рис. 1.4. Ваша первая программа выполнена.
Язык ассемблера
Что такое язык ассемблера?
Язык ассемблера — это тип языка программирования низкого уровня, который предназначен для прямого взаимодействия с аппаратным обеспечением компьютера. В отличие от машинного языка, состоящего из двоичных и шестнадцатеричных символов, языки ассемблера предназначены для чтения людьми.
Языки программирования низкого уровня, такие как язык ассемблера, являются необходимым связующим звеном между базовым аппаратным обеспечением компьютера и языками программирования более высокого уровня, такими как Python или JavaScript, на которых пишутся современные программы.
Ключевые выводы
- Язык ассемблера — это тип языка программирования, который переводит языки высокого уровня в машинный язык.
- Это необходимый мост между программами и лежащими в их основе аппаратными платформами.
- Язык ассемблера использует синтаксис языка, метки, операторы и директивы для преобразования кода в пригодные для использования машинные инструкции.
- Язык ассемблера может проходить через однопроходные или многопроходные ассемблеры, каждый из которых имеет свои особенности и преимущества.
- Сегодня языки ассемблера редко пишутся напрямую, хотя они все еще используются в некоторых нишевых приложениях, например, когда требования к производительности особенно высоки.
Как работают языки ассемблера
По сути, самые основные инструкции, выполняемые компьютером, представляют собой двоичные коды, состоящие из единиц и нулей. Эти коды напрямую переводятся в состояния «включено» и «выключено» электричества, проходящего через физические цепи компьютера. По сути, эти простые коды составляют основу «машинного языка», самой фундаментальной разновидности языка программирования.
Конечно, ни один человек не смог бы создавать современные программы, явно программируя единицы и нули. Вместо этого программисты-люди должны полагаться на различные уровни абстракции, которые позволяют им формулировать свои команды в формате, более интуитивно понятном людям.
В частности, современные программисты выдают команды на так называемых «языках высокого уровня», которые используют интуитивно понятный синтаксис, такой как целые английские слова и предложения, а также логические операторы, такие как «и», «или» и «иначе», которые знакомый для повседневного использования.
Однако в конечном итоге эти высокоуровневые команды необходимо перевести на машинный язык. Вместо того, чтобы делать это вручную, программисты полагаются на языки ассемблера, целью которых является автоматический перевод между этими высокоуровневыми и низкоуровневыми языками. Первые языки ассемблера были разработаны в 1940-х годах, и хотя современные программисты и современные процессоры естественного языка тратят очень мало времени на работу с языками ассемблера, они, тем не менее, остаются важными для функционирования компьютера в целом.
На заре вычислительной техники системное программирование и программирование приложений полностью выполнялись на языке ассемблера. Без языков ассемблера многие современные компьютеры и языки более высокого уровня, которые мы используем сегодня, были бы невозможны.
Компоненты языка ассемблера
Синтаксис
При написании любого кода на любом языке программирования существует наблюдаемый определенный порядок правил, которым необходимо следовать, чтобы позволить компилятору выполнить код без ошибок. Эти правила определяются как синтаксис и содержат такие критерии, как максимальное количество допустимых символов, с каких символов должны начинаться строки кода или что означают определенные символы, например, точка с запятой.
Этикетка
Метка — это символ, представляющий адрес, по которому хранится инструкция или данные. Его цель — выступать в качестве пункта назначения при ссылке в операторе. Метки можно использовать везде, где можно использовать адрес в языках ассемблера. Символическая метка состоит из идентификатора, за которым следует двоеточие, а числовые метки состоят из одной цифры, за которой следует двоеточие.
Операторы
Также называемые командами, операторы представляют собой логические выражения, которые появляются после поля метки. Кроме того, перед ним должен стоять хотя бы один пробел. Операторы могут быть кодом операции или директивой. Код операции напрямую соответствует машинным инструкциям, а код операции включает любое имя регистра, связанное с инструкцией. В качестве альтернативы, директивные коды операций являются инструкциями, известными ассемблеру.
Директива
Директивы — это инструкции для ассемблера, которые сообщают, какие действия должны выполняться в процессе сборки. Директивы важны для объявления или резервирования памяти для переменных; эти переменные могут быть вызваны позже в процессах для выполнения более динамичных функций. Директивы также используются для разбиения программ на разные разделы.
Макро
Макрос языка ассемблера представляет собой шаблонный формат обуви, представляющий серию или шаблон операторов. Эта последовательность операторов языка ассемблера может быть общей для нескольких разных программ. Средство макросов используется для интерпретации определений макросов, в то время как вызов макроса вставляется в исходный код, где вместо набора макрокоманд операторов должен быть «обычный» ассемблерный код.
Мнемоника
Мнемоника — это сокращение от операции. Мнемоника вводится в код операции для каждой инструкции ассемблерной программы, чтобы указать сокращенный «код операции», который представляет собой более крупный полный набор кодов. Например, мнемоника «умножить на два» имеет полный набор кодов, выполняющих мнемонику.
Высокочастотный трейдинг
Сегодня языки ассемблера остаются предметом изучения студентов, изучающих информатику, чтобы помочь им понять, как современное программное обеспечение связано с лежащими в его основе аппаратными платформами. В некоторых случаях программисты должны продолжать писать на языках ассемблера, например, когда требования к производительности особенно высоки или когда рассматриваемое оборудование несовместимо с какими-либо текущими языками высокого уровня.
Одним из таких примеров, имеющих отношение к финансам, являются платформы высокочастотной торговли (HFT), используемые некоторыми финансовыми фирмами. На этом рынке скорость и точность транзакций имеют первостепенное значение для того, чтобы торговые стратегии HFT оказались прибыльными. Поэтому, чтобы получить преимущество над своими конкурентами, некоторые HFT-фирмы написали свое торговое программное обеспечение непосредственно на языках ассемблера, что избавляет от необходимости ждать, пока команды с языка более высокого уровня будут переведены на машинный язык.
Многие считают, что языки ассемблера имеют самые крутые кривые обучения и являются самыми сложными языками вычислений для изучения.
Преимущества и недостатки языка ассемблера
Язык ассемблера обычно может выполняться быстрее, чем языки высокого уровня. Вставить или удалить компоненты кода на ассемблере относительно легко, и язык ассемблера обычно требует меньше инструкций для выполнения задачи по сравнению с другими типами языков.
Языки ассемблера также часто используются программистами, желающими лучше контролировать свои компьютеры, поскольку языки ассемблера позволяют вам напрямую манипулировать вашим оборудованием. Из-за его скорости и важности некоторые программы специально написаны на языке ассемблера, поскольку код обычно остается меньше.
Языки ассемблера, как правило, имеют несколько недостатков. Длинные программы, написанные на языке ассемблера, обычно требуют большей вычислительной мощности и не могут работать на небольших компьютерах. Некоторым может показаться, что синтаксис языка ассемблера труднее запомнить, и для написания кода на языке ассемблера может потребоваться больше времени, поскольку он более сложный. Кроме того, язык ассемблера обычно нельзя переносить между компьютерами разных марок; Подобно тому, как теряются льготы для сотрудников при смене компании, языки не могут быть легко переведены на разные компьютеры.
Плюсы
Исполнение может быть более простым по сравнению с другими языками
Выполнение обычно быстрее по сравнению с другими языками
Обеспечивает прямой контроль над оборудованием
Код может оставаться меньше по сравнению с другими языками
Минусы
Программирование может быть более сложным для понимания по сравнению с языками высокого уровня
Синтаксис языков ассемблера сложен
Не переносится между машинами
Типы сборщиков
Язык ассемблера должен быть переведен на машинный язык с помощью ассемблера. Существует два основных типа ассемблеров.
Однопроходный ассемблер сканирует программу один раз и создает эквивалентную двоичную программу. Этот тип ассемблера проверяет код на ассемблере, просматривая код в таблице мнемонических кодов. Однопроходный ассемблер часто быстрее, чем многопроходный ассемблер, и обычно нет необходимости создавать какой-либо промежуточный код.
Многопроходный ассемблер означает, что ассемблер использует более одного прохода. Многопроходные ассемблеры создают таблицу с каждым символом и каждым их значением в первом проходе, а затем используют эту таблицу в будущих проходах для генерации нового кода. Каждый отдельный проход обычно обрабатывает другую конкретную задачу. Хотя многопроходные ассемблеры с модульной структурой обычно медленнее, их часто можно повторно использовать для разных машин.
Пример кода языка ассемблера
Ниже приведен пример кода языка ассемблера Netwide Assembler (NASM).
Пример кода языка ассемблера.Университет Лойолы Мэримаунт
В этом примере инструкция SYSCALL в конце кода запускает часть памяти, где хранятся службы операционной системы. Затем код RAX используется для вызова написания кода, а затем RDI для выхода. Функция SYSCALL используется дважды для вызова операционной системы, а также для указания системе, когда код закончен и пора выйти.
Что такое пример языка ассемблера?
Наиболее часто используемые языки ассемблера включают ARM, MIPS и x86.
Является ли C++ языком ассемблера?
C++ не состоит из ассемблерного кода. Язык вычислений C++ состоит из кода C++, который компилятор переводит в исполняемый машинный код.
Является ли Python языком ассемблера?
Python более совершенен, чем языки ассемблера. Языки ассемблера считаются языком низкого уровня, в то время как языки высокого уровня, такие как C, Java или Python, используют 0 и 1 вместо цифр, символов и сокращений.
Как сегодня используются языки ассемблера?
Хотя языки ассемблера считаются языками более низкого уровня по сравнению с более продвинутыми языками, они по-прежнему используются. Язык ассемблера используется для непосредственного управления аппаратным обеспечением, доступа к специализированным инструкциям процессора или оценки критических проблем с производительностью. Эти языки также используются, чтобы использовать свое преимущество в скорости по сравнению с языками высокого уровня для срочных действий, таких как высокочастотная торговля.
Итог
Язык ассемблера — это низкоуровневый код, основанный на тесной взаимосвязи между инструкциями, вводимыми с помощью языка программирования, и тем, как машина интерпретирует инструкции кода. Код преобразуется в исполняемые действия с помощью ассемблера, который преобразует ввод в распознаваемые инструкции для машины. Хотя это было распространено на заре вычислительной техники, многие более крупные системы используют языки более высокого уровня.
Мое путешествие — это океаны звезд…
Мое путешествие — это океаны звезд…К чему все это?
.最好的回忆方式是看你从前的笔记,但是有一个前提:你的涂鸦或者随笔必须能让你自己都有足够的耐心去读,更不要说让别人一头蛾水的看知硨樨䉀乱语,所以,做笔记也是一个很好的技术,看得自己都赏心悦目由衷赞叹就是一个最简单的标准。同时写笔记扪心自问的过程也是一暪思跕嗶ﴮ候学习就是一个自我设问与自我回答的过程,比如小时候看的一休哥自己在脑门画圈然后进入冥想与禅定的状态,不知不觉中豁然开朗了。最后不怕暴露自己的错误想法其实也是一只庤有太多的精华思想要流传久远,要流传的不是太少而是太多,所以,尽量留下去粗取精的精华而不必让后人忍受提取过程遗留的作为中间产品的糟粕。怌我亯我媯我,整天担心的是没有留下什么而在生命的最后阶段也许会因为碌碌无为而忏悔,所以,我是毫不吝惜留下尽可能多的糟粕让未来的自己在生命弥留之际凭着老眼昏花昏花似的美景。所以,留下的是过程而不仅仅是结果。
或许也没有什么理由,仅仅是动物生存的本能一样周而复始,生存本身既本身既有意义繟没有意埸义,者产生了意识自己给自己想出了意义,而没有进化到需要生存意义的燕雀不过是一天到晚的忙碌而不知疲倦。
хроники:
- когда мое сердце молодо: Air-Talk
- , когда мое сердце еще моложе: Human-Talk
- когда мой мозг еще молод: DownloadList
- когда мой разум еще молод: OldPortal
- мои маленькие git-коллекции различных проектов с открытым исходным кодом: MyProjects
- , когда моя идея наивна: AmazonS3Backup (Возможно, вам никогда не понадобится использовать это, поскольку это просто псевдоним текущего веб-хостинга AWS S3. Причина, по которой он существует, заключается в том, что он был создан до переноса веб-хостинга на S3 давным-давно.)
Это списки всех файлов на этом веб-хостинге:
- Все файлы в древовидном стиле (сгенерированы программа) (Это рекомендуемый способ, поскольку он дает вам возможность просматривать структуру каталогов.)
- AllFileList (Теперь это двусвязный список файлов размером 10000 файлов на одной странице) (Это полезно только тогда, когда вы знаете имя файла, начинающееся с алфавита, но все еще нет индекса для страниц, может быть, следующий проект?)
- ВНИМАНИЕ!НЕ НАЖИМАТЬ! AllFileVector (чрезвычайно большой файл!!! Аналогично AllFileList, за исключением использования вектора) (если только вы не хотите очень долго ждать загрузки чрезвычайно большого файла, содержащего полный список файлов.)
Вот ярлыки самых обновленных блогов
- В прошлом году
- В этом году, в этом месяце, сегодня, в этот момент это сейчас происходит. ..
- актуальный хронический список: Старые времена
Вот некоторые ресурсы, которые я здесь размещаю.
- Я использую свою собственную версию «wget» с этими опциями: -nd -p —clobber —convert-links -r
-
Это мое эталонное зеркало C++, в котором я использую свою маленькую версию wget, загруженную (пиратскую) с официального веб-сайта: www.cplusplus.com/reference. Одно большое «хорошее» оправдание для этого заключается в том, что мой статический веб-хостинг должен быть очень дешевым и быстрым, чтобы я мог использовать его сам, поскольку официальный сайт иногда довольно медленный. (бык) - Это справочная страница Linux, которую я украл с http://man7.org/linux/man-pages/.
- Это школа w3c, которую я украл с https://www.w3schools.com/.
- По какой-то причине я загружаю снимок китайского веб-сайта с торгами на оборудование национальной обороны: 全军武器装备采购信息网 不知道是怎么回事?
- Это удивительно полная вики по моей самой любимой игре — HOMM3.