Как создать объектный файл ассемблер

Обновлено: 06.07.2024

Программы на ассемблере могут быть разделены на три секции:

Секции ассемблера

Секция data используется для объявления инициализированных данных или констант. Данные в этой секции НЕ могут быть изменены во время выполнения программы. Вы можете хранить константные значения и названия файлов в этой секции. Синтаксис объявления:

Секция bss используется для объявления переменных. Синтаксис объявления:

Секция text используется для хранения кода программы. Данная секция должна начинаться с объявления global_start , которое сообщает ядру, откуда нужно начинать выполнение программы. Синтаксис объявления:

Комментарии

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

Так и на строке со стейтментом:

Стейтменты

В ассемблере есть три вида стейтментов:

Директивы ассемблера — сообщают программе об аспектах компиляции. Они не генерируют инструкции на машинном языке.

Макросы — являются простым механизмом вставки кода.

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

INC COUNT ; выполняем инкремент переменной памяти COUNT MOV TOTAL , 48 ; перемещаем значение 48 в переменную памяти TOTAL ADD AH , BH ; добавляем содержимое регистра BH к регистру AH AND MASK1 , 128 ; выполняем операцию AND с переменной MASK1 и 128

Первая программа

Следующая программа на языке ассемблера выведет строку Hello, world! на экран:

msg db 'Hello, world!' , 0xa ; содержимое строки для вывода

Результат выполнения программы:

Сборка программ

Убедитесь, что у вас установлен NASM. Запишите вашу программу в текстовом редакторе и сохраните её как hello.asm. Затем:

убедитесь, что вы находитесь в той же директории, в которой вы сохранили hello.asm;

чтобы собрать программу, введите команду nasm -f elf hello.asm ;

если не было ошибок, то создастся объектный файл вашей программы под названием hello.o;

чтобы ваш объектный файл прошел линкинг и создался исполняемый файл под названием hello, введите команду ld -m elf_i386 -s -o hello hello.o ;

запустите программу командой ./hello .

Если всё прошло успешно, то вам выведется Hello, world! .

Если у вас нет возможности скомпилировать программу, например, у вас нет Linux и вы пока не хотите на него переходить, то можете использовать одну из следующих онлайн-IDE:

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

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

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

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

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

1. Этап постановки и формулировки задачи:

§ изучение предметной области и сбор материала в проблемно-ориентированном контексте;

§ определение назначения программы, выработка требований к ней и представление требований, если возможно, в формализованном виде;

§ формулирование требований к представлению исходных данных и выходных результатов;

§ определение структур входных и выходных данных;

§ формирование ограничений и допущений на исходные и выходные данные.

2. Этап проектирования:

§ формирование «ассемблерной» модели задачи;

§ выбор метода реализации задачи;

§ разработка алгоритма реализации задачи;

§ разработка структуры программы в соответствии с выбранной моделью памяти.

3. Этап кодирования:

§ уточнение структуры входных и выходных данных и определение ассемблерного формата их представления;

§ комментирование текста программы и составление предварительного описания программы.

4. Этап отладки и тестирования:

§ составление тестов для проверки правильности работы программы;

§ обнаружение, локализация и устранение ошибок в программе, выявленных в тестах;

§ корректировка кода программы и ее описания.

5. Этап эксплуатации и сопровождения:

§ настройка программы на конкретные условия использования;

§ обучение пользователей работе с программой;

§ организация сбора сведений о сбоях в работе программы, ошибках в выходных данных, пожеланиях по улучшению интерфейса и удобства работы с программой;

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

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

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

Традиционно у существующих реализаций ассемблера нет интегрированной среды, подобной интегрированным средам Turbo Pascal, Turbo С или Visual C++. Поэтому для выполнения всех функций по вводу кода программы, ее трансляции, редактированию и отладке необходимо использовать отдельные служебные программы. Большая часть их входит в состав специализированных пакетов ассемблера.

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


Рис.4.1. Процесс разработки программы на ассемблере.

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

§ «Макроассемблер» MASM фирмы Microsoft.

§ Turbo Assembler TASM фирмы Borland.

