Введение. Когда был создан ассемблер(assembler) и машинный язык? Происхождение и критика термина «язык ассемблера»

Государственное Бюджетно-Образовательное Учреждение

Предмет : информатика

Реферат

Тема: История языков программирования.

Ассемблер.

Выполнил : ученик 8 класса,

средней школы №1467

Сорокин Николай

Руководитель : Цветкова Оксана Михайловна

Введение

С увеличением объёма вычислений появился первый счётный переносной инструмент – “Счёты”.

В начале 17 века возникла необходимость в сложных вычислениях. потребовались счётные устройства, способные выполнять большой объём вычислений с высокой точностью. В 1642 г. французский математик Паскаль сконструировал первую механическую счётную машину – “Паскалину”.

В 1830 г. английский учёный Бэбидж предложил идею первой программируемой вычислительной машины (“аналитическая машина”). Она должна была приводиться в действие силой пара, а программы кодировались на перфокарты. Реализовать эту идею не удалось, так как было не возможно сделать некоторые детали машины.

Первый реализовал идею перфокарт Холлерит. Он изобрёл машину для обработки результатов переписи населения. В своей машине он впервые применил электричество для расчётов. В 1930 г. американский учёный Буш изобрел дифференциальный анализатор – первый в мире компьютер.

Большой толчок в развитии вычислительной техники дала вторая мировая война. Военным понадобился компьютер, которым стал “Марк-1” – первый в мире цифровой компьютер, изобретённый в 1944 г. профессором Айкнем. В нём использовалось сочетание электрических сигналов и механических приводов. Размеры: 15 X 2,5 м., 750000 деталей. Могла перемножить два 23-х разрядных числа за 4 с.

В 1946 г. группой инженеров по заказу военного ведомства США был создан первый электронный компьютер – “Эниак”. Быстродействие: 5000 операций сложения и 300 операций умножения в секунду. Размеры: 30 м. в длину, объём – 85 м3., вес – 30 тонн. Использовалось 18000 эл. ламп.

Первая машина с хронимой программой – ”Эдсак” – была создана в 1949 г., а в 1951 г. создали машину “

Юнивак” – первый серийный компьютер с хронимой программой. В этой машине впервые была использована магнитная лента для записи и хранения информации

Для чего нужен язык программирования?

Компьютеpы появились очень давно в нашем миpе, но только в последнее вpемя их начали так усиленно использовать во многих отpаслях человеческой жизни. Ещё десять лет назад было редкостью увидеть какой-нибудь персональный компьютер - они были, но были очень дорогие, и даже не каждая фирма могла иметь у себя в офисе компьютер. А теперь? Теперь в каждом третьем доме есть компьютер, который уже глубоко вошёл в жизнь самих обитателей дома.

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

Но человеку ведь тоже надо как-нибудь общаться с машиной - ведь кому нужна неуправляемая машина? Сначала люди вели своё общение с компьютерам посредством перфокарт. Перфокарты - это небольшие карточки, на которые нанесены ряды цифр. У компьютера имелся “дисковод”, в который вставлялись сами карты и он при помощи маленьких иголочек ставил дырочки на цифрах. Такое общение мало кому доставляло удовольствие - ведь не очень удобно таскать с собой кучи перфокарт, которые после одного использования приходилось выбрасывать.

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

Современные вычислительные машины представляют одно из самых значительных достижений человеческой мысли, влияние которого на развитие научно-технического прогресса трудно переоценить. Области применения ЭВМ непрерывно расширяются. Этому в значительной степени способствует распространение персональных ЭВМ, и особенно микроЭВМ.

За время, прошедшее с 50-х годов, цифровая ЭВМ превратилась из “волшебного”, но при этом дорогого, уникального и перегретого нагромождения электронных ламп, проводов и магнитных сердечников в небольшую по размерам машину – персональный компьютер – состоящий из миллионов крошечных полупроводниковых приборов, которые упакованы в небольшие пластмассовые коробочки.

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

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

Очень широкое распространение получили игры, построенные на основе микропроцессоров. Сегодня игровая индустрия занимает очень большую часть рынка, постепенно вытесняя с него другие развлечения детей. Но для детского организма очень вредно сидеть часами за монитором и отчаянно нажимать на клавиши, так как у ребёнка может развиться своеобразная болезнь - когда у него только одно на уме – компьютер, и больше ничего. Дети с такой болезнью обычно становятся агрессивными, если их начинают ограничивать в доступе к играм. У таких детей сразу пропадает какое-либо желание делать что-то, что не относится к компьютеру и что им не интересно - так они начинают забрасывать свою учёбу, что ведёт к не очень хорошим последствиям.

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

Компьютеры способны также воспринимать устную речь в качестве сигналов, однако им приходится выполнять большую работу по расшифровке услышанного, если форма общения жестко не установлена. Ведь одну и ту же команду один и тот же человек может произнести несколькими способами, и всё время эта команда будет звучать по-разному; а в целом мире - миллиарды людей, и каждый произносит одну и ту же команду несколькими различными способами. Поэтому в данное время довольно сложно создать компьютер, который будет управляться при помощи голоса человека. Многие фирмы пытаются решить эти проблемы. Некоторые фирмы делают небольшие шажки на пути к данной цели, но всё равно эти шажки пока ещё почти незаметные.

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

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

Мы часто жалуемся, что другие люди не понимают нас; но пока и сами персональные компьютеры не способны до конца понять нас, или понять, что мы хотим сказать с полуслова. И в течение какого-то периода времени нам придётся довольствоваться такими машинами, которые просто следуют нашим указаниям, исполняя их “с точностью до миллиметра”.

