если df = 0, то значение индексных регистров esi/si и edi/di будет автоматически увеличиваться (операция инкремента) цепочечными командами, то есть обработка будет осуществляться в направлении возрастания адресов;

если df = 1, то значение индексных регистров esi/si и edi/di будет автоматически уменьшаться (операция декремента) цепочечными командами, то есть обработка будет идти в направлении убывания адресов. Состоянием флага df можно управлять с помощью двух команд, не имеющих операндов:

·  cld (Clear Direction Flag) - очистить флаг направления. Команда сбрасывает флаг направления df в 0.

·  std (Set Direction Flag) - установить флаг направления. Команда устанавливает флаг направления df в 1.

3. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Изучить цепочечные команды.

2. В соответствии с индивидуальным заданием составить алгоритм программы обработки строки, содержащей 20 элементов.

3. Написать программу, реализующую разработанный алгоритм;

4. Выполнить отладку, проверить работу программы на различных наборах входных данных.

Правильность разработки и выполнения контролируется путем ручной трассировки составленного алгоритма с последующим сравнением результатов работы программы с результатами ручной трассировки.

4. СОДЕРЖАНИЕ ОТЧЕТА

1. Титульный лист.

2. Индивидуальное задание.

3. Описание алгоритма.

4. Тексты программ с комментариями.

5. Выводы по работе.

5. ВАРИАНТЫ ЗАДАНИЙ

1. Вставить в строчку символ после заданного символа.

2. Сравнить две строки одинакового размера и создать новую строчку, из несовпадающих элементов.

НЕ нашли? Не то? Что вы ищете?

3. Удалить заданный элемент в строке.

4. Найти заданное слово в строке.

5. Подсчитать количество отличий в двух строках одинакового размера.

6. Определить есть ли в строке повторяющиеся символы.

7. Сравнить две строки одинакового размера и создать новую строчку из совпадающих элементов.

8. Подсчитать количество пробелов в строке.

9. Удалить повторяющиеся символы в конце строки.

10. Сравнить две строки одинакового размера и создать новую строчку из несовпадающих элементов.

Приложение Таблица ASCII кодов

Основная таблица ASCII

Расширенная таблица ASCII (cp866)

Лабораторная работа №8 «Процедуры»

1. ЦЕЛЬ РАБОТЫ

Целью работы является разработка простой программы обработки строк с использованием цепочечных команд.

2. ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Процедура, или подпрограмма – это основная функциональная единица декомпозиции некоторой задачи. Процедура представляет собой группу команд для решения конкретной подзадачи и обладает средствами получения управления из точки вызова задачи более высокого уровня и возврата управления в эту точку. В простейшем случае программа может состоять из одной процедуры. Другими словами, процедуру можно определить как правильным образом оформленную совокупность команд, которая, будучи однократно описана, при необходимости может быть вызвана в любом месте программы.

Для описания последовательности команд в виде процедуры в языке ассемблера используются две директивы: PRОC и ENDP.

Синтаксис описания процедуры таков.

имя_процедуры PROC [[модификатор языка] язык ] [расстояние] Заголовок процедуры

[ARG список_аргументов]

[RETURN список_элементов]

команды, директивы ассемблера

Тело процедуры

[имя_процедуры] ENDP

Конец процедуры

В заголовке процедуры обязательным является только имя процедуры. Среди большого количества операндов директивы PROC следует особо выделить [расстояние]. Этот атрибут может принимать значения NEAR или FAR и характеризует возможность обращения к процедуре из другого сегмента кода. По умолчанию атрибут [расстояние] принимает значение NEAR.

Процедура может размещаться в любом месте программы, но так, чтобы на нее случайным образом не попало управление. Если процедуру просто вставить в общий поток команд, то процессор воспримет команды процедуры как часть этого потока.