У этих пакетов много общего. Пакет макроассемблера фирмы Microsoft (MASM) получил свое название потому, что он позволял программисту задавать макроопределения (или макросы), представляющие собой именованные группы команд. Они обладали тем свойством, что их можно было вставлять в программу в любом месте, указав только имя группы в месте вставки. Пакет Turbo Assembler (TASM) интересен тем, что имеет два режима работы. Один из этих режимов, называемый MASM, поддерживает все основные возможности макроассемблера MASM. Другой режим, называемый IDEAL, предоставляет более удобный синтаксис написания программ, более эффективное использование памяти при трансляции программы и другие новшества, приближающие компилятор ассемблера к компиляторам языков высокого уровня.

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

Создание объектного модуля (трансляция программы)

Итак, исходный текст программы на ассемблере подготовлен и записан на диск. Следующий шаг — трансляция программы. На этом шаге формируется объектный модуль, который включает в себя представление исходной программы в машинных кодах и некоторую другую информацию, необходимую для отладки и компоновки его с другими модулями. Для получения объектного модуля исходный файл необходимо подвергнуть трансляции при помощи программы tasm.exe из пакета TASM.

Формат командной строки для запуска tasm.exe следующий:

TASM [опции] имя_исходного_файла [,имя_объектного_файла]

На первый взгляд, все очень сложно. Не пугайтесь — если вы вдруг забыли формат командной строки и возможные значения параметров, то получить быструю справку на экране монитора можно, просто запустив tasm.exe без задания каких-либо аргументов. Обратите внимание, что большинство параметров заключено в квадратные скобки. Это общепринятое соглашение по обозначению параметров, которые могут отсутствовать. Таким образом, обязательным аргументом командной строки является лишь имя_исходного_файла. Этот файл должен находиться на диске и обязательно иметь расширение .asm. За именем исходного файла через запятую могут следовать необязательные аргументы, обозначающие имена объектного файла, файла листинга и файла перекрестных ссылок. Если не задать их, то соответствующие файлы попросту не будут созданы. Если же их нужно создать, то необходимо учитывать следующее:

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

В результате будут созданы файлы, как показано на рис. 4.1 для шага 2.

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

tasm.exe prg_3_1 , ,prg_list , ,

В результате на диске будут созданы файлы

§ Если требуется выборочное создание файлов, то вместо ненужных файлов необходимо подставить параметр nul. Например:

tasm.exe prg_3_1 , ,nul, ,

В результате на диске будут созданы файлы

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

Давайте немного поэкспериментируем с программой tasm.exe. Попутно выясним еще несколько важных моментов. Прежде всего проведем некоторые организационные мероприятия. После инсталляции пакета TASM в каталоге \TASM\BIN, где находится файл tasm.exe, можно увидеть большое количество файлов. Можно запустить программу tasm.exe прямо отсюда, но тогда созданные ею файлы объектного кода, листинга и перекрестных ссылок тоже окажутся в этом каталоге. Если вы пишете одну программу, то неудобство не столь заметно, но при работе с несколькими программами очень скоро этот каталог станет похож на свалку.

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

§ Создать в каталоге \TASM подкаталоги \TASM\WORK и \TASM\ PROGRAM. Каталог PROGRAM будем использовать для хранения отлаженных кодов программ и их исполняемых модулей (файлы с расширением .ехе). Каталог WORK будем использовать как рабочий; в нем будут находиться необходимые для получения исполняемого модуля файлы из пакета транслятора TASM и файл исходного модуля, с которым мы в данный момент работаем. После того как ошибки в исходном модуле устранены, он вместе со своим исполняемым модулем переписывается в каталог PROGRAM. Из каталога WORK удаляются все ненужные файлы — и он готов для работы со следующим исходным модулем на ассемблере. Таким образом, в каталоге WORK всегда находится рабочая версия программы, а в каталоге PROGRAM — отлаженная версия.

§ Поместить файл prg_3_1.asm в каталог WORK.

После всех этих действий можно начинать работу. Перейдем в каталог WORK и запустим на трансляцию программу prgJM.asm командной строкой вида

