Команды безусловного перехода
Рассмотрим сначала команды безусловного перехода, которые всегда передают управление в указанную в них точку программы. На языке Ассемблера все эти команды записываются в виде
jmp op1
Здесь op1 может иметь следующие форматы:
op1 | Способ выполнения | Вид перехода |
i8 | IP := (IP + i8)mod 216 | Близкий относительный короткий |
i16 | IP := (IP + i16)mod 216 | Близкий относительный длинный |
r16 | IP := [r16] | Близкий абсолютный косвенный |
m16 | IP := [m16] | Близкий абсолютный косвенный |
m32 | IP := [m32], CS := [m32+2] | Дальний абсолютный косвенный |
seg:off | IP := off, CS := seg | Дальний абсолютный прямой |
Здесь seg:off – это мнемоническое обозначение двух операндов в формате i16, разделённых двоеточием. Как видно из этой таблицы, многие потенциально возможные виды безусловного перехода (например, близкие абсолютные прямые, близкие абсолютные короткие и др.) не реализованы в нашей архитектуре. Это сделано исключительно для упрощения центрального процессора (не нужно реализовывать в нём эти команды) и для уменьшения размера программы (чтобы длина поля кода операции в командах не была слишком большой).
Рассмотрим теперь, как на языке Ассемблера задаются эти операнды команд безусловного перехода. Для указания близкого относительного перехода в команде обычно записывается метка команды, на которую необходимо выполнить переход, например:
jmp L; Перейти на команду, помеченную меткой L
Напомним, что вслед за меткой команды, в отличие от метки области памяти, ставится двоеточие. Так как значением метки является её смещение в том сегменте, где эта метка описана, то программе Ассемблера приходится самой вычислять необходимое смещение i8 или i16, которое необходимо записать на место операнда в команде на машинном языке [17], например:
L:add bx,bx ; <─┐
. . . │
. . . │ i8 или i16 (со знаком !)
. . . │
jmpL; L = i8 или i16 <─┘
Здесь формат операнда (i8 или i16) выбирается программой Ассемблера автоматически, в зависимости от расстояния в программе между командой перехода и меткой. Если же метка L располагается в программе после команды перехода, то Ассемблер, ещё не зная истинного расстояния до этой метки, "на всякий случай" заменяет эту метку на операнд размера i16. Поэтому для тех программистов, которые знают, что смещение должно быть формата i8 и хотят сэкономить один байт памяти, Ассемблер предоставляет возможность задать размер операнда в явном виде:
jmp shortL
Ясно, что это нужно делать только при острой нехватке оперативной памяти для программы. [18] Для явного указания дальнего перехода программист должен использовать оператор far ptr, например:
jmp far ptrL
Приведём фрагмент программы с различными видами командам безусловного перехода, в этом фрагменте описаны два кодовых сегмента (для иллюстрации дальних переходов) и один сегмент данных:
data segment
A1 dw L2; Смещение команды с меткой L2 в своём сегменте
A2 dd Code1:L1; Это seg:off
. . .
data ends
code1 segment
. . .
L1:mov ax,bx
. . .
code1 ends
code2 segment
assume cs:code2, ds:data
start:mov ax,data
mov ds,ax ; загрузка сегментного регистра DS
L2: jmp far ptrL1; дальний прямой абсолютный переход, op1=seg:off
. . .
jmp L1; ошибка т.к. без far ptr
jmpL2; близкий относительный переход, op1=i8 или i16
jmpA1; близкий абсолютный косвенный переход, op1=m16
jmp A2; дальний абсолютный косвенный переход, op1=m32
jmp bx; близкий абсолютный косвенный переход, op1=r16
jmp[bx]; ошибка, нет выбора: op1=m16 или m32 ?
mov bx,A2
jmp dword ptr [bx]; дальний абсолютный косвенный переход op1=m32
. . .
code2 ends
Отметим одно важное преимущество относительных переходов перед абсолютными. Значение i8 или i16 в команде относительного перехода зависит только от расстояния в байтах между командой перехода и точкой, в которую производится переход. При любом изменении в сегменте кода вне этого диапазона команд значения i8 или i16 не меняются.
Как видим, архитектура нашего компьютера обеспечивает большой спектр команд безусловного перехода. Напомним, что в нашей учебной машине УМ-3 была только одна команда безусловного перехода. На этом мы закончим наше краткое рассмотрение команд безусловного перехода. Напомним, что для усвоения материала по курсу Вам необходимо изучить соответствующий раздел учебника по Ассемблеру.
Дата добавления: 2015-10-05; просмотров: 888;