
- •I.Ошский Государственный Университет
- •1. Предварительная подготовка
- •2 Порядок выполнения работы на эвм
- •Контрольные вопросы:
- •IV.Лабораторная работа №2 Массивы
- •23 04 05 67 05 06 07 99 67 08 09 23 87 09 00 08
- •Контрольные вопросы:
- •Лабораторная работа №3
- •Контрольные вопросы:
- •Лабораторная работа №4 Процедуры.
- •Теоретическая часть
- •Работа команд ret и retf
- •Состояние флагов после выполнения команды не меняется. Error: Reference source not found
- •Программа №7.1
- •Контрольные вопросы
Контрольные вопросы:
Объясните формирование 20 битного физического адреса по схеме сегмент:смешение?
Сколько режимов адресации существует, расскажите разницу?
Приведите общий формат команды определения данных программ на Ассемблере.
Найдите ошибку в следующих командах:
MOV DS,@DATA
MOV AX,ES
MOV DS,AX
MOV CS,AX
MOV (ячейка памяти), (ячейка памяти)
Назначение команды POP и PUSH, приведите общий формат команды, приведите пример использования этой команды.
Расскажите об операторе PTR.
Назначение команды XCHG, приведите пример использования этой команды.
Найдите ошибку в следующих командах:
XCNG AX,BX
XCHG CX,BL
XCHG ES,DS
XCHG DATA1,AX
Для чего нужен стек в программе?
Расскажите о способах определения сегментов памяти?
Лабораторная работа №4 Процедуры.
Цель работы:
ознакомить с основами работы с процедурами;
объяснить виды адресаций процедур (NEAR, FAR);
показать использование локальных переменных;
Теоретическая часть
В виде процедур обычно оформляютсямногократноповторяющиеся фрагментыпрограммдляускоренияразработки и сокращения объема программ.Процедуры могут быть внутренними (находятся в том же исходном модуле, что и вызывающая программа, транслируются совместно) и внешними (находятся в отдельных исходныхмодулях,транслируются отдельно).Последние чаще применяют в программах,предназначенных для преобразования в EXE-файлы,а также в случаях, когда процедуры достаточно велики по объему,сложны для отладки или могут быть использованы в других программах.
Ассемблер позволяет вам описывать процедуры несколькими способами. В данной работе описываются процедуры NEAR и FAR, объявление языка процедур, использование в процедурах аргументов и переменных, сохранение регистров, вложенные процедуры и описание процедур методов для объектов.
Синтаксис определения процедур
Для описания процедур вы можете использовать директиву PROC. Директива имеет следующий синтаксис:
PROC имя [расстояние]
[ARG список_аргументов] [RETURN список_элементов];
[LOCAL список_аргументов]
[USES список_элементов]
.
.
ENDP [имя]
Ассемблер также воспринимает для определения процедур синтаксис MASM.
Описание процедур NEAR или FAR
Процедуры NEAR вызываются с помощью вызова ближнего типа и содержат ближний возврат управления. Вы должны вызывать их только в том же сегменте, в котором они определены. Вызов ближнего типа заносит адрес возврата в стек и устанавливает указатель инструктор (IP) в значение смешения процедуры. Поскольку сегмент кода (CS) не изменяется, процедура должна находиться в том же сегменте, что и вызывающая программа. Когда процессор обнаруживает возврат ближнего типа, он извлекает из стека адрес возврата и снова устанавливает в него IP. Сегмент кода не изменяется.
Процедура FAR вызывается с помощью вызова дальнего типа и содержит возврат дальнего типа. Процедуры FAR вы можете вызывать вне сегмента, в котором они определяются. Вызов FAR заносит в стек адрес в виде сегмента и смещения, а затем устанавливает CS:IP в адрес процедуры. Когда процессор обнаруживает возврат дальнего типа, он извлекает из стека сегмент и смещение адреса возврата и устанавливает в него CS:IP.
Расстояние (NEAR или FAR), используемое в процедуре по умолчанию, определяется текущей выбранной моделью. Для моделей TINY, SMALL и COMPACT по умолчанию процедура будет ближней (NEAR). Для всех других моделей по умолчанию выбирается расстояние FAR. Если вы не используете упрощенные директивы определения сегментов, то по умолчанию процедура всегда будет ближней (NEAR).
Примечание: FAR или NEAR можно задать в качестве аргумента оператора MODEL.
Вы можете переопределить используемое по умолчанию расстояние, задав нужное расстояние в определении процедуры. Для этого вы можете использовать ключевые слова NEAR или FAR. Эти ключевые слова переопределяют расстояние, используемое в процедуре по умолчанию, но только для текущей процедуры. Например:
MODEL TINY; по умолчанию расстояния NEAR
.
.; test1 - это дальняя процедура
test1 PROC FAR
; тело процедуры
RET; это будет дальним возвратом:
ENDP
; test2 по умолчанию является
; ближней процедурой
test2 PROC
; тело процедуры
RET; это будет ближним возвратом
ENDP
.
.
В процедурах NEAR и FAR используется одна и та же инструкция RET.Ассемблер использует расстояние процедуры для определения того, требуется возврат ближнего или дальнего типа. Аналогично,Ассемблер использует расстояние процедуры для определения того, требуется для ссылки на процедуру возврат ближнего или дальнего типа.
..
CALL test1 ; это дальний вызов
CALL test2 ; это ближний вызов
..
При выполнении вызова процедуры с опережающей ссылкойАссемблеру может потребоваться для определения расстояния процедуры выполнить несколько проходов. Например:
..
test1 PROC NEAR
MOV ax,10
CALL test2
RET
test1 ENDP
test2 PROC FAR
ADD ax,ax
RET
test2 ENDP
..
КогдаАссемблер при первом проходе достигает инструкции call test2, он еще не обнаруживает test2, и, следовательно, не знает расстояния. Он предполагает, что это расстояние NEAR, и что можно сделать ближний вызов.
КогдаАссемблер обнаруживает, что test2 является на самом деле дальней процедурой, он определяет, что для корректной генерации вызова требуется второй проход. Если вы разрешаете несколько проходов (с помощью параметра-переключателя командной строки /m), то можно сделать второй проход. Если вы не разрешаете несколько проходов, то Ассемблер будет выводить ошибку 'forward reference needs override' ('опережающая ссылка требует переопределения').
Чтобы избежать такой ситуации (и уменьшить число проходов), вы можете задать в вызове расстояние процедур с опережающей ссылкой, как NEAR PTR и FAR PTR.
..
test1 PROC NEAR
mov AX,10
CALL FAR PTR test2
RET
test1 ENDP
..
В предыдущем примере Ассемблеру сообщается, что нужно использовать дальний вызов, поэтому не возникает необходимость в нескольких проходах.