tasm.exe /zi prg_3_1 , , , ,

Листинг 4.1. Пример листинга асемблера




Строки в файле листинга имеют следующий формат:

<глубина_вложенности> <номер_строки> <смещение> <машинный_код> <исходный_код>

§ <глубина_вложенности> — уровень вложенности включаемых файлов или макрокоманд в файле;

§ <номер_строки> - номер строки в файле листинга. Эти номера используются для локализации ошибок и формирования таблицы перекрестных ссылок.

Помните, что эти номера могут не соответствовать номерам строк в исходном файле. В добавление к вышесказанному нужно отметить, что ассемблер имеет директиву INCLUDE, которая позволяет включить в данный файл строки другого файла. Нумерация при этом, как и в случае макрокоманд, будет последовательная для строк обоих файлов. Факт вложенности кода одного файла в другой фиксируется увеличением значения <глубина_ вложенности> на единицу. Это замечание касается и использования макрокоманд;

§ <смещение> — смещение в байтах текущей команды относительно начала сегмента кода. Это смещение называют также счетчиком адреса. Смещение вычисляет транслятор для адресации в сегменте кода;

§ <машинный_код> - машинное представление команды ассемблера, представленной далее в этой строке полем <исходный_код>;

§ <исходный_код> — строка кода из исходного файла.

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

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

§ команды ассемблера — конструкции, которым соответствуют машинные команды;

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

§ макрокоманды — конструкции, которые, будучи представлены одной строкой в исходном файле программы, после обработки транслятором генерируют в объектном модуле последовательность команд, директив или макрокоманд ассемблера.

Формат листинга и его полнота не являются жестко регламентированными. Их можно изменить, задавая в исходном файле программы директивы управления листингом. Для знакомства с ними обратитесь к приложению.

В этом документе кратко описан процесс установки учебной среды на основе ассемблера MASM под ОС Windows, а также порядок работы с ней.

Установка MASM

Скачайте архив c MASM с сайта arch32.cs.msu.su.

Распакуйте архив в каталог C:\masm32 (необходимо использовать именно такой путь). Убедитесь, что в каталоге C:\masm32 оказались каталоги bin , lib , include .

Создайте где-либо в удобном месте рабочий каталог для ваших программ, например, C:\asm или D:\study\sem2 . Рабочий стол Windows или папка «Мои документы» не являются подходящими местами для рабочего каталога — проследите, чтобы в полном пути к каталогу не было русских букв или пробелов. Далее таким каталогом будет считаться C:\work .

Скачайте файл prompt.bat и положите его в ваш рабочий каталог.

Простейшая программа

Для следующего шага вам потребуется текстовый редактор, пригодный для работы с программным кодом. Заметим, что Microsoft Word или встроенный в Windows редактор WordPad являются текстовыми процессорами и для работы с программным кодом непригодны. Редактор Notepad (Блокнот) подходит для работы с текстовыми файлами (plain text), но неудобен в качестве программистского редактора — в нем отсутствует подсветка синтаксиса и другие стандартные для таких редакторов функции.

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

Примечание: Если вы решили скачать Notepad2, при первом запуске установите ширину табуляции (Tabulator width) в значение 8 при помощи меню Settings > Tab Settings.

Создайте в вашем рабочем каталоге файл hello.asm следующего содержания:

Примечание: В Notepad2 при сохранении введите имя файла hello.asm , и подсветка синтаксиса включится автоматически.

Эта программа выводит пять раз строчку “Hello World” на экран. Для вывода текста используется макрос outstrln , который определен в файле console.inc .

Трансляция и запуск программы

Дважды щелкните по файлу prompt.bat , который вы скачали на шаге установки. Откроется окно командной строки. Убедитесь, что все сделано правильно, набрав команду dir и нажав Enter . Вы должны увидеть, что в текущем каталоге (вашем рабочем каталоге) находятся файлы hello.asm и prompt.bat :

Примечание для тех, кто никогда прежде не работал с командной строкой. Взаимодействие с ней устроено следующим образом: командная строка выводит приглашение (в примере выше это C:\work> ), далее пользователь вводит команду (выше — dir ) и нажимает клавишу Enter , после чего на экране появляется вывод команды, то есть результат ее работы.

