- •Новосибирский государственный технический университет
- •Лабораторная работа № 2 обработка массивов данных. Интерфейс с языками высокого уровня.
- •Лабораторная работа n 3 прерывания. Интерфейс с базовой системой ввода - вывода
- •Лабораторная работа n 4 программные прерывания. Интерфейс с операционной системой
- •Обработка аппаратных (асинхрониых) прерываний.
- •Лабораторная работа n 6 программы, резидентные в памяти (tsr).
Лабораторная работа № 2 обработка массивов данных. Интерфейс с языками высокого уровня.
1. Цель работы
Ознакомиться с методами адресации и командами передачи управления, ознакомиться с правилами оформления ассемблерных процедур, вызываемых из Си-программ.
2. Краткие теоретические сведения
Ассемблер позволяет использовать различные режимы адресации для операндов. Ниже показано их использование на примере команды пересылки регистр АХ:
table dw 10 dup (0) ;таблица слов
mov ax, bx ;регистровый операнд в bx
mov aх, 100 ;непосредственный, операнд - константа
mov ax, table ;прямой, table = адрес операнда
mov ax, [bx] ;косвенно-регистровый;
;bx - адрес операнда
mov ax, [bх+2] ;по базе bх+2 = адрес операнда
mov ax, table[di] ;прямой с индексированием,
;table+di = адрес операнда
mov ax, table[bx][di] ;по базе с индексированием,
;table+bx+di = адрес операнда
Ассемблер имеет средства для упрощения программирования процедур, предназначенных для вызова из Си-программ. Они позволяют выполнить соглашения о характеристиках сегментов, модели памяти, правилах передачи параметров и использовании регистров.
Оформленная таким образом ассемблерная процедура имеет вид
.MODEL SMALL,С
func PROC NEAR USES SI DI, a:WORD, b:WORD
LOCAL X:WORD, y:WORD
…
…
RET
func ENDP
Функции func соответствует следующий прототип в Си-программе:
int func(int a, int b);
При входе в ассемблерную процедуру в стеке будут сохранены регистры SI и DI и размещены локальные переменные х и у. Доступ к этим данным организуется с помощью адресации по базе с использованием регистра ВР. При этом нет необходимости вычислять смещения вручную, поскольку ассемблер автоматически генерирует макроподстановки типа
a EQU <WORD PTR [bp+6]>
...
Поэтому в тексте программы в качестве операндов можно использовать имена локальных переменных и передаваемых параметров. По команде RET автоматически генерируются команды восстановления регистров SI, DI, ВР, SP, и затем только выполняется возврат в вызывающую программу.
В ассемблерной процедуре можно свободно использовать регистры AX, BX, CX, DX. Остальные регистры должны быть сохранены и затеи восстановлены.
3. Методические указания
В лабораторной работе требуется написать ассемблерную процедуру, вызываемую из СИ-программы и выполняющую обработку массива байтов (строки). Ввод исходных данных и вывод результата выполняются в СИ-программе.
При написании процедуры обратите внимание на выбор методов адресации и правильное использование команд условной передачи управления. Для организации циклов рекомендуется использовать команду LOOP.
Для возможности совместной пошаговой отладки оба программных модуля должны быть включены в один файл проекта - это можно сделать с помощью последовательности команд:
Make - Set program list - Add
После того, как нужные файлы включены в проект, следует проверить и при необходимости установить режимы работы компилятора и компоновщика:
Options - Make - Compiler flags - Memory model - Small
Options - Make - Linker flags - Stack Size - 4096
4. Порядок выполнения работы
1. Написать головную программу на СИ для вызова функции обработки строк, содержащую:
- прототип ассемблерной функции
- ввод исходных данных с подсказками
- вызов ассемблерной функции
- вывод результата работы функции
2. Написать ассемблерную функцию, выполняющую обработку строк в соответствии с вариантами, приведенными ниже.
3. Выполнить компиляцию и компоновку программы и произвести ее пошаговую отладку.
Задания к лабораторной работе. Исходные данные:
Ассемблерная функция имеет прототип
int func(char *strl, char *str2, int n);
Здесь strl и str2 - две строки символов произвольной длины, содержащие алфавитно-цифровые символы. Значение, возвращаемое функцией в параметр n, зависят от варианта задания.
Вариант 1.
1. Определить длины строк.
2. В конец первой строки дописать вторую строку.
3. В результирующей строке пять символов, начиная с символа n, заменить на пробелы.
4. Вернуть в вызывающую программу сумму длин строк
Вариант 2.
1. Определить длины строк
2. Переставить элементы первой строки в обратном порядке.
3. Во второй строке первые n символов Заменить на пробелы.
4. Вернуть в вызывающую программу разность длин строк
Вариант 3.
1. Определить длины строк
2. В конец первой строки дописать первые n символов из второй строки
3. Поменять местами второй и четвертый байты второй строки
4. Вернуть в вызывающую программу длину второй строки.
Вариант 4.
1. Определить длины строк
2. Поменять местами соответствующие элементы первой и второй строк, до n-го включительно
3. Поменять местами второй и третий элементы второй строки
4. Вернуть в вызывающую программу длину первой строки
Вариант 5.
1. Определить длины строк
2. Первые n символов первой строки заменить на пробелы
3. Во второй строке поменять местами первую и четвертую пары символов
4. Вернуть в вызывающую программу разность длин строк
Вариант 6.
1. Определить длины строк
2. Каждый n-й элемент первой строки заменить на первый элемент второй строки
3. Во второй строке поменять местами первый и последний элементы.
4. Вернуть в вызывающую программу первый элемент второй строки
5. Контрольные вопросы
1. Сравнить режимы адресации: прямой с индексированием и по базе
2. Команды условной передачи управления
3. Команды вызова подпрограммы и возврата
4. Соглашения о связях "Си-Ассемблер"
