Лекции по курсу "Проектирование ассемблеров, компоновщиков, макропроцессоров"
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.
Форматы команд:
- внутрисегментные:
- прямой короткий [IP]:=[IP] + DISP
- межсегментные:
Внутрисегментные переходы реализуются с помощью 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
Формат записи комментариев