Ассемблер с нуля

Дневники чайника. Чтива 0, виток0

— Так кто вы всё-таки будете?
— Асм есть Царь!
(Из кинофильма «Иван Васильевич меняет профессию»)

Благодарность

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

Также уроков могло не быть без Плохиша (Bad_guy, извини, что так назвал :). Он посадил зерно crackl@b’a на просторы инета и ухаживал за ним все эти годы, пока проект превращался в дерево знаний. Спасибо zer0 за управление разделом статей.

Спасибо всем участникам нашего форума и «wasm.ru/forum» за помощь и науку, особенно: Leo, S_T_A_S_,Staier, The Svin.

Ну и, конечно, отдельное спасибо Седому (SeDoYHg или SeDoY) за огромную помощь в написании Чтивы 0 и за критику первых статей. Я даже могу сказать, что почти все главы здесь под редакцией Седого.

Да, чуть не забыл, без моей мамы текст был бы полон «обшибак и слеганца бесграматен» :).

А без содействия папы вообще бы не стал заниматься Ассемблером (в бизнес бы ударился, стал бы авторитетом, шлёпнули бы где-нибудь у входа в казино — и контрольный выстрел… А так максимум, что светит, — это потёртые данные на винте и радикулит :).

Короче говоря, всем, кто помог, — спасибо.

Пустословие

Как был предусмотрителен Джордж Лукас, когда снял 4-й эпизод «Звёздных Войн». Я понятия не имел, что возникнет потребность написать предчасть. А вот пришлось. После того, как я написал «Чтиву III», прошло 4 месяца.

Дело в том, что первая часть начинается примерно c такой фразы: «Прочтите Рассылку Калашникова и возвращайтесь читать Дневники чайника». Сам дочитал эту рассылку только до десятого урока, дальше идёт морально устаревшая информация.

Надеюсь, что большинство из тех, кто созрел для Асма, поймёт мой рассказ (от 9 до 110 лет :). Если не поймёте, не отчаивайтесь, есть другие дороги. Давно существуют подобные курсы элементарного ликбеза, например:

  • Уже упомянутая рассылка Олега Калашникова «Ассемблер? Это просто!» (устарела, зато сразу практика). Кстати, эта же рассылка на всякий случай лежит и здесь, на Краклабе.
  • «Низкоуровневое программирование для дZенствующих». Сейчас считаю, что это хорошая дорога для начинающих, но когда сам ничего не знал, эти статьи мне не понравились. Решайте сами, подойдут ли они вам сразу. На том же сайте вы найдёте море материала по теме. Искренне благодарен всем, кто трудится над этим ресурсом.
  • Советую в первую очередь обратить внимание на статьи Кибер Маньяка (CyberManiac) из серии «Теоретические основы крэкинга» в разделе статей здесь на Краклабе или на Wasm’e в этом разделе.

В любом случае советую прочесть все известные уроки. В каждом источнике автор по-своему раскладывает тему. Есть много мнений о том, какие аспекты самые важные, и каждая точка зрения для новичка — золото. Остальные интересные ссылки я уже поместил в следующих статьях, так что если вы пожелаете сначала завалиться литературой, а потом разгребать её, можете смело смотреть Чтиву 1,2,3.

Для кого пишу

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

Совсм недавно не было никакого Битфрая, я вообще был далёк от программирования. Конечно, проводил много времени за компом и стал толковым юзверем, но я не знаю математики, даже на уровне школы. Год назад я совсем не представлял, что такое написать программу.

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

Хотя вру, такую точку зрения поддерживают некоторые уважаемые люди. Но явной мысли «начинать надо с Асма» нигде так и не увидил.

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

Print «Здесь был Вася»

В Ассемблере нет оператора «PRINT» и нет даже его подобия. Этот язык может показаться вам странным (как мне другие), если вы привыкли к логике высокоуровневых языков.

В данной статье за главный объект изучения будет принят язык Ассемблер для Intel-совместимых процессоров.

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

Возможно, кто-то из вас сразу же предпочтёт прочитать большой учебник. Например:
В.И. Юров
«ASSEMBLER. 2-е издание. Учебник для вузов»
и учебник Зубкова в качестве интересных примеров для программирования (на форуме есть ссылки).

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

Но если вы любите обрастать знаниями по ходу экспериментов (как Bitfry), добро пожаловать в мир ассемблера через мою «калитку».

Метод обучения

«Чтива 0» имеет мало общего со своими предками (Чтивы I,II,III), хотя бы потому, что это не мой дневник. Скорее, «Чтива 0» будет Ваш дневник, Ваши ошибки и Ваши уроки ;).

Говорят, «умный учится, глупый учит», если к этой поговорке прибавить мой скромный багаж знаний — я совсем дурак :). Только что начал и уже хочу научить вас думать логикой ассемблера. Ребячество — скажут многие. Но если бы я не верил в успешность предприятия (при некотором усилии с вашей стороны), даже и не стал бы тратить время.

Вы, наверное, согласитесь, что все знания в этой жизни приходят витками. Старые догадки и поступки кажутся ошибочными после каждого такого витка (в чтивах I,II,III полно ошибок).

Человеку для первого, невооружённого, осмотра местности, лучше думать, что земля плоская (поверьте, так будет лучше). Затем он осваивает всё больше и больше, а в какой-то момент до него вдруг доходит: чтобы сложить карты и сопоставить с положением звёзд на небе, нужно представить невероятное — земля, оказывается, шар. Но и это не есть истина, на самом деле земля очень сложной формы, и чтобы описать её более-менее точно, нужно использовать все ресурсы науки и техники. Конца этому процессу не предвидится. То же самое можно сказать и о компьютере. Несмотря на то, что он всего лишь юное творение человека, мы умудрились запутать в нём столько всяких абстракций (которые ему, кстати, мешают), что Ассемблер можно уже воспринимать как насмешку над корнем этого слова.

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

Но вернёмся к виткам познаний. В Чтиве 0 мы с вами постараемся смоделировать два таких витка (пока мне так кажется, может быть, их будет больше).

Нулевой виток будет содержать много практики и некоторое количество утверждений.

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

Таким образом, обе части нулевой чтивы будут иметь одинаковые темы глав.

Вступление в суть День первый Системы счисления и устройство памяти День второй Регистры процессора День третий Практикация всего мозга День четвёртый О словах и двойных словах (форматы данных) День пятый Циклы, ветвления и регистр Флагов День шестой Знакомство с Win32-программированием День седьмой Стек День восьмой Структурирование программы День девятый

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

Статья получилась длинная и пёстрая, поэтому вам лучше сразу знать что как будет выглядеть. Кроме основного текста, вы здесь встретите:

Выделения, как обычно — суть из массы

— Сноски в конце главы

Код программ
Код исходников программ

Cравка о командах процессора

Ну и в этих серых блоках будет развлекуха, её читать совсем необязательно, поэтому с неё и начнём :).

Эй, малыш! Да, ты… Можешь раздобыть некоторый скарб для моего корабля?…

Инструменты, которые нам пригодятся

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

Перед отправлением в дальний поход необходимо как следует проверить укомплектованность нашего космического корабля.

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

Для начала посмотрите приложенные файлы: need.rar, prax0.rar, prax1.rar, общий размер ~500Kb. Там лежат примеры для проверки их работоспособности и кое-что ещё.

Hiew

Сайт программы, размер ~0,5Mb. Программа платная.

Версия должна быть для форточек не ниже 6.8 (я использую 7.01).

Если у вас нет этой программы, то в сети вы без проблем найдете её.

Heiw — это консольный шестнадцатиричный редактор с возможностью ассемблировать/дизассемблировать. Незаменимая для исследователей и ассемблерщиков вещь.

FAR manager

Сайт программы, размер ~3Mb. Программа бесплатная для русскоязычных пользователей.

Подойдёт и новая x64-версия 2.0 и 32-битная. Короче – любая. Порекомендовал бы использовать именно FAR, так как он тоже консольный. Сам я пользуюсь двумя файловыми менеджерами: Total Commander и Far. По опыту могу сказать, что Far можно настроить по сочетанию клавиш один в один с TC, было бы желание. Внешний вид настраивается до мелочей, просто на это надо потратить некоторое время. Far будет приятным и удобным если вы этого захотите, поверьте. Меня, например, дико раздражают мелкие шрифты и кислотные краски стандартной консоли (что Hiew, что Far, что любая другая цветная консольная программа), однако, всегда можно создать ярлычок в котором будут настройки шрифтов и палитра приятная для глаза. Ярлык для Far’a с моими любимыми цветами я прикрепил в файл need.rar. Кроме того можно настроить цветовую схему. Hiew и Far имеют богатые возможности в этом плане. Пробуйте. Однако если вам совсем не нравятся консоли, можете использовать что-то типа TC или обычный проводник.

CodeView (CV)

Сайт программы: microsoft.com. В принципе программа доступна для бесплатного скачивания где-то в дебрях Майкрософта, однако она является лишь придатком к довольно большому ненужному пакету, который входит в дополнение (не помню к чему). Отыскать её там будет непросто. Я выложил эту довольно старую программу у себя (в том же архиве need.rar).

Ещё CV входит в старый MASM (v5x,v6x) который входит в VisualC++ (версии не знаю).

CodeView — программа-отладчик (по-ихнему debugger — исправлятель ошибок). Отладчики помогают программистам понять, что делает их программа. 🙂 Когда этот светлый миг наступает, становится понятно, где ошибка.

Немалую часть времени написания программы программист проводит в отладчике, поэтому выбор дебагера — очень больной вопрос. Я остановился на CodeView, потому что не смог подобрать другого отладчика для первых шести примеров. Однако слишком погружаться в CV не стоит, так как он устарел и в реальной практике вряд ли вам пригодится.

OllyDbg

Сайт программы, размер ~1Mb. Программой можно пользоваться бесплатно с разрешения автора.

На 07.12.2011 последняя версия Oлли — 2.01 alpha 4, но можно использовать и старую стабильную 1.10.

А вот этот отладчик на сегодняшний день самый актуальный на платформах вплоть до Win7 x64 на уровне 32-битных приложений. OllyDbg — самый многофункциональный отладчик прикладных программ Win32. Но как только появится хороший подходящий для нас отладчик x64, сразу возьмусь переписывать уроки под него.

MASM32 SDK

Сайт программы, размер ~4Mb. Программа бесплатная.

Проект Стива Хатчисона (Steve Hutchesson). MASM32 – это современный пакет языка Ассемблер, собранный на основе компилятора MicroSoft.

Существует ещё пакет MASM (Macro Assembler) — это древний DOS’овый пакет от самой MS. Нам он не нужен, так же как и NASM, TASM, TASM32 и т.д.

На сегодняшний день единственной разумной альтернативой MASM32 является FASM. Сам я использую и FASM, и MASM32, но тему FASM’a затрагивать пока не будем.

Что такое «пакет языка Ассемблер»?

В стандартный пакет языка программирования входят:

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

Всё это нам понадобится не сразу, а постепенно, по мере необходимости. Поэтому не бросайтесь сейчас же изучать и осваивать все вышеперечисленные приборы. Однако Hiew и CodeView нужны будут сразу же после вылета с базовой станции.

На Windows версии x64 (7/Vista/XP или Server) в первые дни вам понадобится какой-нибудь эмулятор DOS-режима для запуска com-программ. Можно использовать громоздкий Virtual PC от MS или VMWare, но я предлагаю (спасибо Григорию за подсказку) маленький удобный эмулятор:

DOSbox

Сайт программы, размер ~1,5Mb. Программа бесплатная.

Без этой программы можно обойтись на 32-битной WinXP. На Висте и Семёрке x86 лично не проверял, но говорят, можно обойтись режимом совместимости (пробуйте и отпишитесь в гостевой по результатам).

Не смущайтесь, что версия называется «Win32 installer», она поможет и на системе x86, и на x64 эмулировать режим старой-доброй DOS для наших первых примеров. DOSbox устанавливается за пару секунд, и его очень легко настроить. Нужно всего лишь смонтировать папку с com-примерами и туда же кинуть все файлы отладчика CV. Монтаж выполняется одной командой.

Например:

mount с d:\prax

где «d:\prax » – это папка на реальном диске D, в которой должны быть свалены воедино ваши com-примеры и файлы отладчика CV. А «c» – это уже виртуальный диск внутри dosbox’a.

Далее переходим на новый виртуальный диск командой

с:

Что потом – читайте уже в следующей главе. Можно, кстати, батничек сделать… Разумеется, надо знать основы языка команд DOS и DOSbox (на сайте программы есть русская документация). Сразу рекомендую главу специально для пользователей, впервые очутившихся в DOS-мире.

Инструменты, которые нам НЕ пригодятся.

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

Кажется, можно отправляться.

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

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

Bitfry

следующая глава>>

Вернуться на главную

Применение языка Ассемблера

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

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

Вторая область применения Ассемблера связана с оптимизацией выполнения программ. Очень часто программы-переводчики (компиляторы) с языков высокого уровня дают весьма неэффективную программу на машинном языке. Обычно это касается программ вычислительного характера, в которых большую часть времени выполняется очень небольшой (порядка 3-5%) участок программы (главный цикл). Для решения этой проблемы могут использоваться так называемые многоязыковые системы программирования, которые позволяют записывать части программы на различных языках. Обычно основная часть программы записывается на языке программирования высокого уровня (Фортране, Паскале, С и т.д.), а критические по времени выполнения участки программы – на Ассемблере. Скорость работы всей программы при этом может значительно увеличиться. Часто это единственный способ заставить программу дать результат за приемлемое время.

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

Достаточно полное описание этого языка приведено в учебнике [5], изучения этого учебника (или аналогичных учебников по языку Ассемблера [6-8]) является обязательным для хорошего понимания материала по нашему курсу. На лекциях мы подробно будем изучать только те особенности и тонкие свойства языка Ассемблера, которые недостаточно полно описаны в указанных учебниках.

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

Наши первые программы будут содержать всего один модуль, но позже будут рассмотрены и многомодульные программы.

Каждый модуль обычно содержит описание одного или нескольких сегментов памяти. Напомним, что в нашей архитектуре для работы программы каждая команда и каждое данное должны располагаться в каких-либо сегментах памяти. Как мы уже знаем, в младшей модели нашего семейства ЭВМ в каждый момент времени определены четыре активных (или текущих) сегмента памяти, на которые указывают соответствующие сегментные регистры CS, DS, SS и ES.

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

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

Стоит заметить, что сегменты могут перекрываться в памяти ЭВМ и даже полностью совпадать (накладываться друг на друга). Однако максимальный размер сегмента в младшей модели нашего семейства ЭВМ равен 64К, и, если сегменты будут перекрываться, то одновременно для работы будет доступно меньшее количество оперативной памяти. Заметим, что пересечение сегментов никак не влияет на логику работы центрального процессора.[11]

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

На текущий сегмент команд должен указывать регистр CS, а на сегмент данных – регистр DS. Дело в том, что эти регистры специализированные. В частности, устройство управления может выбирать команды для выполнения только из сегмента, на который указывает регистр CS. Производить арифметические операции можно над числами из любого сегмента, однако в соответствии с принципом умолчания все переменные, если прямо не указано противное, сегментируются по регистру DS. Явное указание необходимости выбирать аргументы команды по другому сегментному регистру увеличивает длину команды на один байт (перед такой командой вставляется специальная однобайтная команда, которая называется префиксом сегмента).

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

Описание каждого сегмента, в свою очередь, состоит из предложений (statement) языка Ассемблера. Каждое предложение языка Ассемблера занимает отдельную строчку программы, исключение из этого правила будет отмечено особо. Далее рассмотрим различные классы предложений Ассемблера.

Предыдущая18192021222324252627282930313233Следующая


Дата добавления: 2015-10-05; просмотров: 1070;


ПОСМОТРЕТЬ ЕЩЕ:

Урок 2. Переменные в ассемблере и работа с ними

  • Подробности
  • Категория: Уроки

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

Перемеренные 

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

Так вот объявление переменных осуществляется с помощью псевдокоманд. Переменная это по сути область памяти с которой мы работаем. Для того чтоб объявить ее используют директивы (псевдокоманды) DB, DW DD,DQ и DT . Вернее эти директивы просто говорят ассемблеру что нужно заполнить память указанным количеством байт, а также чем именно заполнить.

  • DD  — говорит что нужно выделить 1 байт.
  • DW — что два байта (define word — определить слово)
  • DD — определить двойное слово (четыре байта)
  • DQ -определить восемь байт или четыре слова
  • DT -определить десть байт

К примеру чтоб объявить перемененную на ассемблере в 1 байт которая будет равна 10:
имя_переменной DD 10

Все наши перемеренные должны быть облеплены в сегменте данных нашей программы. А также нужно явно определить сегментный регистр даты (DS) чтоб он указывал на область памяти где находятся наши переменные. С переменными можно работать как и с регистрами. К примеру чтоб занести значение в переменную можно воспользоваться командой MOV :

mov ax,100   ;
mov temp,ax ;теперь наша переменная равна 100(прошу обратить внимание что в данном случае переменная должна равняться два байта )

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

Теперь давайте рассмотрим ситуацию когда нам нужно объявить строку, для это нужно всего навсего написать такой код:

tempstr DB «hello world$»

Код выше что мы объявили строку  в 12 байт! Прошу Вас заметить что при работе со строками в DOS символ $ является концом строки.

Для вывода строк  используется  прерывание 21h и его 9я функция. То есть  регистр AH должен содержать номер функции а регистр DX должен хранить адрес переменной которую хотим вывести на экран. Для того чтобы поучить адрес переменно используется директива OFFSET. К примеру чтоб внести в DX адрес переменной tempstr нужно выполнить следующее:

MOV DX, OFFEST tempstr

Давайте теперь рассмотрим пример программы которая выводит строку на экран:

.model small .data ;начало сегмента даты tempstr DB «Hello World! $» .code ;начало сегмента кода main: ;начало нашей программы mov ax, @data ; настраивается сегментный регистр, вносим адрес сегмента даты в AX mov ds, ax ; а затем с АХ помещаем адрес в DS чтоб можно было работать с переменными которые в ;сегменте даты mov ah, 09 mov dx, offset tempstr ; вывод сообщения int 21h mov ax,4c00h ; выход int 21h end main


Как собрать и выполнить программы мы рассматривали в первом уроке по ассемблеру.

Ввод строки

Для ввода строк предусмотрено множество функций. Мы для примера возьмем все тоже прерывание DOS 21h в котором есть функция под номером 0ah. Данная функция принимает строку первый элемент которой число которое указывает за максимальное количество вводимых символов, а на выходе второй элемент будет указывать на количество введенных пользователем символов.

|5|0|0|0|0|0|0|0|$|  наша строка на начале ввода, и затем мы ввели HELLO

|5|5|H|E|L|L|O|#|$| такая строка у нас получается на выходе.

И это все нужно учитывать! Для вывода  нам нужно к адресу строки прибавить 2 чтоб мы вывели сумувведенную строку. Вот пример программы которая принимает строку а затем выводит ее на экран: 

.model small .data EnterS DB «Enter String:$» endl DB 10,13,’$’ buf db 20 dup(‘$’) .code main: mov ax, @data ; настраивается сегментный регистр mov ds, ax mov ah, 9 mov dx, offset EnterS int 21h mov ah, 0ah mov dx, offset buf int 21h mov ah, 9 mov dx, offset endl int 21h mov ah, 09 mov dx, offset buf add dx,2 int 21h mov ah, 9 mov dx, offset endl int 21h mov ax,4c00h ; выход int 21h end main

Результат работы программы:

В программе есть для вас новая директива DUP. К примеру если Вам нужно ввести 100 одинаковых символов или вам просто требуется выделить память для того чтоб ее потом использовать вот для этого и служит эта директива. В данном примере мы выделили 20 байт которые заполнили символом $ .

Эта переменная из 20 байт служила для того чтоб в нее вводилась строка. И обратите внимание когда мы выводим нашу введенную строку , сначала мы получаем адрес ее а потом прибавляем  2 с помощь команды AAD, про которую мы поговорим в следующем уроке, для того чтоб пропустить 2 первых элемента которые нужны для ее ввода.

 На этом второй урок из цикла уроки ассемблера окончен. Желаю успехов Вам!

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

Закрыть меню