Передача управления близкой или дальней процедуре с запоминанием в стеке адреса точки возврата осуществляется командой call. В случае ближнего перехода в стек заносится содержимое указателя команд eip/ip и в этот же регистр загружается новое значение адреса, соответствующее метке. Если переход дальний в стек заносится содержимое указателя команд eip/ip и cs. Затем в эти же регистры загружаются новые значения адресов, соответствующие дальней метке.

Возврат управления из процедуры вызывающей программе осуществляется командой ret. Для процедур ближнего типа по команде ret из стека восстанавливается содержимое eip/ip. Для процедур дальнего типа из стека последовательно восстанавливается содержимое eip/ip и сегментного регистра cs.

3. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Изучить теоретические сведения, касающиеся процедур.

2. Преобразовать программу, подготовленную при выполнении лабораторной работы №7, для ее использования в виде процедуры и организовать ее вызов из головной программы с использованием стека!!!

3. Выполнить отладку в пошаговом режиме, проследить работу процессора при выполнении команд call b ret.

4. СОДЕРЖАНИЕ ОТЧЕТА

1. Титульный лист.

2. Индивидуальное задание.

3. Описание алгоритма.

4. Тексты программ с комментариями.

5. Выводы по работе.

5. ВАРИАНТЫ ЗАДАНИЙ

1. Вставить в строчку символ после заданного символа.

(В процедуру передавать заданные символы)

2. Сравнить две строки одинакового размера и создать новую строчку, из несовпадающих элементов.

(В процедуру передавать указатели на исходные строки, обратно – указатель на результат)

3. Удалить заданный элемент в строке.

(В процедуру передавать заданный элемент)

4. Найти заданное слово в строке.

(В процедуру передавать указатель на строку и на слово)

5. Подсчитать количество отличий в двух строках одинакового размера.

(Из процедуры передавать количество отличий)

6. Определить есть ли в строке повторяющиеся символы.

(Из процедуры передавать повторяющиеся символы)

7. Сравнить две строки одинакового размера и создать новую строчку, из совпадающих элементов.

(В процедуру передавать указатели на исходные строки, обратно – указатель на результат)

8. Подсчитать количество пробелов в строке.

(Из процедуры передавать количество пробелов)

9. Удалить повторяющиеся символы в конце строки.

(Из процедуры передавать количество пробелов)

10. Сравнить две строки одинакового размера и создать новую строчку, из несовпадающих элементов.

(В процедуру передавать указатели на исходные строки, обратно – указатель на результат)

Лабораторная работа №9 «Прерывания»

1. ЦЕЛЬ РАБОТЫ

Целью работы написание и отладка собственного прерывания.

2. ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Прерывание – это приостанов выполнения программы с целью выполнения какой-то более важной или нужной в данный момент другой программы или процедуры, после завершения которой продолжается выполнение программы с того места, где она была прервана.

Прерывание позволяет компьютеру приостановить любое свое действие и временно переключиться на другое, как заранее запланированное, так и неожиданное, вызванное непредсказуемой ситуацией в работе машины или ее компонента. Каждое прерывание вызывает загрузку определенной программы, предназначенной для обработки возникшей ситуации – программы обработки прерываний.

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

Чтобы обратиться к этим возможностям ЭВМ, пользовательская программа должна быть прервана и должна быть выполнена системная функция, после чего пользовательская программа продолжается со следующей после обращения к системным функциям команды. Эти функциональные возможности и выполняют команды прерывания, которые описаны в таблице.

Формат команд прерывания

Мнемокод

Формат

INT

INT тип_прерывания

INTO

INTO

IRET

IRET

В команде прерывания INT тип_прерывания представляет собой номер прерывания, которых в ЭВМ IBM насчитывается 256 (типы прерываний имеют номера 0-255):

-  тип 0 – возникает при делении на 0 или если частное от деления превышает разрядную сетку;

-  тип 1 – действует в режиме “трассировки” ( после выполнения каждой команды программы происходит останов);

-  тип 2 – немаскируемые технические прерывания;

