Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Теоретические сведения. Язык ассемблера является самым низкоуровневым языком программирования



Язык ассемблера является самым низкоуровневым языком программирования. Т.е. он ближе любых других приближен к архитектуре ЭВМ и ее аппаратным возможностям, позволяя получить к ним полный доступ. В отличие от языков высокого уровня (ЯВУ) ассемблерная программа содержит только тот код, который ввёл программист. Никаких дополнительных "обвязок". Вся ответственность за "логичность" кода полностью лежит на узких плечах программиста.

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

Выделим три разновидности "зависания" по способу борьбы с ним:

1) Простое - для выхода из него достаточно нажать Ctrl+Break или Ctrl+C (сначала нажимается клавиша Ctrl и, не отпуская ее, нажимается вторая клавиша - C или Break; отпускаются в обратном порядке). Программа при этом аварийно завершается выходом в DOS.

2) Мягкое - машина не реагирует на Ctrl+Break, но клавиатура "дышит". Т.е. при нажатии на клавиши, типа NumLock, моргают соответствующие светодиоды. В этом случае машину нужно будет перегрузить, нажав Ctrl+Alt+Del. В среде Windows нужно просто "убить" сеанс, закрыв окно.

3) Жесткое - машина никак не реагирует на клавиатуру и не воспринимает комбинацию Ctrl+Alt+Del. В этом случае поможет аппаратный сброс при помощи кнопки "Reset", расположенной на передней панели системного блока. Не нужно выключать и включать ЭВМ. Вы как будущие разработчики аппаратуры должны знать, что она выходит из строя в основном при включении и выключении.

Из-за своей специфики, а также по традиции, для программирования на языке ассемблера нет никаких сред-оболочек типа Turbo C, Turbo Pascal и т.д. Весь процесс технического создания ассемблерной программы можно разбить на 4 шага (исключены этапы создания алгоритма и т.п.):

1) Набор программы в текстовом редакторе и сохранение ее в отдельном файле. Каждый файл имеет имя и тип, называемый иногда расширением. Тип в основном используется для определения назначения файла. Например, программа на C имеет тип C, на Pascal - PAS, на языке ассемблера - ASM.

2) Обработка текста программы транслятором. На этом этапе текст превращается в машинный код, называемый объектным. Кроме того, есть возможность получить листинг программы, содержащий кроме текста программы различную дополнительную информацию и таблицы, созданные транслятором. Тип объектного файла - OBJ, файла листинга - LST. Этот этап называется трансляцией.

3) Обработка полученного объектного кода компоновщиком. Тут программа "привязывается" к конкретным условиям выполнения на ЭВМ. Полученный машинный код называется выполняемым. Кроме того, обычно получается карта загрузки программы в ОЗУ. Выполняемый файл имеет тип EXE, карта загрузки - MAP. Этот этап называется компоновкой или линковкой.

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

Процесс создания ассемблерной программы приведён схематично на рисунке 9.

Рисунок 9 – Процесс создания ассемблерной программы

Все задания по программированию на ассемблере вы будете выполнять в эмуляторе emu8086. Этот программный продукт содержит все необходимое для создания программы на языке Assembler.

Пакет Emu8086 сочетает в себе продвинутый текстовый редактор, assembler, disassembler, эмулятор программного обеспечения (Виртуальную машину) с пошаговым отладчиком, примеры.

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

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

1) директивы набирайте большими буквами, инструкции - малыми;

2) пишите текст широко - не жадничайте;

3) не выходите за край экрана, т.е. не делайте текст шире 80 знаков - его не удобно будет редактировать и печатать;

4) для отступов пользуйтесь табуляцией (клавиша TAB);

5) блоки комментариев задавайте с одинаковым отступом.

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

Чтобы программа выполнилась любой ОС, она должна быть скомпилирована в исполнимый файл. Основные два формата исполнимых файлов в DOS — СОМ и ЕХЕ.

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

.model tiny

.code

org 100h

begin:

mov ah, 9

mov dx,offset message

int 21h

ret

message db "Привет", 0dh, 0ah, '$'

end begin

Рассмотрим исходный текст программы, чтобы понять, как она работает.

Первая строка определяет модель памяти TINY, в которой сегменты кода, данных и стека объединены. Эта модель предназначена для создания файлов типа СОМ.

В DOS для формирования адреса используется сегмент и смещение. Для формирования адреса строки " ПРИВЕТ " используется пара регистров DS (сегмент) и DX (смещение). При загрузке *.com-программы в память, все сегментные регистры принимают значение равное тому сегменту, в который загрузилась наша программа (в т.ч. и DS). Поэтому нет необходимости загружать в DS сегмент строки (он уже загружен).

Директива.code начинает сегмент кода, который в нашем случае также должен содержать и данные.

org 100h устанавливает значение программного счетчика (IP) в 100h (происходит смещение).