Для общения с компьютерами, ещё во времена перфокарт, тогдашние программисты использовали язык программирования, очень похожий на современный Ассемблер. Это такой язык, где все команды, поступающие к компьютеру пишутся подробно при помощи специальных слов и значков{?}.

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

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

Боьшинство людей, по-видимому, считают, что термины “вычислительная машина” и “вычислительная техника” синонимами и связывают их с физическим оборудованием, как, например, микропроцессором, дисплеем, дисками, принтерами и другими истройствами, привлекающими внимание людей, когда человек видит компьютер. Хотя эти устройства и важны, всё-таки они составляют только “верхушку айсберга”. На начальном этапе использованаия современного компьютера мы имеем дело не с самим компьютером, а с совокупностью правил, называемых языками программироваания, на которых указываются действия, которые должен выполнять компьютер. Важное значение языка программирования подчёркивается тем фактом, что сама вычислительная машина может рассматриваться как аппаратный интерпретатор какого-нибудь конкретного языка, который называется машинным языком. Для обеспечения эффективной работы машины разработаны машинные языки, использование которых представляет известные трудностидля человека. Большинство пользователей не чувствуют этих неудобств благодаря наличию одного или нескольких языков, созданных для улучшения связи человека с машиной. Гибкость вычислительной машины проявляется в том, что она может исполнять программы-трансляторы (в общем случае онм называются компиляторами или интерпретаторами) для преобразования программ с языков, ориентированных на пользователей, в программы на машинном языке. (В свою очередь даже сами программы, игры, системные оболочки являются ни чем иным, как довольно простая программа-транслятор, которая по мере работы, или игры обращается при помощи своих команд к “компьютерным внутренностям и наружностям”, транслиуя свои команды в машинные языки. И всё это происходит в реальном времени.)

Машинные языки, языки ассемблера и

языки высокого уровня

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

1. Машинные языки

2. Ассемблерные языки

3. Языки высокого уровня.

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

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

Одним из языко высокого уровня является язык программирования С.

История языка С

Язык с берет свое начало от двух языков, BCPL и B. В 1967 году Мартин Ричардс разработал BCPL как язык для написания системного программного обеспечения и компиляторов. В 1970 году Кен Томпсон использовал В для создания ранних версий операционной системы UNIX на компьютере DEC PDP-7. как в BCPL, так и в В переменные не разделялись на типы- каждое значение данных занимало одно слово в памяти и ответственность на различение, например, целых и действительных чисел целиком ложилась на плечи программиста.

Язык С был разработан (на основе В) Деннисом Ричи из Bell Laboratories и впервые был реализован в 1972 году на компьютере DEC PDP-11. Известность С получил в качестве языка ОС UNIX. Сегодня практически все основные операционные системы были написаны на С и/ или С++. По прошествии двух десятилетий С имеется в наличии на большинстве компьютеров. Он не зависит от аппаратной части.

В конце 70-х годов С превратился в то, что мы называем «традиционный С». В 1983 году Американским комитетом национальных стандартов в области компьютеров и обработке информации был учрежден единый стандарт этого языка.

Заключение

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

Список использованной литературы

1. Том Сван “Освоение Turbo Assembler”, Диалектика, Киев, 1996 г.

2. Березин Б.И., Березин С.Б. “Начальный курс программирования”, Диалог МИФИ, Москва, 1996 г.

3. Лекции Комлевой Нины Викторовны по предмету “Языки программирования и методы трансляции”

4.Х.М.Дейтел, Как программировать на С, Издательство Бином, Москва, 2000 г.


Для начала разберёмся с терминологией.

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

Язык программирования низкого уровня (низкоуровневый язык программирования) – это язык программирования, максимально приближённый к программированию в машинных кодах. В отличие от машинных кодов, в языке низкого уровня каждой команде соответствует не число, а сокращённое название команды (мнемоника). Например, команда ADD – это сокращение от слова ADDITION (сложение). Поэтому использование языка низкого уровня существенно упрощает написание и чтение программ (по сравнению с программированием в машинных кодах). Язык низкого уровня привязан к конкретному процессору. Например, если вы написали программу на языке низкого уровня для процессора PIC, то можете быть уверены, что она не будет работать с процессором AVR.

Язык программирования высокого уровня – это язык программирования, максимально приближённый к человеческому языку (обычно к английскому, но есть языки программирования на национальных языках, например, язык 1С основан на русском языке). Язык высокого уровня практически не привязан ни к конкретному процессору, ни к операционной системе (если не используются специфические директивы).

Язык ассемблера – это низкоуровневый язык программирования, на котором вы пишите свои программы. Для каждого процессора существует свой язык ассемблера.

Ассемблер – это специальная программа, которая преобразует (компилирует) исходные тексты вашей программы, написанной на языке ассемблера, в исполняемый файл (файл с расширением EXE или COM). Если быть точным, то для создания исполняемого файла требуются дополнительные программы, а не только ассемблер. Но об этом позже…

В большинстве случаев говорят «ассемблер», а подразумевают «язык ассемблера». Теперь вы знаете, что это разные вещи и так говорить не совсем правильно. Хотя все программисты вас поймут.

ВАЖНО!
В отличие от языков высокого уровня, таких, как Паскаль , Бейсик и т.п., для КАЖДОГО АССЕМБЛЕРА существует СВОЙ ЯЗЫК АССЕМБЛЕРА. Это правило в корне отличает язык ассемблера от языков высокого уровня. Исходные тексты программы (или просто «исходники»), написанной на языке высокого уровня, вы в большинстве случаев можете откомпилировать разными компиляторами для разных процессоров и разных операционных систем. С ассемблерными исходниками это сделать будет намного сложнее. Конечно, эта разница почти не ощутима для разных ассемблеров, которые предназначены для одинаковых процессоров. Но в том то и дело, что для КАЖДОГО ПРОЦЕССОРА существует СВОЙ АССЕМБЛЕР и СВОЙ ЯЗЫК АССЕМБЛЕРА. В этом смысле программировать на языках высокого уровня гораздо проще. Однако за все удовольствия надо платить. В случае с языками высокого уровня мы можем столкнуться с такими вещами как больший размер исполняемого файла, худшее быстродействие и т.п.


