Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka.doc
Скачиваний:
12
Добавлен:
27.03.2015
Размер:
123 Кб
Скачать
☆

Лабораторная работа № 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. Соглашения о связях "Си-Ассемблер"

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