- •Новосибирский государственный технический университет
- •Лабораторная работа № 2 обработка массивов данных. Интерфейс с языками высокого уровня.
- •Лабораторная работа n 3 прерывания. Интерфейс с базовой системой ввода - вывода
- •Лабораторная работа n 4 программные прерывания. Интерфейс с операционной системой
- •Обработка аппаратных (асинхрониых) прерываний.
- •Лабораторная работа n 6 программы, резидентные в памяти (tsr).
Новосибирский государственный технический университет
Кафедра автоматики
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
к лабораторным работам по курсу "Информатика" для студентов 2 курса дневного отделения факультета автоматики
Часть 4. Ассемблер
Новосибирск – 1996
Лабораторная работа N 1
ТЕХНОЛОГИЯ РАБОТЫ С ПРОГРАММАМИ НА ЯЗЫКЕ АССЕМБЛЕРА В СИСТЕМЕ ПРОГРАММИРОВАНИЯ QUICK-C. ЭЛЕМЕНТАРНЫЕ ОПЕРАЦИИ.
1. Цель работы
Ознакомиться с технологией написания и отладки программ на языке Ассемблера. Ознакомиться с простейшими операциями: пересылки, арифметические операции, поразрядные операции.
2. Краткие теоретические сведения
Современные системы программирования на языке Си включают в себя также средства для написания и отладки ассемблерных программ - как в виде вставок в Си-программы, так и в виде автономных модулей. При этом вставка ассемблерных фрагментов в программу на Си выполняется с помощью директивы _asm в двух вариантах:
вариант 1: _asm mov ax, bx
_asm add ax, 33h
_asm and ax,1
вариант 2: _asm
{
mov ax, bx
add ax, 33h
and ax, 1
}
При этом, естественно, должны соблюдаться соглашения по использованию регистров, принятые для данного компилятора и данной модели памяти.
Часто ассемблерные подпрограммы оформляются в виде автономного программного модуля. В этой случае они размещаются в файле с расширением .asm и могут компилироваться и отлаживаться отдельно. Для упрощения программирования используется набор встроенных псевдокоманд.
Пример автономной программы на Ассемблере:
TITLE HELLO
CR EQU 13 ;определение констант
LF EQU 10
.MODEL TINY ;генерировать .СОМ - файл
.STACK 1OOh ;стек 256 байт
.DATA ;начало сегмента данных
msg DB "Hello, world.", CR, LF, "$" ; текст для вывода
.CODE ;начало кодового сегмента
.STARTUP ;инициализировать сегмент
данных и задать SS=DS
mov ah, 9h ;обращение к DOS, функция 9
mov dx, OFFSET msg ;загрузить в DS смещение
;строки (сегмент уже в DS)
int 21h ;вывести строку
.EXIT 0 ;выход с кодом возврата 0
END ;конец текста программы
При компиляции и отладке этой программы следует правильно установить режим работы QC:
Options – Make - Compiler flags - Memory model - Small
Options – Make - Linker flags - Generate COM-file
Пример оформления этой программы в виде Си-функции
TITLE HELLO
CR EQU 13 ;определение констант
LF EQU 10
.MODEL SMALL,С
.DATA ;начало сегмента данных
msg DB "Hello, world.", CR, LF, "$" ; текст для вывода
.CODE ;начало кодового сегмента
hello PROC NEAR, С ;начало процедуры
mov ah, 9h ;обращение к DOS, функция 9
mov dx, OFFSET msg ;загрузить в DS смещение
;строки (сегмент уже в DS)
int 21h ;вывести строку
ret ;возврат из процедуры
hello ENDP
Перед компиляцией следует отключить режим генерации СОМ-файла (см. выше), поскольку QC не поддерживает эту возможность.
Пример этого же фрагмента в виде ассемблерной вставки:
char msg[] = "Hello, world.\r\n$ ";
_asm
{
mov ah, 9h ;обращение к DOS, функция 9
mov dx, OFFSET msg ;загрузить в DS смещение
строки (сегмент уже в DS)
int 21h ;вывести строку
}
При использовании таких ассемблерных вставок желательно сохранять в стеке и затем восстанавливать используемые регистры.
3. Методические указания
При выполнении работы можно использовать регистры AX, BX, CX, DX и регистровый и непосредственный методы адресации. Для задания констант используйте директиву EQU.
При пошаговой отладке программы и подпрограмм контролировать содержимое регистров можно в окне Registers, которое включается с помощью цепочки команд:
View - Windows - Register
Для связи ассемблерных подпрограмм с Си следует использовать директивы EXTRN и GLOBAL.
4. Порядок выполнения работы
4.1. Написать автономную программу на Ассемблере, выполняющую арифметические и логические операции над словами и байтами по вариантам согласно заданиям. Исходные данные задать с помощью директивы EQU. Результаты работы поместить в ячейки памяти. Проконтролировать правильность работы программы в пошаговом режиме.
4.2. Оформить эту же программу в виде Си-функции. В качестве исходных данных использовать значения глобальных переменных из головной Си-программы. Результат работы поместить в те же глобальные переменные. Ввод и вывод данных оформить в головной программе.
4.3. Оформить эту же программу в виде ассемблерного фрагмента в головной программе. Исходные данные и результат поместить в локальные переменные, описанные в головной программе.
Задания к лабораторной работе.
Исходные данные:
А = 2438Н - двоично - десятичное число
В = 1329Н - двоично - десятичное число
С = -157 - двоичное слово со знаком
D = 100 - двоичный байт без знака
Вариант 1.
1. Переставить 1-ю и 3-ю тетрады в слове А
2. Сложить А и В в двоично-десятичном виде
3. Выделить 2-ю и 4-ю тетрады в слове В и сложить их, как 2 двоичных числа
4. Умножить А на D, в старшем слове выделить два младших разряда и объединить по "ИЛИ" с результатом п.2
Вариант 2.
1. Переставить 2-ю и 4-ю тетрады в слове А
2. Сложить младшие байты А и В в двоичном виде
3. Выделить 1-ю и 3-ю тетрады в В и сложить их как два двоично-десятичных числа
4. Умножить В на D, в младшем слове выделить 1-5 разряды и объединить их по "И" с результатом п.3
Вариант 3.
1. Поменять местами 0-2 разряды младшего и старшего байтов в слова А
2. Сложить С и D в двоичном виде
3. Выделить старший байт А и младший байт В и сложить их как два двоично-десятичных числа
4. Разделить А на D и остаток от деления объединить по "исключающему ИЛИ" с результатом п.3
Вариант 4.
1. Поменять местами 0-2 и 5-7 разряды младшего байта в слове А
2. Вычесть из В значение С в двоичном виде
3. Выделить старшие байты А и В и сложить их как два двоично-десятичных числа
4. Разделить В на С и 3 младших разряда целой части объединить по "ИЛИ" с результатом п.1.
Вариант 5.
1. Поменять местами 0-2 разряди старшего байта и 5-7 разряды младшего байта в слове А
2. Вычесть из В значение О в двоично-десятичной виде
3. Младший и старший Байты А сложить их как два двоичных числа
4. Разделить В на С и 3 старших разряда целой части объединить по "И" с результатом п.3
Вариант 6.
1. Поменять местами 0-3 разряды старшего байта А и 0-3 разряды младшего байта В
2. Вычесть из А значение В в двоичном виде
3. Младший байт А и старший байт В сложить как два двоично-десятичных числа
4. Разделить С на D и объединить по "ИЛИ" частное и остаток от деления. Выделить три младших разряда полученного числа.
5. Контрольные вопросы
1. Правила оформления ассемблерной программы
2. Директивы ассемблера
3. Форматы данных: двоичные, двоично-десятичные, знаковые и беззнаковые представления чисел
4. Особенности команд умножения и деления
5. Стек и команды работы со стеком