Вход в систему

Лекции по курсу "Проектирование ассемблеров, компоновщиков, макропроцессоров"

10. Команды переходов

 

Команда перехода нарушает естественный порядок выполнения команд посредством загрузки в программный счетчик адреса команды, к которой осуществляется переход. Команды, изменяющие содержимое регистров CS и IP, называются межсегментными переходами, а модифицирующие лишь содержимое IP - внутрисегментными. Межсегментные передачи управления реализуются только командами безусловных переходов.

Команды условных переходов

Все команды условных переходов имеют следующий формат:


Второй байт содержит 8-битное смещение (в доп. коде) относительно следующей команды в программе. Эффективный адрес перехода находится путем расширения знака D8 и прибавления его к содержимому IP после инкремента IP для адресации следующей по порядку команды. Отрицательное смещение - переход назад, положительное - вперед относительно следующей команды (адрес перехода находится в диапазоне от -128 до +127 байт).

           000A     B2 2E   m5:    mov bl,2eh
          000C    3B 1C           cmp [si],bl
           000E     74 02 je m ; следующая коман-
    ;да через 2 байта
    ;от IP
IP —› 0010     B3 20             mov bl,20h
           0012     3B 1C  m:    cmp [si],bl
           0014     75 F4      jne m5 ; -12 в доп. коде
IP —› 0016      ...        

 

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

Имеется пять команд безусловного перехода. Три команды осуществляют переход к точке в текущем сегменте кода (внутрисегментные), а две - в другой сегмент (межсегментные). Все команды однооперандные и имеют одинаковую мнемонику JMP.

Форматы команд:

  1. внутрисегментные:

    • прямой короткий [IP]:=[IP] + DISP


    • прямой близкий [IP]:=[IP] + DISP



    • косвенный [IP] ‹— [EA]




  2. межсегментные:

    • прямой далекий [IP] ‹— DISP     [CS] ‹— Сегментный адрес



    • косвенный [IP] ‹— [EA]     [IP] ‹— [EA+2]


 

Внутрисегментные переходы реализуются с помощью 8-битного смещения от текущего содержимого IP, 16-битного смещения от IP или получения адреса перехода из ячейки памяти, адресуемой командой. Вычисление 8-битного смещения реализуется так же, как в командах условных переходов, и имеет те же ограничения. Вычисление 16-битного смещения выполняется аналогично, но переход производится в любую точку текущего сегмента. Благодаря игнорированию переноса из 16-го бита текущий сегмент интерпретируется как кольцо. Следовательно, хотя ассемблер вычисляет смещение как число в дополнительном коде, диапазон составляет от -[IP] до 216-[IP] (а не от 215 до 215-1).

Межсегментные переходы модифицируют содержимое регистров CS и IP. Они могут быть прямыми, т.е. новое содержимое CS и IP является частью команды, или косвенными - в первом слове операнда находится новое содержимое IP, а в следующем слове - новое содержимое CS. В межсегментных косвенных переходах операнд должен указывать на ячейку памяти.

Так как все команды безусловного перехода имеют одну и ту же мнемонику, ассемблеру необходимы какие-то средства для определения одного из пяти типов переходов. Наиболее распространено в ассемблере соглашение об указании типа команды. В командах внутрисегментного прямого короткого перехода, внутрисегментного прямого близкого перехода и межсегментного прямого перехода содержатся атрибутные операторы short, near ptr и far ptr соответственно. Если такие префиксы применяются для этих типов команд всегда, то отсутствие атрибутного оператора означает косвенный переход, где тип операнда всегда определяет, каким будет переход: внутри- или межсегментным. Если операнд является словом, то предполагается внутрисегментный переход, а если двойным словом (необходимым для хранения сегмента и смещения), - межсегментный. Это означает, что тип операнда должен быть известным, когда ассемблер встречает команду перехода.



Пример с командами условных и безусловных переходов:

11 0009 33 DB 12 000B 8B FB 13 000D 8B F3 14 000F 83 00 15 0014 7E 03 16 0016 47 17 0017 EB 03 18 0019 7C 01 19 001B 46 20 001C 83 C3 02 21 001F 49 22 0020 75 ED 23 0022 A1 4E 24 0025 2B C7 25 0026 2B C6 26 0029 74 02 27 002B EB EF 28 002D 90   xor bx,bx mov di,bx mov si,bx cmp [bx],0 jle less inc di jmp short next less: jl next inc si next: add bx,2 dec cx jnz a mov ax,4eh sub ax,di sub ax,si jz skip jmp near ptr next skip: nop


Действие межсегментного перехода:

code1   segment
    .
.
    jmp far ptr cont
    .
.
code1   ends
    .
.
code2   segment
    .
.
cont:   mov ax,bx
    .
.
code2   ends

В этом примере команда jmp вызывает загрузку в IP смещения cont в сегменте code2 и загрузку в CS сегментного адреса code2.

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

Введение
Причины использования языка ассемблер
Причины неиспользования языка ассемблер
Синтаксис ассемблера
Системное программное обеспечение и структура ЭВМ
Программная модель процессора Intel 8086
Организация работы памяти
Операнды
Адресация операндов
Формат машинных команд
Команды переходов
Типы ассемблеров. Функции ассемблера
Ассемблер по схеме 1А / ОП
Ассемблер по схеме 1А / МД
Двухпросмотровый ассемблер
Многопросмотровый ассемблер
Загрузчик
Структура объектных файлов. Основные понятия
Идентификация модуля и атрибуты
Концепция привязки
Объектный файл. Последовательность записей
Объектный файл. Формат записей
Формат записей THEADR и LHEADR
Формат записи LNAMES
Формат записи SEGDEF
Формат записи GRPDEF
Формат записи PUBDEF
Формат записи COMDEF
Формат записи LOCSYM
Формат записи EXTDEF
Формат записи LINNUM
Формат записи LEDATA
Формат записи LIDATA
Формат записи FIXUPP
Формат записи MODEND
Формат записи комментариев

 



исполнялось 0,741762 c, запросов к базе 6