Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Команды безусловного перехода






    Рассмотрим сначала команды безусловного перехода, которые всегда передают управление в указанную в них точку программы. На языке Ассемблера все эти команды записываются в виде

    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 (со знаком!)

    ... │

    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 была только одна команда безусловного перехода. На этом мы закончим наше краткое рассмотрение команд безусловного перехода. Напомним, что для усвоения материала по курсу Вам необходимо изучить соответствующий раздел учебника по Ассемблеру.






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.