В этой книге мы будем говорить только о программировании для компьютеров с процессорами Intel (или совместимыми). Для того чтобы на практике проверить приведённые в книге примеры, вам потребуются следующие программы (или хотя бы некоторые из них):

  1. . Хорошая программа, особенно для новичков. Включает в себя редактор исходного кода и некоторые другие полезные вещи. Работает в Windows, хотя программы пишутся под DOS. К сожалению, программа стоит денег (но оно того стоит))). Подробности см. на сайте http://www.emu8086.com .
  2. – Турбо Ассемблер от фирмы Borland. Можно создавать программы как для DOS так и для Windows. Тоже стоит денег и в данный момент уже не поддерживается (да и фирмы Borland уже не существует). А вообще вещь хорошая.
  3. – Ассемблер от компании Microsoft (расшифровывается как МАКРО ассемблер, а не Microsoft Assembler, как думают многие непосвящённые). Пожалуй, самый популярный ассемблер для процессоров Intel. Поддерживается до сих пор. Условно бесплатная программа. То есть, если вы будете покупать её отдельно, то она будет стоить денег. Но она доступна бесплатно подписчикам MSDN и входит в пакет программ Visual Studio от Microsoft.
  4. – ассемблер от компании Watcom. Как и все другие, обладает преимуществами и недостатками.
  5. - обладает скромными возможностями, но имеет большой плюс - входит в стандартный набор Windows. Поищите ее в папке WINDOWS\COMMAND или WINDOWS\SYSTEM32. Если не найдете, тогда в других папках каталога WINDOWS.
  6. Желательно также иметь какой-нибудь . Не помешает и досовский файловый менеджер, например Волков Коммандер (VC) или Нортон Коммандер (NC). С их помощью можно также посмотреть шестнадцатеричные коды файла, но редактировать нельзя. Бесплатных шестнадцатеричных редакторов в Интернете довольно много. Вот один из них: McAfee FileInsight v2.1 . Этот же редактор можно использовать для работы с исходными текстами программ. Однако мне больше нравится делать это с помощью следующего редактора:
  7. Текстовый редактор. Необходим для написания исходных текстов ваших программ. Могу порекомендовать бесплатный редактор PSPad , который поддерживает множество языков программирования, в том числе и язык Ассемблера.
Все представленные в этой книге программы (и примеры программ) проверены на работоспособность. И именно эти программы используются для реализации примеров программ, приведённых в данной книге.

И еще – исходный код, написанный, например для Emu8086, будет немного отличаться от кода, написанного, например, для TASM. Эти отличия будут оговорены.

Большая часть программ, приведённых в книге, написана для . Во-первых, потому что этот ассемблер наиболее популярен и до сих пор поддерживается. Во-вторых, потому что он поставляется с MSDN и с пакетом программ Visual Studio от Microsoft. Ну и в третьих, потому что я являюсь счастливым обладателем лицензионной копии MASM.

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

Ассемблер

Ассемблер ― язык программирования низкого уровня. Язык получил свое название от слова assembler - сборщик. Возник еще в 50-е гг. как символический аналог машинного языка.
Команды Ассемблера один в один соответствуют командам процессора и фактически, представляют собой удобную символьную форму записи команд и аргументов. Также, Ассемблер обеспечивает связывание частей программы и данныx через метки, выполняемое при ассемблировании (для каждой метки высчитывается адрес, после чего каждое вхождение метки заменяется на этот адрес).
Поскольку системы команд микропроцессоров различаются, каждый процессор имеет свой набор команд на языке ассемблера.
С помощью ассемблера можно написать такие программы, которые невозможно, или очень сложно написать на других языках програмирования. Например: генераторы ключей (keygen), системные мониторы, драйвера для оборудования или даже операционные системы.
Языки высокого уровня ("C","Pascal","Delphi" и т.д.) не обеспечивают надёжного контроля за потоками данных, адресами памяти или регистрами процессора, а также все они были разработаны под определённый вид операционной системы, ассемблер же может стать этим-же ассемблером, но работающим на неизвестной науке платформе, и делающий программы под эту-же платформу.
Программы на ассемблере, в отличие от программ, написанных на языках высокого уровня получаются в десятки раз меньше, а работают в десятки раз быстрее. Примером может послужить операционная система MenuetOS, которая написана на Flat Assembler и умещающаяся на одной дискете (1.44 Мб), причём в комплект входят прикладные программы, такие как: редактор ассемблерного кода с подсветкой, работа с файловой системой, 3d заставки, некоторое количество игр, просмоторщик картинок, компилятор Flat Assembler, терминал, CD плейер и многое другое. Преимущество состоит в том, что его можно быстро скачать с интернета (даже при маленькой скорости соединения).
На данный момент, большинство специалистов в области программного обеспечения ведут разработки на языках высокого уровня, таких как Паскаль или С, что проще при написании программ, но наиболее мощное и эффективное программное обеспечение полностью или частично написано на языке ассемблера.

Литература
1. Питер Абель - Ассемблер. Язык и программирование для IBM PC - М., 1999.

Ассемблер