Для запуска программы требуется ее оттранслировать. Первый шаг — запуск ассемблера MASM, который построит по исходному тексту програмы объектный файл:

Аргумент /c инструктирует ассемблер выполнить только трансляцию в объектный файл, без компоновки (которую мы выполним чуть позже). Аргумент /coff указывает формат объектного файла — COFF (Common Object File Format).

В рабочем каталоге появится файл hello.obj . Запустите компоновщик:

Аргумент /subsystem:console говорит компоновщику, что нужно построить консольное Windows-приложение.

В рабочем каталоге появится файл hello.exe . Это исполняемый файл, который уже можно запустить:

Как это устроено

Командный файл prompt.bat запускает окно командной строки и задает переменные окружения так, чтобы программы ml и link были доступны без указания пути к ним, а пути к include- и lib-файлам MASM также были известны.

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

Командный файл для упрощения запуска

Когда вам надоест каждый раз набирать три команды для трансляции и запуска программ, создайте такой командный файл (назвать его можно, например, mkr.bat — то есть make/run):

Использовать его можно будет следующим образом:

Несколько комментариев по устройству этого командного файла:

Команда @echo off отключает дублирование каждой исполняемой команды в окне командной строки.

Аргумент /nologo при вызове ассемблера и компоновщика убирает строчку “Copyright (C) Microsoft”, захламляющую экран.

%1 меняется на аргумент, который передан командному файлу, то есть имя программы на ассемблере (выше — hello.asm ).

n1 меняется на тот же аргумент, но без расширения (выше — hello ).

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

Файл mkr.bat можно или копировать в каждый каталог, где вы планируете размещать исходные тексты программ на ассемблере, или поместить его в каталог C:\masm32\bin , и тогда выполнять его будет можно из любого каталога, при условии, что вы запустили командную строку при помощи prompt.bat .

То, что получилось в итоге — это простейшая система программирования, состоящая из транслятора (ассемблера MASM), текстового редактора (Notepad2 или иного, если вы его предпочли) и примитивной системы сборки на единственном командном файле.

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

Процесс разработки программы на ассемблере состоит из пяти этапов:

1. Создание файла с исходным текстом программы в любом текстовом редакторе. Расширение файла с исходным текстом может быть .asm, или .txt, или .doc.

2. Создание объектного модуля. В среде DOS или NORTON или FAR в командной строке набираете следующую команду:

Tasm name.asm

Tasm.exe name.asm name.obj

name.asm файл с исходным текстом программы. При этом файлы tasm.exe и name.asm должны находится в одном каталоге. После запуска этой команды мы получаем объектный файл с расширением .obj. Если объектный файл не появился, то в программе содержатся ошибки. Перечень ошибок можно посмотреть, отключив панели (ctrl+o или Ctrl+f1 и ctrl+f2).

3. Создание исполнительного файла. В командной строке набираем следующую команду:

Tlink name.obj

Tlink.exe name.obj name exe

При этом файлы tlink.exe и name.obj должны находится в одном каталоге. После запуска этой команды мы получаем запускной файл с расширением .exe. Если запускной файл не появился в этом каталоге, то в данном каталоге не хватает некоторых библиотек. Перечень файлов можно посмотреть, отключив панели (ctrl+o или Ctrl+f1 и ctrl+f2).

4. Тестирование программы. Запустите исполнительный файл.

5. Пошаговая отладка. В командной строке набираем следующую команду:

Td name . exe

Структура программы на ассемблере

Model small ;модель программы, или же количество памяти на сегмент

. data ;сегмент данных

. stack 100 h ;сегмент стека

. code ;сегмент данных

main :

mov ax,@data mov ds , ax

mov ax ,4 c 00 h int 21 h ;выход из программы

End main

Директивы резервирования памяти

Для описания простых типов данных в программе используются специальные директивы резервирования и инициализации данных, которые, по сути, являются указаниями транслятору на выделение определенного объема памяти. Если проводить аналогию с языками высокого уровня, то директивы резервирования и инициализации данных являются определениями переменных.

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

