- •354000 «Прикладная информатика»
- •Idiv Деление целых знаковых чисел
- •Imul Умножение целых знаковых чисел
- •In Ввод из порта
- •Inc Инкремент (увеличение на 1)
- •Int Программное прерывание
- •I into Прерывание по переполнению
- •Iret Возврат из программы обработки прерывания
- •Xchg Обмен данными между операндами
- •Xlat Табличная трансляция
- •Xor Логическое исключающее или
- •Загрузка и выполнение программ
- •Составление программы на языке Assembler и её размещение в памяти компьютера. Стандартное распределение памяти под программные сегменты.
- •Оператор Текст
- •Имя Операнд_1 ;
- •Имя Операнд_1
- •Загрузка и выполнение программ
- •Mov dl,10 ;Позиция X
- •In Считать данные из порта.
- •Исследование команд, выполняемых процессором. Программирование операций с помощью отладчика языка Assembler..
- •Исследование операций с памятью компьютера. Программирование на языка Assembler в операционной системе ms-dos. Обычная память
- •Косвенная адресация
- •Адресация по базе со сдвигом
- •Косвенная адресация с масштабированием
- •Адресация по базе с индексированием
- •Программирование прерываний на языке Assembler в операционной системе ms-dos.
- •Исследование механизмов работа с видеопамятью персонального компьютера типа ibm. Тестирование и отладка ассемблерных программ.
ТОЛЬЯТТИНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
КАФЕДРА ИНФОРМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ
Трушников В.Е.
Лабораторный практикум по введению
в язык программирования 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.