Ассемблер (от англ. assembler - сборщик) - компилятор исходного текста программы, написанной на языке ассемблера, в программу на машинном языке.
Как и сам язык, ассемблеры, как правило, специфичны для конкретной архитектуры, операционной системы и варианта синтаксиса языка. Вместе с тем существуют мультиплатформенные или вовсе универсальные (точнее, ограниченно-универсальные, потому что на языке низкого уровня нельзя написать аппаратно-независимые программы) ассемблеры, которые могут работать на разных платформах и операционных системах. Среди последних можно также выделить группу кросс-ассемблеров, способных собирать машинный код и исполняемые модули (файлы) для других архитектур и ОС.
Ассемблирование может быть не первым и не последним этапом на пути получения исполнимого модуля программы. Так, многие компиляторы с языков программирования высокого уровня выдают результат в виде программы на языке ассемблера, которую в дальнейшем обрабатывает ассемблер. Также результатом ассемблирования может быть не исполнимый, а объектный модуль, содержащий разрозненные блоки машинного кода и данных программы, из которого (или из нескольких объектных модулей) в дальнейшем с помощью редактора связей может быть получен исполнимый файл.
Специальные ячейки памяти, расположенные непосредственно в процессоре. Работа с регистрами выполняется намного быстрее, чем с ячейками оперативной памяти, поэтому регистры активно используются как в программах на языке ассемблера, так и компиляторами языков высокого уровня.
Названия регистров происходят от их назначения:

EAX/AX/AH/AL (accumulator register) - аккумулятор;
EBX/BX/BH/BL (base register) -регистр базы;
ECX/CX/CH/CL (counter register) - счётчик;
EDX/DX/DH/DL (data register) - регистр данных;
ESI/SI (source index register) - индекс источника;
EDI/DI (destination index register) - индекс приёмника (получателя);
ESP/SP (stack pointer register) - регистр указателя стека;
EBP/BP (base pointer register) - регистр указателя базы кадра стека.

Команды обработки строк
Для работы со строками, или цепочками символов или чисел (т.е. попросту говоря, с массивами произвольных данных) в МП предусмотрен ряд специальных команд:
movs - пересылка строки;
cmps - сравнение двух строк;
seas - поиск в строке заданного элемента;
lods - загрузка аккумулятора (регистров AL или АХ) из строки;
stos - запись элемента строки из аккумулятора (регистров АХ или AL).

Достоинства

· Язык ассемблера позволяет писать самый быстрый и компактный код, какой вообще возможен для данного процессора.
· Скорость работы - за счёт оптимизации вычислительного алгоритма и/или более рационального обращения к оперативной памяти (например, если все исходные данные хранятся в регистрах процессора, то можно исключить излишние обращения к ОП), перераспределения данных, табличного вычисления функций;
· Объём кода (в том числе за счёт эффективного использования промежуточных результатов). Сокращение объёма кода также нередко повышает скорость выполнения программы.
· Обеспечение максимального использования специфических возможностей конкретной платформы, что также позволяет создавать более эффективные программы, в том числе менее ресурсоёмкие.
· При программировании на языке ассемблера возможен непосредственный доступ к аппаратуре, и, в частности, портам ввода-вывода, регистрам процессора и др. Во многих операционных системах прямое обращение из прикладных программ для записи в регистры периферийного оборудования блокировано для надёжности работы системы и исключения "зависаний".
· Язык ассемблера часто применяется для создания драйверов оборудования и ядра операционной системы, когда важно временное согласование работы периферийных устройств с центральным процессором.
· Язык ассемблера используется для создания "прошивок" BIOS.
· С помощью языка ассемблера часто создаются машиннозависимые подпрограммы компиляторов и интерпретаторы языков высокого уровня, а также реализуется совместимость платформ.
· С помощью программы дизассемблера можно понять алгоритмы работы исследуемой программы при отсутствии листинга на высокоуровневом языке, изучая только машинные коды, но в сложных нетривиальных программах это очень и очень трудоёмко.

Недостатки
· В силу машинной ориентации ("низкого" уровня) языка ассемблера человеку сложнее читать и понимать программу на нём по сравнению с языками программирования высокого уровня; программа состоит из слишком "мелких" элементов - машинных команд, соответственно, усложняются программирование и отладка, растут трудоёмкость и вероятность внесения ошибок.
· Требуется повышенная квалификация программиста для получения качественного кода: код, написанный средним программистом на языке ассемблера, обыкновенно оказывается не лучше или даже хуже кода, порождаемого оптимизирующим компилятором для сравнимых программ, написанных на языке высокого уровня.
· Программа на языке высокого уровня может быть перекомпилирована с автоматической оптимизацией под особенности новой целевой платформы, программа же на языке ассемблера на новой платформе может потерять своё преимущество в скорости без ручного переписывания кода.
· Как правило, меньшее количество доступных библиотек по сравнению с современными индустриальными языками программирования.
· Отсутствует переносимость программ на компьютеры с другой архитектурой и системой команд.

Совместимость
Программа, предназначенная для одного типа ассемблеров, не может быть откомпилирована на другом без радикальной переделки или автоматической конвертации! Но даже среди ассемблеров "своего" типа наблюдается разброд, разнобой и множество различий: в ключевых словах, в правилах оформления листинга, в поставляемых библиотеках и заголовочных файлов и т. д. Если только совместимость не заявлена явно, транслировать программу нужно тем и только тем ассемблером для которого она предназначена. В противном случае - готовьтесь к переделкам (то есть, к адоптации). Отличия зачастую проявляются в самых неожиданных местах. Некоторые ассемблеры понимают, что "mov eax, x" это тоже самое, что и "mov eax,[x]", некоторые - нет. Они спотыкаются и выдают ошибку. Но еще ничего! Гораздо хуже, когда транслятор молчаливо трактует эту конструкцию как "mov eax, offset x", что совсем не одно и тоже! Так что при переносе программы приходится быть очень и очень осторожным.