Директивы резервирования и инициализации данных простых типов имеют формат:


Рис. 1. Директивы описания данных простых типов

На рис. 1 использованы следующие обозначения:

· ? показывает, что содержимое поля не определено, то есть при задании директивы с таким значением выражения содержимое выделенного участка физической памяти изменяться не будет. Фактически, создается неинициализированная переменная;

· значение инициализации — значение элемента данных, которое будет занесено в память после загрузки программы. Фактически, создается инициализированная переменная, в качестве которой могут выступать константы, строки символов, константные и адресные выражения в зависимости от типа данных. Подробная информация приведена в приложении 1;

· выражение — итеративная конструкция с синтаксисом, описанным на рис. 5.17. Эта конструкция позволяет повторить последовательное занесение в физическую память выражения в скобках n раз.

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

· db — резервирование памяти для данных размером 1 байт. Директивой db можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

для чисел со знаком –128. +127; для чисел без знака 0. 255;

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

· dw — резервирование памяти для данных размером 2 байта.

o выражение или константу, принимающую значение из диапазона:

для чисел со знаком –32 768. 32 767; для чисел без знака 0. 65 535;

o выражение, занимающее 16 или менее бит, в качестве которого может выступать смещение в 16-битовом сегменте или адрес сегмента;

o 1- или 2-байтовую строку, заключенная в кавычки.

· dd — резервирование памяти для данных размером 4 байта.

o выражение или константу, принимающую значение из диапазона:

для чисел со знаком –2 147 483 648. +2 147 483 647;

для чисел без знака 0. 4 294 967 295;

o относительное или адресное выражение, состоящее из 16-битового адреса сегмента и 16-битового смещения;

o строку длиной до 4 символов, заключенную в кавычки.

· df — резервирование памяти для данных размером 6 байт;

· dp — резервирование памяти для данных размером 6 байт. Директивами df и dp можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

для чисел со знаком –2 147 483 648. +2 147 483 647;

для чисел без знака 0. 4 294 967 295;

o относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или 16 или менее бит (для младших моделей микропроцессоров Intel);

o адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;

o строку длиной до 6 байт, заключенную в кавычки.

· dq — резервирование памяти для данных размером 8 байт.

относительное или адресное выражение, состоящее из 32 или менее бит

o константу со знаком из диапазона –2 63 . 2 63–1 ;

o константу без знака из диапазона 0. 2 64–1 ;

o строку длиной до 8 байт, заключенную в кавычки.

· dt — резервирование памяти для данных размером 10 байт.

относительное или адресное выражение, состоящее из 32 или менее бит

o адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;

o константу со знаком из диапазона –2 79 . 2 79-1 ;

o константу без знака из диапазона 0. 2 80-1 ;

o строку длиной до 10 байт, заключенную в кавычки;

o упакованную десятичную константу в диапазоне 0. 99 999 999 999 999 999 999.

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

Для иллюстрации данного принципа рассмотрим пример 1, в котором определим сегмент данных. В этом сегменте данных приведено несколько директив описания простых типов данных.

Пример 1. Пример использования директив резервирования и инициализации данных. Результатом работы данной программы будет строка 'Привет, все работает'

model small . stack 100 h .datames db 'Привет, все работает',’$' ;определение строки perem_1 db 0ffh ;определение контстантыperem_2 dw 3a7fh ;определение контстантыperem_3 dd 0f54d567ah ;определение контстантыmas db 10 dup (' ') ;определение пустого массива из 10 байтadr dw perem_3 ;переменная adr содержит адрес ;внутри сегмента переменной perem_3a_full dd perem_3 ;переменная a_full содержит полный ;адрес переменной perem_3fin db 'Конец сегмента данных программы $'.code start:;занесение в сегментный регистр адреса сегмента данных mov ax,@data mov ds , ax mov ah,09hmov dx,offset mesint 21h ;вывод на экран строки mesmov ax ,4 c 00 h int 21 h ;выход из программы

End start