Метка begin: располагается перед первой командой в программе и будет использоваться в директиве end(Begin – англ. начало; end – конец), чтобы указать, с какой команды начинается программа.

Вообще вместо слова begin можно было бы использовать что-нибудь другое. Например, start:. В таком случае, нам пришлось бы и завершать программу end start.

Строки

mov ah, 9

mov dx,offset message

int 21h

выводят на экран сообщение “ПРИВЕТ”.

Регистр процессора – это специально отведенная память для хранения какого-нибудь числа.

Для присвоения регистру какого-нибудь значения, в Ассемблере существует оператор mov (от англ. move – загрузить). Команда mov ah, 9 помещает число 9 в регистр ah - номер функции DOS «вывод строки».

Команда mov dx,offset message помещает в регистр DX смещение метки message относительно начала сегмента данных (команда mov – смещение), который в нашем случае совпадает с сегментом кода.

Offset (по-английски - это смещение). Когда, при ассемблировании, Ассемблер дойдет до этой строки, он заменит offset message на адрес (смещение) этой строки в памяти. Если мы запишем offset message (хотя, правильнее будет mov dx,word offset message), то в dx загрузится не адрес (смещение), а первые два символа нашей строки (в данном случае "Пр"). Так как dx - шестнадцатиразрядный регистр, в него можно загрузить только два байта (один символ всегда один байт).

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

Эта команда – основное средство взаимодействия программ с операционной системой. В примере вызывается функция DOS номер 9 - вывести строку на экран. Эта функция выводит строку от начала, адрес которого задается в регистрах ds: dx, до первого встречного символа $. При запуске СОМ-файла регистр ds автоматически загружается сегментным адресом программы, а регистр dx был подготовлен предыдущей командой.

Команда ADD (Addition – сложение (гл. to add – сложить)) осуществляет сложение первого и второго операндов. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется. В качестве первого операнда команды ADD можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команду ADD можно использовать для сложения как обычных целых чисел, так и двоично-десятичных (с использованием регистра АХ для хранения результата).

Команда SUB (Subtraction – вычитание) вычитает второй операнд (источник) из первого (приемника) и помещает результат на место первого операнда. Исходное значение первого операнда (уменьшаемое) теряется. Таким образом, если команду вычитания записать в общем виде

SUB операнд1, операнд2

то ее действие можно условно изобразить следующим образом: операнд1 - операнд2 = операнд1

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

Команда INC (Increment – инкремент) прибавляет 1 к операнду, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака.

Команда INC увеличивает на единицу регистр или значение операнда в памяти.

Она эквивалентна команде ADD источник, 1 только выполняется гораздо быстрее.

Команда DEC (Decrement – декремент) вычитает 1 из операнда, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение.

Она эквивалентна команде SUB источник, 1 только выполняется гораздо быстрее.

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

Add al, 7 в данной функции нет указателя, а значит число будет воспринято как десятичное.

Add al, 101b после числа стоит символ b (от англ. Binary – двойной), так обозначаются двоичные числа (запись эквивалентна 1012).

Add al, 101hпосле числа стоит символ h (от англ. hexadeсimal– шестнадцатеричный), так обозначаются числа в шестнадцатеричной системе счисления(запись эквивалентна 10116).

Пример 1. Напишите программу, выполняющую следующие арифметические действия: 5+1-2.

Решение:

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

CSEG segment; Обозначение сегмента

Org 100h; Смещение сегмента

Begin; ‘Начало’

…; Место для будущего тела программы (действия).

Int 20h; Прерывание

CSEG ends; Конец сегмента

End begin; Конец программы

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

Mov al, 5; Записать в al значение 5 (исходя из задания)

Add al,1; Прибавить 1

Sub al, 2; Отнять 2

Это же самое тело программы можно переписать по-другому, для более быстрого выполнения. Тогда тело программы будет выглядеть так:

Mov al, 5; Записать в al значение 5 (исходя из задания)

inc al; Прибавить 1

dec al; Отнять 1

dec al; Отнять 1

Можно запускать программу (‘Run’). Оба решения будут верны.

Пример 2. Напишите программу, выполняющую следующие арифметические действия: 2510+1012-1216.

Решение:

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

CSEG segment; Обозначение сегмента

Org 100h; Смещение сегмента

Begin; ‘Начало’

…; Место для будущего тела программы (действия).

Int 20h; Прерывание

CSEG ends; Конец сегмента

End begin; Конец программы

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

Mov al, 25; Записать в al значение 5 в десятичной СС.

Add al,101b; Прибавить 101 в двоичной СС.

Sub al, 12h; Отнять 12 в шестнадцатеричной СС.

Можно запускать программу (‘Run’).





Дата публикования: 2015-02-20; Прочитано: 498 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.017 с)...