Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прогр.docx
Скачиваний:
23
Добавлен:
21.12.2018
Размер:
2.58 Mб
Скачать
  1. Команды управления циклом:

– команда организации цикла со счётчиком есх/сх;

– команда организации цикла со счётчиком есх/сх с возможностью досрочного выхода из цикла по дополнительному условию.

Метка – это символическое имя, обозначающее определённую ячейку памяти, предназначенное для использования в качестве операнда в командах передачи управления.

Транслятор ассемблера присваивает метке три атрибута:

имя сегмента кода, где эта метка описана;

смещение – расстояние в байтах от начала сегмента кода, в котором описана метка;

тип метки или атрибут расстояния.

Тип метки может принимать два значения:

near (ближняя метка) – переход на эту метку возможен только в пределах сегмента кода, где эта метка описана. Физически это означает, что для перехода на метку достаточно изменить только содержимое регистра eip/ip.

far (дальняя метка) – переход на эту метку возможен только в результате межсегментной передачи управления, для осуществления которой требуется изменения содержимого как регистра eip/ip так и регистра cs.

Метку можно определить двумя способами:

оператором : (двоеточие);

директивой label.

Синтаксис первого способа таков:

Символическое имя :

Команда ассемблера

С помощью данного способа можно определить метку только ближнего типа – near.

Синтаксис второго способа таков:

Символическое имя label тип метки

При этом тип метки может принимать значения как near так и far. Пример эквивалентного описания метки ближнего типа:

m1:

mov ax,pole_1

и

m1 label near

mov ax,pole_1

Безусловные переходы

Команды перехода модифицируют регистр указателя команды eip/ip и, возможно сегментный регистр кода cs. Что именно должно модифицироваться зависит:

  1. от типа операнда в команде безусловного перехода (ближний или дальний);

  2. от указания перед адресом перехода (в команде перехода) модификатора; при этом сам адрес перехода может находиться либо непосредственно в команде (прямой переход), либо в регистре или в ячейке памяти (косвенный переход).

Модификатор в команде перехода может принимать следующие значения:

near ptr – прямой переход на метку внутри текущего сегмента кода (изменяется только содержимое регистра ip);

far ptr – прямой переход на метку в другом сегменте кода (изменяется содержимое регистров cs и ip);

word ptr – косвенный переход на метку внутри текущего сегмента кода (изменяется только содержимое регистра ip);

dword ptr – косвенный переход на метку в другом сегменте кода (изменяется содержимое регистров cs и ip);

Безусловный переход jmp

Общий синтаксис:

Jmp [модификатор] адрес_перехода – безусловный переход без сохранения точки возврата.

Существуют несколько кодов машинных команд безусловного перехода jmp.

Дальность перехода определяется местоположением операнда адрес_перехода и бывает внутрисегментным или ближним или межсегментным или дальним.

Можно выделить три варианта внутрисегментного использования команды jmp:

прямой короткий (расстояние от команды jmp до адреса перехода не более чем -128 или +128 байтов, машинная команда безусловного перехода длиной в 2 байта);

прямой (машинная команда безусловного перехода длиной в 3 байта);

косвенный.

Если адрес перехода расположен до команды jmp, то ассемблер формирует короткую команду безусловного перехода без дополнительный указаний. Если адрес перехода располагается после команды jmp, то для формирования короткого безусловного перехода используют модификатор short ptr.

Пример 1: (формирование короткого безусловного перехода):

jmp short ptr m1

; не более 35-40 команд (127 байтов)

m1:

Пример 2: (формирование короткого безусловного перехода):

m1:

; не более 35-40 команд (127 байтов)

jmp m1

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

Пример 3:

M1:

; расстояние более 128 байт и менее 64 Кбайт

jmp m1

.

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

Пример 4:

Lea bx,m1

Jmp bx ; адрес перехода в регистре bx

m1:

Пример 5:

.data

addr dw m1

dw m2

.code

cycl:

mov si,0

jmp addr[si] ; адрес перехода в слове addr+(si)

mov si,1

jmp addr[si] ; адрес перехода в слове addr+(si)

jmp cycl

m1:

m2:

Межсегментный переход изменяет регистры cs и eip/ip. Межсегментный переход поддерживает два варианта команд безусловного перехода: прямой и косвенный.

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

Пример 6:

Seg_1 segment

jmp far ptr m2

m1 label far

seg_1 ends

seg_2 segment

m2 label far

jmp m1

Команда косвенного межсегментного перехода в качестве операнда имеет адрес области памяти, в которой содержатся смещение и сегментная часть адреса перехода.

Таким образом, модификаторы short ptr, near ptr, word ptr применяются для организации внутрисегментных переходов, а far ptr, dword ptr – межсегментных.

Процедуры

В языке ассемблера есть несколько средств, решающих проблему дублирования участков программного кода. К ним относятся:

– механизм процедур;

– макроассемблер;

– механизм прерываний.

Обратиться к процедуре можно с помощью любой команды перехода.

Контекст – информация о состоянии программы в точке вызова процедуры.

Есть две команды, осуществляющие работу с контекстом. Это команды call и ret:

call[модификатор] имя_процедуры – вызов процедуры. Команда call, подобно jmp передаёт управление по адресу с символическим именем имя_процедуры, но при этом в стеке сохраняется адрес возврата. Адрес возврата – это адрес команды, следующей после команды call;

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

Вызов процедуры командой call может быть:

внутрисегментным – процедура находиться в текущем сегменте кода (имеет тип near), и в качестве возврата команда call сохраняет в стек только содержимое регистра eip/ip;

межсегментным – процедура находится в другом сегменте кода (имеет тип far) и для осуществления возврата команда call заносит в стек содержимое обоих регистров cs и eip/ip. Очерёдность такова: сначала в стек помещается регистр cs, а потом eip/ip.

Подобно команде jmp существует четыре разновидности команды call, в зависимости от значения [модификатор] и атрибута дальности в описании процедуры.

Значения [модификатор] такие же, как и у команды jmp за исключением short ptr.

near ptr;

far ptr;

word ptr

dword ptr