Окончание работы программы сопровождается полной выгрузкой программы из оперативной памяти, это осуществляется функцией 4с00h прерывания int 21h.

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

При написании программ на ассемблере регистр букв не важен.

End start

Пример 3. Программа вывода символа на экран

model small . stack 100 h .dataf db 'ф' ;помещаем в переменную f выводимый символ. code start : ;занесение в сегментный регистр адреса сегмента данныхmov ax, @data mov ds, ax ;помещаем в регистр ah номер функции, которая выводит символmov ah, 02h mov dl, f ; помещаем в dl символint 21h ;выводим символ на экранmov ax ,4 c 00 h int 21 h ;выход из программы

End start

Пример 4. Вывод строки на экран

model small .stack 100h .dataf db 'строка вывода$';f – строковая переменная, которая обязательно заканчивается знаком $. code start : ;занесение в сегментный регистр адреса сегмента данныхmov ax, @data mov ds, ax ;помещаем в регистр ah номер функции, которая выводит строку на экранmov ah, 09h mov dx, offset f ; помещаем в dx адрес строки, которую выводимint 21h ;выводим строкуmov ax ,4 c 00 h int 21 h ;выход из программы

End start

Организация вычислений

Логические команды

Система команд микропроцессора содержит пять логических команд. Эти команды выполняют логические операции над битами операндов. Размерность операндов должна быть одинакова. В качестве операндов могут использоваться, регистры, ячейки памяти (переменные) и непосредственные операнды (числа). Любая логическая команда меняет значение следующих флагов of, sf,zf,pf,cf (переполнение, знак, нуля, паритет, перенос)

and операнд_1,операнд_2 — операция логического умножения (И - конъюнкция).

Команда and может применяться для сброса определенных битов в 0 или для определения значения некоторых битов. Например, необходимо 5й бит числа находящегося в bl установить в 0, остальные биты не трогать.and bl, 11011111b или and bl, 0cfh Если необходимо определить чему равен 5й бит, тоand bl, 00100000b или and bl, 20hВ результате если в регистре bl в 5м бите был 0, то после выполнения этой команды мы получим нулевой результат, обнулим весь регистр. Если же в регистре bl в 5м бите была 1, то мы получим не нулевой результат.

or операнд_1,операнд_2 — операция логического сложения (ИЛИ - дизъюнкцию)

or al, x1; al:=al & x1

or eax,edx; eax:=eax & edx

or dx, 0fa11h; dx:=dx & 0fa11h

Команда or может применяться для установки определенных бит в 1. Например, необходимо установить в единицу 4й и 7й биты регистра ah.

or ah, 10010000b или or ah, 90h

xor операнд_1,операнд_2 — операция логического исключающего сложения (исключающего ИЛИ ИЛИ-НЕ). Команда может применятся для выяснения того какие биты в операндах различаются ил для инвертирования состояния заданных бит в операнде_1. Например, необходимо определить совпадает ли содержимое регистров ax и dx

xor ax, dx ;если содержимое совпадает то в регистре ах мы получим

;нулевой результат, иначе не нулевой результат.

xor bh,10b ; инвертировали 1й бит в регистре bh

test операнд_1,операнд_2 — операция “проверить” (способом логического умножения). Команда выполняет поразрядно логическую операцию И над битами операндов операнд_1 и операнд_2. Состояние операндов остается прежним, изменяются только флаги zf, sf, и pf, что дает возможность анализировать состояние отдельных битов операнда без изменения их состояния.

not операнд — операция логического отрицания. Команда выполняет поразрядное инвертирование (замену значения на обратное) каждого бита операнда. Результат записывается на место операнда.


not ax ;ax:=

Пример 5. Логическое сложение двух однобайтных чисел.

model small .stack 100h .datax1 db 0c2h ;первое слагаемоеx2 db 022h ;второе слагаемоеy db ? ;переменная результата . code start : mov ax ,@ data mov ds , ax mov al, x1 ;в al помещаем первое слагаемоеor al, x2 ;осуществляем логическое сложение, результат в almov y, al ;помещаем результат на местоmov ax,4c00h int 21h

Читайте также: