Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
экзамен информатика.doc
Скачиваний:
27
Добавлен:
25.04.2019
Размер:
464.38 Кб
Скачать
  1. Процедуры на Ассемблере. Правила оформления процедуры и обращения к ней.

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

Размещают процедуры, как правило, в конце сегменте команд(за последней командой основной программы).

Причем оформляют ее специальным образом:

<имя процедуры> PROC <параметры>

<тело процедуры>

<имя процедуры> ENDP

Параметры и вызов процедуры

При этом <имя процедуры> своего рода метка, именно по этому имени и вызывается процедура.

Обращаться к процедуре следует по команде

CALL <имя процедуры>

Завершаться процедура должна командой возврата RET

По команде вызова запоминается в стеке адрес возврата(команда следущая в основной программе за вызовом CALL). По команд возврата RET и происходит переход на этот адрес возврата.

36. Процедуры на Ассемблере. Передача параметров в процедуру. Рекурсивные процедуры.

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

Размещают процедуры, как правило, в конце сегменте команд(за последней командой основной программы).

Причем оформляют ее специальным образом:

<имя процедуры> PROC <параметры>

<тело процедуры>

<имя процедуры> ENDP

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

При обращении процедуры к самой себе лучше рассматривать обращение к копии, т.е. как будто к другой такой же процедуре. Но сразу возникает вопрос: не произойдет ли зацикливания? Нет, если в ней есть нерекурсивная ветвь, т.е. такой путь вычисления, на котором рекурсивный вызов обходится. Надо также позаботится о том, чтобы рекурсивная процедура обязательно сохраняла значения всех регистров, которыми она пользуется.

  1. Работа с файлами на Ассемблере. Открытие и закрытие файлов. Windows api процедуры открытия и закрытия файлов, их параметры.

На языке Ассемблера существуют возможности работы с файлами, размещенными на диске. Причем, возможности эти представлены в полном объеме:

- можно открыть файл и читать из него информацию (причем, неважно, какой тип файла открывается – текстовый, исполняемый и т.п.)‏

- можно открыть файл для записи и соответственно дописывать в него

- можно открыть файл одновременно для записи и чтения.

- по окончании работы с файлом в программе – файл нужно закрыть!

ОТКРЫТИЕ ФАЙЛА

Итак, чтобы прочитать содержимое файла, необходимо вначале открыть его. Это делается (как и другие операции с файлами) с помощью API-функции CreateFile . При этом:

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

fName BYTE "simple",0 )

Второй параметр показывает процедуре, для чего открывается или создается файл. Параметр GENERICWRITE означает, что разрешена запись в файл, GENERICREAD разрешает только чтение. Можно позволить и чтение и запись: GENERIC_READ or GENERIC_WRITE

Третий параметр показывает, может ли файл использоваться другими программами (не забывайте, что Windows — многоза-дачная операционная система!). Нас пока многозадачность не интересует, поэтому выбираем параметр, равный нулю, что открывает доступ к файлу только нашей программе.

Четвертый параметр тоже имеет отношение к многозадачности. Он содержит адрес области данных, в которой указано, может ли файл использоваться программами, порожденными данной. Любая программа в системе Windows может запускать другие программы или, как говорят, процессы. Мы пока не доросли до запуска «дочерних» программ, поэтому полагаем этот параметр равным нулевому адресу NULL, что разрешает использовать файл только основной программе.

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

Другие значения этого параметра:

CREATENEW (не трогает уже существующий файл),

OPENEXISTING (открывает только уже существующий файл, сохраняя его содержимое),

OPEN_ALWAYS (если файл существует, открывает его, не трогая содержимое, если не существует, создаем новый файл с указанным именем).

Шестой параметр задает атрибут файла: архивный, скрытый, только для чтения, системный и т. д. Например, если параметр равен FILEATTRIBUTEARCHIVE — соотвествует обычному для большинства файлов атрибуту (архивный)‏

Седьмой параметр будем считать всегда равен нулю.

Как бы ни сочетались между собой эти семь параметров, процедура CreateFile возвращает всего одно число в регистре еах. Это дескриптор файла, используемый аналогично дескриптору экрана или клавиатуры mov fHandle, eax

ЗАКРЫТИЕ ФАЙЛА

Завершает работу с файлом API-функция CloseHandle, у которой всего один параметр — дескриптор файла. Эта процедура отсоединяет файл от дескриптора, и после ее выполнения файл снова должен быть открыт, чтобы стали возможными чтение или запись.