-  тип 3 - прерывания по команде INT, включенной в программу (вызывает останов и отображение содержимого регистров микропроцессора);

-  тип 4 – прерывание по команде INTO, включенной в программу (выполняется при условии, что при выполнении предыдущей команды произошло переполнение разрядной сетки);

-  типы 8-15 – аппаратные прерывания, инициируемые внешними устройствами;

-  типы – планируемые программные прерывания BIOS;

-  типы 32-255 – программные прерывания DOS.

В некоторых типах прерываний BIOS и DOS имеется много разновидностей, иногда более 10. Так, прерываниеН) имеет около 100 разновидностей (это прерывание наиболее часто используется в программах пользователя). В таких случаях вид прерывания (внутри типа) определяется содержимым регистра AH.

Каждому прерыванию в памяти ЭВМ соответствует вектор прерывания (эти вектора размещены в оперативной памяти, начиная с нулевого адреса). Каждый вектор прерывания размещается в 32-битовой ячейке памяти и представляет собой адрес, по которому размещена собственно программа прерывания. По сути такие программы очень похожи на процедуры, отличие в том, что программа прерывания заканчивается командой возврата IRET.

При выполнении команды INT микропроцессор производит следующие действия:

а) помещает в стек регистр флагов;

б) обнуляет флаг трассировки TF и флаг включения-выключения прерываний IF для блокировки других действий, кроме обработки вызванного прерывания;

в) помещает в стек значение регистра CS;

г) вычисляет адрес вектора прерываний, умножая номер_прерывания на 4 (т. к. вектор прерывания занимает 4 байта или 32 бита);

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

е) помещает в стек значение указателя команд IP;

ж) загружает в IP первое слово вектора прерываний.

После выполнения всех этих действий в стеке окажутся значения регистра флагов, адреса сегментного регистра CS и смещение команды, следующей за командой прерывания IP. Пара регистров CS:IP будет указывать на начальный адрес программы обработки прерывания, которую микропроцессор и начнет выполнять.

Команда INTО представляет собой команду условного прерывания. Она инициирует прерывание в том случае, когда флаг переполнения OF равен 1. Следовательно, применять эту команду надо после арифметических операций, которые могут вызвать переполнение. Однако обрабатываться прерывание будет только при наличии переполнения, при отсутствии эта команда будет игнорироваться. Команда INTО вызывает команду обработки по вектору прерывания 4, для определения выполняемых командой действий необходимо обратиться к техническому руководству для конкретной ЭВМ. Выбор действий по обработке ситуаций переполнения возлагается на пользователя, поэтому без дополнительного уточнения по руководству конкретного компьютера пользоваться этой командой не рекомендую.

Команда IRET является командой возврата после прерывания. Она извлекает из стека значения регистров CS и IP и регистра флагов (считывает три ячейки стека), а затем микропроцессор по новому содержанию регистров команд продолжит выполнение программы пользователя.

Программа обработки прерывания - это отдельная процедура,

имеющая структуру:

SUBR_INT PROC FAR

PUSH AX ; сохранение изменяемых регистров

...

<действия по обработке прерывания>

POP AX ; восстановление регистров

...

MOV AL, 20H

OUT 20H, AL

IRET

SUBR_INT ENDP

Две последние строки перед IRET необходимы для разрешения обработки прерываний с более низкими уровнями, чем только что обработанное.

Замечание: в лабораторной работе действиями по обработке прерывания может быть вывод на экран некоторого текста или включение/выключение звукового сигнала.

Программа, использующая новые программы обработки прерываний при своем завершении должна восстанавливать оригинальные векторы прерываний. Функция 35 прерывания 21H возвращает текущее значение вектора прерывания, помещая значение сегмента в ES, а смещение в BX. В этом случае программа должна содержать следующие инструкции:

; -- в сегменте данных

KEEP_CS DW 0 ; для хранения сегмента

KEEP_IP DW 0 ; и смещения прерывания

; -- в начале программы

MOV AH, 35H ; функция получения вектора

MOV AL, 1CH ; номер вектора

INT 21H

MOV KEEP_IP, BX ; запоминание смещения

MOV KEEP_CS, ES ; и сегмента

Для установки написанного прерывания в поле векторов прерываний используется функция 25H прерывания 21H, которая устанавливает вектор прерывания на указанный адрес.

PUSH DS

MOV DX, OFFSET ROUT ; смещение для процедуры в DX

MOV AX, SEG ROUT ; сегмент процедуры

MOV DS, AX ; помещаем в DS

MOV AH, 25H ; функция установки вектора

MOV AL, 60H ; номер вектора

INT 21H ; меняем прерывание

POP DS

В конце программы восстанавливается старый вектор прерывания

CLI

PUSH DS

MOV DX, KEEP_IP

MOV AX, KEEP_CS

MOV DS, AX

MOV AH, 25H

MOV AL, 1CH

INT 21H ; восстанавливаем вектор

POP DS

STI

3. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Изучить теоретический материал, касающийся прерываний.

2. Написать программу в соответствии с индивидуальным заданием.

3. Выполнить отладку, проследить работу программы.

4. СОДЕРЖАНИЕ ОТЧЕТА

1. Титульный лист.

2. Индивидуальное задание.

3. Описание алгоритма.

4. Текст программы с комментариями.

5. Выводы по работе.

5. ВАРИАНТЫ ЗАДАНИЙ

№ бригады

Шифр задания

№ бригады

Шифр задания

1

8

2

9

3

10

4

11

5

12

6

13

7

14

8

15

Цифра в шифре задает номер и назначение заменяемого вектора прерывания:

1 - 1Ch - прерывание от часов - генерируется автоматически операционной системой 18 раз в сек;

2 - 60h - прерывание пользователя - должно генерироваться в программе;

3 - 05h - прерывание, генерируемое при нажатии клавиш Shift+PrintScr;

4 - 23h - прерывание, генерируемое при нажатии клавиш Control+C.

Буква определяет действия, реализуемые программой обработки прерываний:

А - Печать сообщения на экране;

В - Выдача звукового сигнала(печать символа с кодом 07h);

С - Приостановить вывод на экран (вставить цикл задержки).

Замечание: для исключения возможного взаимного влияния системных и пользовательских прерываний рекомендуется отвести в программе под стек не менее 1К байт.

Лабораторная работа №10 «Программирование операций ввода-вывода»

1. ЦЕЛЬ РАБОТЫ

Целью работы является разработка простой программы обработки строк с использованием операций ввода-вывода информации.

2. ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Наиболее распространенным в программах пользователя является использование прерывания 21H, которое предназначено для вызова функций DOS. В нижеприведенной таблице описываются только некоторые из видов этого прерывания, направленные на работу со средствами ввода-вывода.

Наиболее часто используемые виды прерывания 21Н

Значе-ние АН

Операция

Дополнительные входные
регистры

Выходные регистры

1

Ожидание набора символа на клавиатуре с последующим изображением его на экране

Не используются

(AL) = символ

2

Вывод символа на экран

(DL)= ASCII-код символа

Не использу-ются

6

Чтение символа с клавиатуры

(DL)=0FFH

(AL) = символ

A

Чтение клавиатурной строки в буфер

(DS:DX)= адрес буфера, первый байт = размер буфера

Второй байт буфера = число про-читанных символов

9

Изображение строки на экране дисплея

(DS:DX)= адрес строки, которая должна заканчиваться символом $

Не используются

Пример организации ввода одного из двух ожидаемых значений, например, Y или N. Ввод Y заставляет программу перейти к группе команд, помеченных как YES, а N – к командам с меткой NO. При ошибочном нажатии какай либо другой клавиши программа возвращается на ввод символа до тех пор, пока не будет нажата либо Y, либо N.

GET_KEY MOV AH,01Н ; считать символ

INT 21H

CMP AL,’Y’ ; считан Y?

JE YES ; если да, то перейти к YES

CMP AL,’N’ ; считан N?

JE NO ; если да, то перейти к YES

JNE GET_KEY ; иначе возврат на чтение символа.

При необходимости ввести строку с информацией используется функция А прерывания 21Н. Чтобы воспользоваться этой функцией, в программе пользователя требуется зарезервировать в сегменте данных место для вводимой строки (в таблице это называется буфер строки). Количество выделяемых байтов должно быть на 2 больше максимального размера вводимой строки. Причем первый байт буфера должен задавать эту самую максимальную длину (фактически он будет содержать значение количества выделенных байтов памяти минус 2). Например, чтобы предусмотреть в программе ввод пользовательской строки из 50 символов, в сегменте данных нужно описать:

STRING DB 50, 51 DUP (?) ; первый байт в области – константа 50, за ней следуют незаполненные 51 байт для сообщения.

Чтение строки выполняется командами:

LEA DX, STRING; указатель на буфер поместить в DS:DX

MOV AH,0AH ; вызвать функцию А

INT 21H ; прочитать строку.

Функция А помещает количество фактически введенных символов во второй байт буфера STRING и не изменяет указатель DS:DX. Т. е. после выполнения команды INT первый информационный символ введенной строки находится по адресу (DX)+2.

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

MESS1 DB ‘Hello’,’$’.

В командном коде команды вызова функции 9 записываются следующим образом:

LEA DX, MESS1

MOV AH,09Н

INT 21H.

В этом случае курсор устанавливается в позицию $, т. е. в то место строки. Чтобы после выдачи приглашения курсор установился в начале следующей строки, необходимо в текст выдаваемого сообщения перед символом доллара ввести символы возврата каретки и перехода на следующую строку, как это демонстрируется ниже:

MESS1 DB ‘Hello’, 0DH,0AH,’$’.

3. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Изучить теоретические сведения, касающиеся программирования операций ввода-вывода.

2. Преобразовать программу, подготовленную при выполнении лабораторной работы №8 таким образом, чтобы исходные данные вводились с клавиатуры, а результат ее работы выводился на экран.

3. Проследить работу программы.

4. СОДЕРЖАНИЕ ОТЧЕТА

1. Титульный лист.

2. Индивидуальное задание.

3. Тексты программ с комментариями.

4. Скриншоты рабочих окон.

5. Выводы по работе.

Лабораторная работа №11 «Работа с файлами»

1. ЦЕЛЬ РАБОТЫ

Целью работы является разработка простой программы обработки строк с использованием операций работы с файлами.

2. ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

5bH: создать новый файл

Вход

AH = 5bH

DS:DX = адрес строки ASCIIZ с именем файла

CX = атрибут файла

Выход

AX = код ошибки если CF установлен и дескриптор файла если ошибок нет

3dH: открыть файл

Вход

AH = 3dH

DS:DX = адрес строки ASCIIZ с именем файла

AL = режим открытия

AL = 0 чтобы открыть для чтения

AL = 1 чтобы открыть для записи

AL = 2 чтобы открыть для чтения и записи

Выход

AX = код ошибки если CF установлен и дескриптор файла если нет ошибки.

3fH: читать файл

Вход

AH = 3fH

BX = дескриптор файла

DS:DX = адрес буфера для чтения данных

CX = число считываемых байт

Выход

AX = код ошибки если CF установлен или число действительно прочитанных байт

CX байт данных считываются из файла или устройства с дескриптором, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей программы, адресуемый через DS:DX.

Всегда нужно сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт):

если AX = CX, (и CF сброшен) - чтение было корректным без ошибок

если AX = 0, достигнут конец файла (EOF)

если AX < CX (но ненулевой):

- при чтении с устройства - входная строка имеет длину AX байт

- при чтении из файла - в процессе чтения достигнут EOF

40H: писать в файл

Вход

AH = 40H

BX = дескриптор файла

DS:DX = адрес буфера, содержащего записываемые данные

CX = число записываемых байт

Выход

AX = код ошибки если CF установлен

AL = число реально считанных байт (лучший тест для ошибок)

CX байт данных записывается в файл или на устройство с дескриптором, заданным в BX. данные берутся из буфера, адресуемого через DS:DX. данные записываются, начиная с текущей позиции указателя чтения/записи файла.

Необходимо всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи).

- если AX = CX, запись была успешной

- если AX < CX, встретилась ошибка (например, переполнение).

3. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Изучить теоретические сведения, касающиеся программирования операций с файлами.

2. Преобразовать программу, подготовленную при выполнении лабораторной работы №8 таким образом, чтобы исходные данные вводились из файла, а результат ее работы выводился в другой файл.

3. Проследить работу программы.

4. СОДЕРЖАНИЕ ОТЧЕТА

1. Титульный лист.

2. Индивидуальное задание.

3. Тексты программ с комментариями.

4. Содержимое исходного и результирующего файлов.

5. Выводы по работе.

5. ВАРИАНТЫ ЗАДАНИЙ

Во всех вариантах исходные строки хранятся в исходном файле.

В заданиях, где результат строковый, он выводится в файл. Дополнительные данные вводятся с клавиатуры.

1. Вставить в строчку символ после заданного символа.

Оба символа вводятся с клавиатуры.

2. Сравнить две строки одинакового размера и создать новую строчку, из несовпадающих элементов.

3. Удалить заданный элемент в строке.

4. Найти заданное слово в строке.

Слово вводится с клавиатуры, результат работы программы - сообщение «Слово найдено» или «Слово не найдено».

5. Подсчитать количество отличий в двух строках одинакового размера.

Результат выводить на экран.

6. Определить есть ли в строке повторяющиеся символы.

Результат работы программы - сообщение «Повторяющиеся символы есть» или «Повторяющиеся символы не найдены».

7. Сравнить две строки одинакового размера и создать новую строчку, из совпадающих элементов.

8. Подсчитать количество пробелов в строке.

Результат (количество пробелов) выводить на экран.

9. Удалить повторяющиеся символы в конце строки.

Результат (количество удаленных символов) выводить на экран.

10. Сравнить две строки одинакового размера и создать новую строчку, из несовпадающих элементов.

Лабораторная работа №12 «Макросы»

1.  ЦЕЛЬ РАБОТЫ

Целью работы является разработка программы обработки строк с использованием макросов.

2. ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Макрокоманды

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

Макроопределение:

имя_макрокоманды macro список_формальных_аргументов

тело макроопределения

endm

Макродирективы

С помощью макросредств ассемблера можно не только частично изменять входящие в макроопределение строки, но и модифицировать сам набор этих строк и даже порядок их следования. Сделать это можно с помощью набора макродиректив (далее — просто директив).

Директивы повторения WHILE, REPT, IRP и IRPC.

Директивы этой группы предназначены для создания макросов, содержащих несколько идущих подряд одинаковых последовательностей строк. При этом возможна частичная модификация этих строк.

Директивы WHILE и REPT применяют для повторения определенное количество раз некоторой последовательности строк.

Эти директивы имеют следующий синтаксис:

WHILE константное_выражение

последовательность_строк

ENDM

REPT константное_выражение

последовательность строк

ENDM

Последовательность повторяемых строк в обоих случаях ограничена директивой ENDM.

Директивы IRP и IRPC делают процесс формирования текста более гибким, позволяя модифицировать на каждой итерации некоторые элементы в последовательность_строк.

Директива IRP имеет следующий синтаксис:

IRP формальный_аргумент,<строка_символов_1,...,строка_символов_N>

последовательность_строк

ENDM

Действие данной директивы заключается в том, что она повторяет последовательность_строк N раз, то есть столько раз, сколько строк_символов заключено в угловые скобки во втором операнде директивы IRP.

Повторение последовательности_строк сопровождается заменой в ней формального_аргумента строкой символов из второго операнда. Так, при первой генерации последовательности_строк формальный_аргумент в них заменяется на строка_символов_1.

Если есть строка_символов_2, то это приводит к генерации второй копии последовательности_строк, в которой формальный_аргумент заменяется на строка_символов_2. Эти действия продолжаются до строка_символов_N включительно.

К примеру, рассмотрим результат определения в программе следующей конструкции:

irp ini,<10,11,3,4,5>

db ini

endm

Макрогенератором будет сгенерировано следующее макрорасширение:

1A 0A db 10

1B 0B db 11

1C 03 db 3

1D 04 db 4

1E 05 db 5

3. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Изучить теоретические сведения, касающиеся программирования с использованием макросов.

2. Преобразовать программу, подготовленную при выполнении лабораторной работы №11 таким образом, чтобы в ней использовались макросы, выделенные в отдельный файл и подключались в текст главного модуля директивой include.

3. Проследить работу программы.

4. СОДЕРЖАНИЕ ОТЧЕТА

1. Титульный лист.

2. Индивидуальное задание.

3. Тексты программ с комментариями.

4. Выводы по работе.

Лабораторная работа №13 «Связь с языками высокого уровня»

1. ЦЕЛЬ РАБОТЫ

Целью работы является разработка программы на языке Си с включением в нее процедуры.

2. ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Программа на языке СИ может вызвать процедуру на языке Ассемблер, находящуюся в другом модуле, как и при вызове СИ-функции. При написании процедуры на языке Ассемблерследует соблюдать следующие правила:

1. Описывайте процедуры, вызываемые из СИ-программ с ключевым словом far, если СИ-модуль был скомпилирован в большой, сверхбольшой или средней модели памяти, и с ключевым словом near, если СИ-модуль был скомпилирован в малой или компактной модели. Ключевые слова far или near отменяют любые стандартные назначения. Если вы используете директиву. MODEL, имеющуюся в Microsoft Macro Assembler версии 5.0, объявление модели памяти для процедуры делается явно.

2. По соглашениям языка СИ параметры опускаются в стек в том порядке, в каком они находятся в исходном коде. Например, вызов функции СИ calc(a, b); опускает b в стек раньше a. В противоположность остальным высокоуровневым языкам, в соглашениях о связях языка СИ положено, чтобы вызывающая процедура всегда восстанавливала стэк непосредственно после возвращения управления из вызываемой программы. Соглашения о связях языка СИ делают возможным вызов переменным числом параметров. (Поскольку первый параметр всегда опускается в стек последним, он имеет относительно указателя на запись активации один и тот же адрес. Независимо от количества переданных числом параметров применяются следующие этапы:

а) Возврат производится посредством простой инструкцией ret. Не восстанавливайте стек посредством инструкции ret size, поскольку вызывающая СИ-процедура сама восстановит стек, как только ей будет передано управление.

б) Параметры помещаются в стек в порядке, обратном тому, как они появлялись в исходном коде на языке СИ. Первый параметр будет находиться по младшим адресам памяти (поскольку это последний помещаемый в стек параметр, то есть стек растет вниз).

с) Стандартно, параметры языка СИ передаются значением, исключая массивы, передаваемые по адресной ссылке.

3. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Изучить теоретические сведения, касающиеся вызова ассемблерных процедур из Си программы.

2. Подготовить программу на языке Си для вызова процедуры, созданной при выполнении лабораторной работы №8. Программа на языке Си должна обеспечивать интерфейс с пользователем.

3. Отладить программу, наблюдать ее работу.

4. СОДЕРЖАНИЕ ОТЧЕТА

1. Титульный лист.

2. Индивидуальное задание.

3. Тексты программ с комментариями.

4. Выводы по работе.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4