Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Команды безусловного перехода
Рассмотрим сначала команды безусловного перехода, которые всегда передают управление в указанную в них точку программы. На языке Ассемблера все эти команды записываются в виде jmp op1 Здесь op1 может иметь следующие форматы:
Здесь seg: off – это мнемоническое обозначение двух операндов в формате i16, разделённых двоеточием. Как видно из этой таблицы, многие потенциально возможные виды безусловного перехода (например, близкие абсолютные прямые, близкие абсолютные короткие и др.) не реализованы в нашей архитектуре. Это сделано исключительно для упрощения центрального процессора (не нужно реализовывать в нём эти команды) и для уменьшения размера программы (чтобы длина поля кода операции в командах не была слишком большой). Рассмотрим теперь, как на языке Ассемблера задаются эти операнды команд безусловного перехода. Для указания близкого относительного перехода в команде обычно записывается метка команды, на которую необходимо выполнить переход, например: jmp L; Перейти на команду, помеченную меткой L Напомним, что вслед за меткой команды, в отличие от метки области памяти, ставится двоеточие. Так как значением метки является её смещение в том сегменте, где эта метка описана, то программе Ассемблера приходится самой вычислять необходимое смещение i8 или i16, которое необходимо записать на место операнда в команде на машинном языке [17], например: L: add bx, bx; < ─ ┐ ... │ ... │ i8 или i16 (со знаком!) ... │ jmp L; L = i8 или i16 < ─ ┘ Здесь формат операнда (i8 или i16) выбирается программой Ассемблера автоматически, в зависимости от расстояния в программе между командой перехода и меткой. Если же метка L располагается в программе после команды перехода, то Ассемблер, ещё не зная истинного расстояния до этой метки, " на всякий случай" заменяет эту метку на операнд размера i16. Поэтому для тех программистов, которые знают, что смещение должно быть формата i8 и хотят сэкономить один байт памяти, Ассемблер предоставляет возможность задать размер операнда в явном виде: jmp short L Ясно, что это нужно делать только при острой нехватке оперативной памяти для программы. [18] Для явного указания дальнего перехода программист должен использовать оператор far ptr, например: jmp far ptr L Приведём фрагмент программы с различными видами командам безусловного перехода, в этом фрагменте описаны два кодовых сегмента (для иллюстрации дальних переходов) и один сегмент данных:
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 ptr L1; дальний прямой абсолютный переход, op1=seg: off ... jmp L1; ошибка т.к. без far ptr jmp L2; близкий относительный переход, op1=i8 или i16 jmp A1; близкий абсолютный косвенный переход, 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 была только одна команда безусловного перехода. На этом мы закончим наше краткое рассмотрение команд безусловного перехода. Напомним, что для усвоения материала по курсу Вам необходимо изучить соответствующий раздел учебника по Ассемблеру.
|