- •3.Программирование на языке ассемблера
- •3.1. Архитектура микропроцессоров k1810вм86/k1810вм88
- •3.2. Основные элементы ассемблера. Формат программной строки
- •3.3. Директивы управления сегментами
- •3.4. Типовая структура текста программы
- •3.5. Символические имена
- •3.6. Константы. Их типы и директивы описания
- •3.6.1. Числовые константы
- •3.6.2. Символьные константы
- •3.6.3. Поименованные константы
- •3.6.4. Константы-выражения
- •3.7. Переменные. Их типы и директивы описания
- •3.7.1. Стандартные типы данных и их размещение в памяти
- •3.7.2. Директивы описания переменных и распределения памяти
- •3.8. Атрибуты переменных и меток. Директивы, возвращающие атрибутные значения
- •3.8.1. Атрибуты переменных
- •3.8.2. Атрибуты меток
- •3.9. Замена атрибутов переменных и меток
- •3.9.1. Замена смещения
- •3.9.2. Замена сегмента
- •3.9.3. Замена типа
- •3.10. Способы адресации операндов
- •3.10.1. Адресация данных
- •Регистровая адресация
- •Непосредственная адресация
- •Прямая адресация
- •Косвенная регистровая адресация
- •Базовая адресация
- •Индексная адресация
- •Базово-индексная адресация
- •Относительная базовоиндексная адресация
- •3.10.2. Адресация переходов
- •Внутрисегментный прямой переход
- •Внутрисегментный косвенный переход
- •Межсегментный прямой переход
- •Межсегментный косвенный переход
- •3.11. Система команд
3.10.2. Адресация переходов
Способ адресации перехода определяет адрес, по которому передается управление командой перехода. Для задания адреса перехода могут использоваться все те же способы адресации, что и для данных. При этом возможно выполнение четырех различных типов переходов.
Внутрисегментный прямой переход
В этом случае операнд записывается прямо в команде перехода в виде имени метки LabelNear, находящейся в том же сегменте программного кода, что и эта команда.
При трансляции команды вычисляется смещение disp=offset LabelNear(IP) и включается в ее машинный код. Смещение disp может иметь 8-битное или 16-битное значение.
При выполнении такой команды вычисляется эффективный адрес перехода EA=(IP)+disp и заносится в регистр IP. При этом управление может передаваться в пределах всего сегмента программного кода. Такой переход называется ближним переходом или переходом типа NEAR.
Пример 3.39:
JMP Begin ; Ближний переход на метку Begin
JMP Buffer+10 ; Ближний переход на ячейку, отстоящую
; от метки Buffer на 10 байтов
Внутрисегментную прямую адресацию часто называют относительной адресацией, так как смещение disp вычисляется относительно (IP).
Внутрисегментный косвенный переход
Источником косвенного адреса перехода в этом случае может быть любой 16-битный регистр или слово в памяти, адресуемое любым способом. Операнд команды перехода записывается в соответствии с используемым способом адресации данных.
Пример 3.40:
JMP AX ;Ближний переход по адресу из AX
JMP Alpha ;Ближний переход по адресу из
;ячейки Alpha (если Alpha DW?)
JMP WORD PTR[SI] ;Ближний переход по адресу из
;ячейки, адресуемой SI
При выполнении этих команд содержимое IP заменяется содержимым указанного операнда, что и соответствует ближнему переходу.
Межсегментный прямой переход
В этом случае операнд записывается прямо в команде перехода в виде имени метки LabelFar, находящейся в другом сегменте программного кода по отношению к этой команде. Для устранения проблем, связанных с обращением вперед, в команде необходимо явно указывать тип перехода с помощью директивы PTR.
При трансляции такой команды в ее машинный код включается полный логический адрес точки назначения в формате segment:offset. При выполнении команды значение segment помещается в CS, а offsetв IP, что и соответствует передаче управления в другой сегмент программного кода.
Такой переход называется дальним переходом или переходом типа FAR.
Пример3.41:
JMP FARPTRCont ;Дальний переход на метку Cont
Межсегментный косвенный переход
Источником косвенного адреса перехода в этом случае служит двойное слово в памяти, адресуемое любым способом. Операнд команды перехода записывается в соответствии с используемым способом адресации данных.
Пример 3.42:
JMP Beta ; Дальний переход по адресу из
; ячейки Beta (если BetaDD?)
JMP DWORDPTR[BX] ; Дальний переход по адресу
; из ячейки, адресуемой BX
При выполнении этих команд младшее слово указанного двойного слова помещается в IP, а старшее в CS, что и соответствует дальнему переходу.