Совместимость операционных систем. Программы, ориентированные на MS-DOS, без не только не транспортабельны, но и непереносимы. Для них характерно прямое взаимодействие с оборудованием, доступное в NT только с ядерного уровня, не говоря уже о том, что 16-разрядный код вызывается из 32-разрядных приложений только через DPMI, да и то не без ухищрений.

Таким образом, прежде чем транслировать ассемблерную программу, необходимо отождествить для какого транслятора и операционной системы она предназначена! С ассемблерными фрагментами, выхваченными из "родного" контекста, приходится еще хуже. Допустим, в некоторой статье описывается интересный антиотладочный прием и приводится ассемблерный код, но как встроить его в свою программу - не говорится. Знакомая ситуация, не правда ли? Непосредственная трансляция невозможна - транслятор дико материться, но ничего не говорит.

Ассемблирование программы

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

Asm --> .obj --> .exe/.dll/.com

На первой стадии (.asm --> .obj) из ассемблерного файла путем компиляции получаются файлы промежуточного объектного кода, имеющего расширение.obj (при этом могут использоваться дополнительные inc-файлы). Файл с расширением.obj содержит оптимизированный машинный код при условии, что не встретились синтаксические и семантические ошибки. Если в исходном файле с программой на языке ассемблера обнаруживаются ошибки, то программисту выдается список обнаруженных ошибок, в котором ошибки указываются с номером строки, в которой они обнаружены. Программист циклически выполняет действия по редактированию и компиляции до тех пор, пока не будут устранены все ошибки в исходном файле. На этом этапе уже возможно получение готовой программы, но чаще всего в ней не хватает некоторых компонентов. Если компилятор по какой-либо причине (неверно прописан путь к такому файлу или файл отсутствует) не может найти inc-файл, то выдается предупреждение и obj-файл получен не будет.

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

В результате ассемблирования получается так называемый "объектный файл". В качестве дополнительной возможности ассемблер может создать файл листинга программы.

Обычно для получения файлов объектного кода необходимо выполнить соответствующую программу ассемблера (программы ML.EXE фирмы Microsoft и TASM.EXE фирмы Borland), указав в командной строке имя файла с текстом программы.

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

Компоновка программы

Следующая стадия (.obj --> .exe/.dll/.com) называется линковкой или компоновкой и служит для замещения символьных имен, используемых программистом, на реальные адреса.

Сравните шестнадцатеричное содержимое OBJ и EXE файла, который у вас получился. В EXE-файле присутствует та же последовательность байтов, что и в OBJ-файле. Но помимо этого еще присутствует: имя ассемблированного файла, версия ассемблера, "имя собственное" сегмента и так далее.

Это "служебная" информация, предназначенная для тех случаев, когда ваш исполнимый файл вы хотите собрать из нескольких. При разработке больших приложений исходный текст состоит, как правило, из нескольких модулей (файлов с исходными текстами), потому что хранить все тексты в одном файле неудобно - в них сложно ориентироваться.

Каждый модуль по раздельности компилируется в отдельный файл с объектным кодом. В каждом из этих файлов прописаны свои сегменты кода/данных/стека, которые затем надо объединить в одно целое. А исполнимый файл нам нужно получить только один - с единым сегментом кода/данных/стека. Именно это LINK и делает: завершает определение адресных ссылок и объединяет, если это требуется, несколько программных модулей в один. И этот один у нас и является исполнимым.

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

Процесс объединения объектных модулей в один файл осуществляется специальной программой-компоновщиком или сборщиком (программа LINK.EXE фирмы Microsoft и TLINK.EXE фирмы Borland), которая выполняет связывание объектных модулей и машинного кода стандартных функций, находя их в библиотеках, и формирует на выходе работоспособное приложение - исполнимый код для конкретной платформы.

Исполнимый код - это законченная программа с расширением COM, DLL или EXE, которую можно запустить на компьютере с установленной операционной системой, для которой эта программа создавалась. Имя исполняемого файла задастся именем первого.OBJ файла. Для линковки нужно в командной строке набрать:

link prog1.obj prog2.obj или tlink prog1.obj prog2.obj

Содержимое объектного файла анализируется компоновщиком. Он определяет, есть ли в программе внешние ссылки, то есть содержит ли программа команды вызовов процедур, находящихся в одной из библиотек объектных модулей (link library). Компоновщик находит эти ссылки в объектном файле, копирует необходимые процедуры из библиотек, объединяет их вместе с объектным файлом и создает исполняемый файл (executable file). В качестве дополнительных возможностей компоновщик может создать файл перекрестных ссылок, содержащих план полученного исполняемого файла.

Используемые источники
1. https://ru.wikipedia.org/
2. http://natalia.appmat.ru/
3. http://www.codenet.ru/
4. http://wasm.ru/
5. Нортон П., Соухэ Д. Язык ассемблера для IBM PC. М.: Компьютер, 1992.

Язык программирования

Assembler - язык программирования низкого уровня, представляющий собой формат записи машинных команд, удобный для восприятия человеком.

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

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

Каждая модель процессора, в принципе, имеет свой набор команд и соответствующий ему язык (или диалект) ассемблера.

Достоинства и недостатки

  • минимальное количество избыточного кода (использование меньшего количества команд и обращений в память). Как следствие - большая скорость и меньший размер программы
  • большие объемы кода, большое число дополнительных мелких задач
  • плохая читабельность кода, трудность поддержки (отладка, добавление возможностей)
  • трудность реализации парадигм программирования и любых других сколько-нибудь сложных конвенций, сложность совместной разработки
  • меньшее количество доступных библиотек, их малая совместимость
  • непосредственный доступ к аппаратуре: портам ввода-вывода, особым регистрам процессора
  • возможность написания самомодифицирующегося кода (т.е. метапрограммирования, причем без необходимости программного интерпретатора)
  • максимальная «подгонка» для нужной платформы (использование специальных инструкций, технических особенностей «железа»)
  • непереносимость на другие платформы (кроме двоично совместимых).

Синтаксис

Общепринятого стандарта для синтаксиса языков ассемблера не существует. Однако, существуют стандарты де-факто - традиционные подходы, которых придерживаются большинство разработчиков языков ассемблера. Основными такими стандартами являются Intel-синтаксис и AT&T-синтаксис.

Общий формат записи инструкций одинаков для обоих стандартов:

`[метка:] опкод [операнды] [;комментарий]`

Опкод - непосредственно мнемоника инструкции процессору. К ней могут быть добавлены префиксы (повторения, изменения типа адресации и пр.). В качестве операндов могут выступать константы, названия регистров, адреса в оперативной памяти и пр.. Различия между стандартами Intel и AT&T касаются, в основном, порядка перечисления операндов и их синтаксиса при различных методах адресации.

Используемые мнемоники обычно одинаковы для всех процессоров одной архитектуры или семейства архитектур (среди широко известных — мнемоники процессоров и контроллеров Motorola, ARM, x86). Они описываются в спецификации процессоров.

Например, процессор Zilog Z80 наследовал систему команд Intel i8080, расширил ее и поменял мнемоники (и обозначения регистров) на свой лад. Например, сменил интеловские mov на ld . Процессоры Motorola Fireball наследовали систему команд Z80, несколько её урезав. Вместе с тем, Motorola официально вернулась к мнемоникам Intel. и в данный момент половина ассемблеров для Fireball работает с интеловскими мнемониками, а половина с мнемониками Zilog.

Директивы

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

  • определение данных (констант и переменных)
  • управление организацией программы в памяти и параметрами выходного файла
  • задание режима работы компилятора
  • всевозможные абстракции (т.е. элементы языков высокого уровня) - от оформления процедур и функций (для упрощения реализации парадигмы процедурного программирования) до условных конструкций и циклов (для парадигмы структурного программирования)
  • макросы

Происхождение и критика термина «язык ассемблера»

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

Язык ассемблера в русском языке часто называют «ассемблером» (а что-то связанное с ним - «ассемблерный»), что, согласно английскому переводу слова, неправильно, но вписывается в правила русского языка. Однако, сам ассемблер (программу) тоже называют просто «ассемблером», а не «компилятором языка ассемблера» и т. п.

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

Элементы синтаксиса:

Примеры:

Hello, World!:

Пример для версий Intel x86 (IA32)

mov ax , cs mov ds , ax mov ah , 9 mov dx , offset Hello int 21h xor ax , ax int 21h Hello : db "Hello World !", 13, 10, "$"

Hello, World!:

Пример для версий Amiga

move . l #DOS move . l 4. w , a6 jsr - $0198(a6 ) ; OldOpenLibrary move . l d0 , a6 beq . s . Out move . l #HelloWorld , d1 A ) moveq #13, d2 jsr - $03AE (a6 ) ; WriteChars B ) jsr - $03B4 ; PutStr move . l a6 , a1 move . l 4. w , a6 jsr - $019E (a6 ) ; CloseLibrary . Out rts DOS dc . b "dos.library" , 0 HelloWorld dc . b "Hello World!" , $A , 0

Hello, World!:

Пример для версий AtariST

move . l #helloworld , - (A7 ) move #9, - (A7 ) trap #1 addq . l #6, A7 move #0, - (A7 ) trap #1 helloworld : dc . b "Hello World !", $0d , $0a , 0

Hello, World!:

Пример для версий Intel x86 (IA32)

NASM Linux , используется Intel синтаксис. Компиляция и линковка:

  • nasm –f elf –o hello.o hello.asm
  • ld -o hello hello.o

SECTION . data msg db "Hello , world !", 0xa len equ $ - msg SECTION . text global _start _start : ; Точка входа в программу mov eax , 4 ; "write" системный вызов mov ebx , 1 mov ecx , msg ; Указатель на данные mov edx , len ; Количество данных int 0x80 ; Вызов ядра mov eax , 1 ; "_exit" системный вызов mov ebx , 0 ; Возвращаем 0 (все хорошо) int 0x80 ; Вызов ядра

Hello, World!:

Пример для версий PDP-8

/ — комментарии.

/ Hello World на ассемблере для DEC PDP - 8 * 200 hello , cla cll tls / tls устанавливает флаг печати. tad charac / создает индексный регистр dca ir1 / для получения символов tad m6 / настроить счетчик для dca count / ввода символов. next , tad i ir1 / получить символ. jms type / его тип. isz count / сделать что нибудь еще? jmp next / нет, ввести другой символ hlt type , 0 / подпрограмма type tsf jmp . - 1 tls cla jmp i type charac , . / используется в качестве начального значения ir1 . 310 / H 305 / E 314 / L 314 / L 317 / O 254 / , 240 / 327 / W 317 / O 322 / R 314 / L 304 / D 241 / ! m6 , - 15 count , 0 ir1 = 10 $

Hello, World!:

Пример для версий PDP-11

Программа написана на макроассемблере MACRO-11 Для компиляции и запуска этой программы в ОС RT-11 командуем:

MACRO HELLO

ERRORS DETECTED: 0

LINK HELLO -- Линкуем. RUN HELLO -- Запускаем

