Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2012 ЛР Ассемблер Архитектура ВС 6 семестр.doc
Скачиваний:
7
Добавлен:
03.05.2019
Размер:
454.66 Кб
Скачать

ТОЛЬЯТТИНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

КАФЕДРА ИНФОРМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ

Трушников В.Е.

Лабораторный практикум по введению

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

Для студентов специальности

354000 «Прикладная информатика»

ТОЛЬЯТТИ

2004

ВВЕДЕНИЕ

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

Традиционно на рынке ассемблеров для микропроцессоров фирмы Intel имеется два пакета:

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

Turbo Assembler TASM фирмы Borland

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

В эти пакеты входят трансляторы, компоновщики, отладчики и другие отладчики для повышения эффективности процесса разработки программ на ассемблере. Транслятор TASM, работая в режиме MASM, поддерживает почти все возможности транслятора MASM.

Особенности программирования на языке Assembler

1. ОСНОВНЫЕ КОМАНДЫ ЯЗЫКА

ADC целочисленное деление с переносом

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

ADD Целочисленное сложение

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

AND Логическая И

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

CALL Вызов процедуры

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

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

  • вызов прямой дальний (вызов процедуры, расположенной в другом программном сегменте);

  • вызов косвенный ближний;

  • вызов косвенный дальний.

Команда CALL прямого ближнего вызова заносит в стек смещение точки возврата в текущем программном сегменте и модифицирует IP так, чтобы в нем содержалось смещение точки перехода в том же программном сегменте. Необходимое для вычисления этого смещения расстояние до точки перехода содержится в коде команды, который занимает 3 байта (код операции T8h и смещение к точке перехода).

Команда CALL прямого дальнего вызова заносит в стек два слова – сначала сегментный адрес текущего программного сегмента, а затем (выше, в слово с меньшим адресом) смещение точки возврата в текущем программном сегменте. Далее модифицируются регистры IP и CS: в IP помещается смещение точки перехода в том сегменте, куда осуществляется переход, а CS – сегментный адрес этого сегмента. Обе эти величины берутся из кода команды, который занимает % байтов (код операции 9Ah, относительный адрес вызываемой процедуры и её сегментный адрес).

Косвенные вызовы отличаются тем, что адрес перехода извлекается не из кода команды, а из ячеек памяти или регистров; в коде команды содержится информация о том, где находится адрес перехода.

CBW Преобразование байта в слово

Команда заполняет регистр АН знаковым битом числа, находящегося в регистре AL, что дает возможность выполнять арифметические операции над исходным операндом-байтом как над словом в регистре АХ.

CLC Сброс флага переноса

Команда CLC сбрасывает флаг переноса CF в регистре флагов.

CLD Сброс флага направления

Команда CLD сбрасывает флаг DF в регистре флагов, устанавливая прямое (в порядке возрастания адресов) направление выполнения операций со строками.

CLI Сброс флага прерываний

Команда CLI сбрасывает флаг IF в регистре флагов, запрещая все аппаратные прерывания. Прерывания будут оставаться запрещенными до установки флага IF командой sti. На программные прерывания (команду int) флаг не действует.

CMC Инвертирование флага переноса

Команда CMC изменяет значение флага CF в регистре флагов на обратное.

СМР Сравнение

Команда СМР выполняет вычитание второго операнда из первого. В соот­ветствии с результатом вычитания устанавливаются состояния флагов CF, PF, AF, ZF, SF и OF. Сами операнды не изменяются. Таким образом, если команду сравнения записать в общем виде

сmр операнд_1, операнд_2 то ее действие можно условно изобразить следующим образом:

о перанд_1 - операид_2 флаги процессора

В качестве операндов можно указывать регистр (кроме сегментного) или ячейку памяти, а в качестве второго операнда еще и непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памя­ти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Обычно вслед за командой СМР стоит одна из команд условных переходов, анализирующих состояние флагов процессора (je - переход, если рав­но, jne - переход, если не равно и т.д.).

CMPS Сравнение строк

CMPSB Сравнение строк по байтам

CMPSW Сравнение строк по словам

Команды предназначены для операций над строками (строкой называется последовательность байтов или слов с любым содержимым). Они сравнивают по одному элементу каждой строки, осуществляя вычитание второго операнда из первого и устанавливая в соответствии с результатом вычитания флаги CF, PF, AF, ZF, SF и OF. Первый операнд адресуется через DS:SI, второй - через ES:DI. Операцию сравнения можно условно изобразить следующим образом:

(DS:SI) - (ES:DI) -> флаги процессора

После каждой операции сравнения регистры S1 и DI получают положитель­ное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величи­на приращения составляет 1 или 2 в зависимости от размера сравниваемых эле­ментов.

Вариант команды CMPS имеет формат

cmps строка_1, строка_2

(что не избавляет от необходимости инициализировать регистры DS:SI и ES:DI адресами строк строка_1 и строка_2 соответственно). В этом формате возможна замена сегмента первой строки:

cmps Е5:строка_1, строка_2

Рассматриваемые команды могут предваряться префиксами повторения REPE/REPZ (повторять, пока элементы равны, т.е. до первого неравенства) и REPNE/REPNZ (повторять, пока элементы не равны, т.е. до первого равенства). В любом случае выполняется не более СХ операций над последовательными эле­ментами.

После выполнения рассматриваемых команд регистры SI и DI указывают на ячейки памяти, находящиеся за теми (если DF=0) или перед теми (если DF=1) элементами строк, на которых закончились операции сравнения.

CWD Преобразование слова в двойное слово

Команда CWD заполняет регистр DX знаковым битом содержимого регистра АХ, преобразуя тем самым 16-разрядное число со знаком в 32-разрядное. Коман­ду удобно использовать для преобразования двухбайтового делимого в четырех­байтовое (двойное слово) при делении на 16-разрядный операнд.

DAA Десятичная коррекция в регистре AL после сложения

Команда DAA корректирует результат сложения в регистре AL двух упако­ванных десятичных чисел (по одной цифре в каждом полубайте), чтобы получить пару правильных упакованных десятичных цифр. Команда используется вслед за операцией сложения упакованных десятичных чисел. Если результат сложения превышает 99, возникает перенос и устанавливается флаг CF.

DAS Десятичная коррекция в регистре AL после вычитания

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

DEC Декремент (уменьшение на 1)

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

DIV Деление целых беззнаковых чисел

Команда DIV выполняет деление целого числа без знака, находящегося в ре­гистрах АХ (в случае деления на байт) или DX:AX (в случае деления на слово), на операнд-источник (целое число без знака). Размер делимого в два раза больше размеров делителя и остатка.

Для однобайтовых операций делимое помещается в регистр АХ; после вы­полнения операции частное записывается в регистр AL, а остаток - в регистр АН.

Для двухбайтовых операций делимое помещается в регистры DX:AX (в DX -старшая часть, в AX - младшая); после выполнения операции частное записыва­ется в регистр АХ, а остаток - в регистр DX.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]