TITLE HELLO WORLD ; Название . MCALL . TTYOUT ,. EXIT HELLO :: MOV #MSG , R1 ; Начальный адрес строки 1$: MOVB (R1 ) + , R0 ; Получаем следующий символ BEQ DONE ; Если ноль, выходим из цикла . TTYOUT ; Иначе печатаем символ BR 1$ ; Повтор цикла DONE : . EXIT MSG : . ASCIZ / Hello , world !/ ; Строка Hello , world ! . END HELLO ; Конец программы HELLO

Hello, World!:

Пример для версий System/360 , System/370

IBM System/360/370/390 Basic Assembler Language .

// EXEC ASSEMBLY START MAIN BALR 2 , 0 USING * , 2 OPEN PRINT MVC BUF , HW PUT PRINT CLOSE PRINT EOJ HW DC CL132 " HELLO WORLD " BUF DS CL132 PRINT DTFPR IOAREA1 = BUF , DEVADDR = SYSLST , BLKSIZE = 132 , * DEVICE = 3203 , CONTROL = YES , PRINTOV = YES END MAIN /* // EXEC LNKEDT // EXEC /* /&

Hello, World!:

Пример для версий Apple II

* HELLO WORLD FOR 6502 APPLE ][ * ******************************** STROUT EQU $DB3A LDY #> HELLO LDA #< HELLO JMP STROUT HELLO ASC "HELLO WORLD !", 00

Hello, World!:

Пример для версий PDP-10

CHTTYO — весь ввод/вывод осуществляется с помощью каналов ввода/вывода. Лучше всего сделать символические имена для тех каналов, которые вы используете, и начинать их с CH. Определите эти имена с помощью MIDAS оператора == .

CALL — это символическое обозначение для вызова системного вызова. Его формат: .CALL .

OPEN открывает канал ввода/вывода для использования. Требует два параметра — номер канала и имя устройства в SIXBIT.

LOSE %LSFIL — системный вызов, который печатает сообщение об ошибке ввода/вывода, если вдруг она произошла.

IOT — системный вызов, который фактически занимается вводом/выводом. В качестве параметра нужно указать канал и адрес, содержащий код символа для вывода. Например, “H представляет H .

TITLE PRINTHELLO A = 1 CHTTYO == 1 ; Канал для вывода. START : ; Открытие TTY канала. . CALL [ SETZ ? SIXBIT / OPEN / [. UAO , CHTTYO ] ? [ SIXBIT / TTY / ] ((SETZ ))] . LOSE %LSFIL . IOT CHTTYO ,[ "H ] ; Печать HELLO WORLD посимвольно. . IOT CHTTYO ,[ "E ] . IOT CHTTYO ,[ "L ] . IOT CHTTYO ,[ "L ] . IOT CHTTYO ,[ "O ] . IOT CHTTYO ,[ ^M ] ; Символ новой строки . IOT CHTTYO ,[ "W ] . IOT CHTTYO ,[ "O ] . IOT CHTTYO ,[ "R ] . IOT CHTTYO ,[ "L ] . IOT CHTTYO ,[ "D ] . VALUE ; Программка, остановись :) END START

Числа Фибоначчи:

Пример для версий MIPS32

Эмулятор MARS. Вывод консоли MARS:

The Fibonacci numbers are: 1 1 2 3 5 8 13 21 34 55 89 144 -- program is finished running --

Программа выводит 15 чисел Фибоначчи. Количество чисел можно изменить в секции.data.

Data space: .asciiz " " head : .asciiz "The Fibonacci numbers are:\n" fib: .word 0 : 15 size : .word 15 .text main: la $t0 , fib la $t5 , size lw $t5 , 0 ($t5 ) li $t2 , 1 add.d $f0 , $f2 , $f4 sw $t2 , 0 ($t0 ) sw $t2 , 4 ($t0 ) addi $t1 , $t5 , - 2 loop : lw $t3 , 0 ($t0 ) lw $t4 , 4 ($t0 ) add $t2 , $t3 , $t4 sw $t2 , 8 ($t0 ) addi $t0 , $t0 , 4 addi $t1 , $t1 , - 1 bgtz $t1 , loop la $a0 , fib move $a1 , $t5 jal print li $v0 , 10 syscall print : add $t0 , $zero , $a0 add $t1 , $zero , $a1 la $a0 , head li $v0 , 4 syscall out : lw $a0 , 0 ($t0 ) li $v0 , 1 syscall la $a0 , space li $v0 , 4 syscall addi li $v0 , 1 la $a0 , ($t2 ) syscall la $a0 , string1 li $v0 , 4 syscall mult $t1 , $t2 mflo $t1 li $v0 , 1 la $a0 , ($t1 ) syscall la $a0 , string2 li $v0 , 4 syscall addiu $t2 , $t2 , 1 beq $t2 , 16 , endloop j loop endloop: li $v0 , 10 syscall



В статье будут рассмотрены основы языка ассемблер применительно к архитектуре win32. Он представляет собой символическую запись машинных кодов. В любой электронно-вычислительной машине самым низким уровнем является аппаратный. Здесь управление процессами происходит командами или инструкциями на машинном языке. Именно в этой области ассемблеру предназначено работать.

Программирование на ассемблер

Написание программы на ассемблере - крайне трудный и затратный процесс. Чтобы создать эффективный алгоритм, необходимо глубокое понимание работы ЭВМ, знание деталей команд, а также повышенное внимание и аккуратность. Эффективность - это критический параметр для программирования на ассемблер.

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

Регистры

Регистрами в языке ассемблер называют ячейки памяти, расположенные непосредственно на кристалле с АЛУ (процессор). Особенностью этого типа памяти является скорость обращения к ней, которая значительно быстрее оперативной памяти ЭВМ. Она также называется сверхбыстрой оперативной памятью (СОЗУ или SRAM).

Существуют следующие виды регистров:

  1. Регистры общего назначения (РОН).
  2. Флаги.
  3. Указатель команд.
  4. Регистры сегментов.

Есть 8 регистров общего назначения, каждый размером в 32 бита.

Доступ к регистрам EAX, ECX, EDX, EBX может осуществляться в 32-битовом режиме, 16-битовом - AX, BX, CX, DX, а также 8-битовом - AH и AL, BH и BL и т. д.

Буква "E" в названиях регистров означает Extended (расширенный). Сами имена же связаны с их названиями на английском:

  • Accumulator register (AX) - для арифметических операций.
  • Counter register (CX) - для сдвигов и циклов.
  • Data register (DX) - для арифметических операций и операций ввода/вывода.
  • Base register (BX) - для указателя на данные.
  • Stack Pointer register (SP) - для указателя вершины стека.
  • Stack Base Pointer register (BP) - для индикатора основания стека.
  • Source Index register (SI) - для указателя отправителя (источника).
  • Destination Index register (DI) - для получателя.

Специализация РОН языка ассемблер является условной. Их можно использовать в любых операциях. Однако некоторые команды способны применять только определенные регистры. Например, команды цикла используют ESX для хранения значения счетчика.

Регистр флагов. Под этим подразумевается байт, который может принимать значения 0 и 1. Совокупность всех флагов (их порядка 30) показывают состояние процессора. Примеры флагов: Carry Flag (CF) - Флаг переноса, Overflow Flag (OF) - переполнения, Nested Flag (NT) - флаг вложенности задач и многие другие. Флаги делятся на 3 группы: состояние, управление и системные.


Указатель команд (EIP - Instruction Pointer). Данный регистр содержит адрес инструкции, которая должна быть выполнена следующей, если нет иных условий.

Регистры сегментов (CS, DS, SS, ES, FS, GS). Их наличие в ассемблере продиктовано особым управлением оперативной памятью, чтобы увеличить ее использование в программах. Благодаря им можно было управлять памятью размером до 4 Гб. В архитектуре Win32 необходимость в сегментах отпала, но названия регистров сохранились и используются по-другому.

Стек

Это область памяти, выделенная для работы процедур. Особенность стека заключается в том, что последние данные, записанные в него, доступны для чтения первыми. Или иными словами: первые записи стека извлекаются последними. Представить этот процесс себе можно в качестве башни из шашек. Чтобы достать шашку (нижнюю шашку в основание башни или любую в середине) нужно сначала снять все, которые лежат сверху. И, соответственно, последняя положенная на башню шашка, при разборе башни снимается первой. Такой принцип организации памяти и работы с ней продиктован ее экономией. Стек постоянно очищается и в каждый момент времени одна процедура использует его.


Идентификаторы, целые числа, символы, комментарии, эквивалентность

Идентификатор в языке программирования ассемблер имеет такой же смысл, как и в любом другом. Допускается использование латинских букв, цифр и символов "_", ".", "?", "@", "$". При этом прописные и строчные буквы эквивалентны, а точка может быть только первым символом идентификатора.

Целые числа в ассемблере можно указывать в системах отсчета с основаниями 2, 8, 10 и 16. Любая другая запись чисел будет рассматриваться компилятором ассемблера в качестве идентификатора.

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

  • в строке, заключенной в апострофы, кавычки указываются один раз, апостроф - дважды: "can""t", " he said "to be or not to be" ";
  • для строки, заключенной в кавычки, правило обратное: дублируются кавычки, апострофы указываются как есть: "couldn"t", " My favourite bar is ""Black Cat"" ".

Для указания комментирования в языке ассемблер используется символ точка с запятой - ";". Допустимо использовать комментарии как в начале строк, так и после команды. Заканчивается комментарий переводом строки.

Директива эквивалентности используется схожим образом тому, как в других языках указывают константные выражения. Эквивалентность указывается следующим способом:

Таким образом в программе все вхождения будут заменяться на, на месте которого допустимо указывать целое число, адрес, строку или другое имя. Директива EQU похожа по своей работе на #define в языке С++.

Директивы данных

Языки высокого уровня (C++, Pascal) являются типизированными. То есть, в них используются данные, имеющие определенный тип, имеются функции их обработки и т. д. В языке программирования ассемблер подобного нет. Существует всего 5 директив для определения данных:

  1. DB - Byte: выделить 1 байт под переменную.
  2. DW - Word: выделить 2 байта.
  3. DD - Double word: выделить 4 байта.
  4. DQ - Quad word: выделить 8 байтов.
  5. DT - Ten bytes: выделить 10 байтов под переменную.

Буква D означает Define.

Любая директива может быть использована для объявления любых данных и массивов. Однако для строк рекомендуется использовать DB.

Синтаксис:

В качестве операнда допустимо использовать числа, символы и знак вопрос - "?", обозначающий переменную без инициализации. Рассмотрим примеры:

Real1 DD 12.34 char db "c" ar2 db "123456",0 ; массив из 7 байт num1 db 11001001b ; двоичное число num2 dw 7777o ; восьмеричное число num3 dd -890d ; десятичное число num4 dd 0beah ; шестнадцатеричное число var1 dd ? ; переменная без начального значения ar3 dd 50 dup (0) ; массив из 50 инициализированных эл-тов ar4 dq 5 dup (0, 1, 1.25) ; массив из 15 эл-тов, инициализированный повторами 0, 1 и 1.25

Команды (инструкции)

Синтаксис команд ассемблера или инструкций ассемблера выглядит следующим образом.

: