Слайд 1Системное программирование
Лекция №6
Команды передачи управления
Слайд 2Передача управления
Решение о том, какая команда будет выполняться в программе
следующей, может быть:
безусловным – в данной точке необходимо передать управление
не той команде, которая идет следующей, а другой, которая находится на некотором удалении от текущей команды;
условным – решение о том, какая команда будет выполняться следующей, принимается на основе анализа некоторых условий или данных.
Слайд 3Команды передачи управления
1. Команды безусловной передачи управления:
команда безусловного перехода;
вызов процедуры
и возврата из процедуры;
вызов программных прерываний и возврат из программных
прерываний;
2. Команды безусловной передачи управления:
команды перехода по результату команды сравнения;
команды перехода по состоянию определенного флага;
команды перехода по содержимому регистра СХ.
3. Команды управления циклом:
команда организации цикла со счетчиком СХ;
команда организации цикла со счетчиком СХ с возможностью досрочного выхода из цикла по дополнительному условию.
Слайд 4Метки
Место, куда необходимо передать управление, определяется меткой. Метка – это
символическое имя, обозначающее определенную ячейку памяти, предназначенное для использования в
качестве операнда в командах передачи управления. Транслятор ассемблера присваивает любой метке три атрибута:
имя сегмента кода, где эта метка описана;
смещение – расстояние в байтах от начала сегмента кода, в котором описана метка;
тип метки, или атрибут расстояния.
Слайд 5Атрибут расстояния
Может принимать два значения:
NEAR – переход на эту
метку возможен только в пределах сегмента кода, в котором описана
метка. Физически это означает, что для перехода на метку достаточно изменить только содержимое регистра IP;
FAR – переход на эту метку возможен только в результате межсегментной передачи управления, для осуществления которой требуется изменение содержимого как регистра IP, так и регистра CS.
Слайд 6Метки
Метку можно определить двумя способами:
оператором : (двоеточие);
директивой LABEL.
С помощью оператора
можно определить метку только ближнего типа – NEAR. Символическое имя
в программе может быть определено только один раз. Определенную таким образом метку можно использовать в качестве операнда в командах JCC, JMP, CALL. Эти команды должны быть в сегменте кода, где определена метка. Команда ассемблера может находиться как на одной строке с меткой, так и на следующей.
Синтаксис директивы LABEL:
символическое_имя LABEL тип метки
Тип метки принимает значения NEAR или FAR.
Слайд 7Примеры создания меток
Описания меток ближнего типа эквивалентны:
m1:
MOV AX,pole_1 ;
и
m1 LABEL NEAR
MOV AX,pole_1
При необходимости использовать
для одной и той же команды метку и дальнего, и
ближнего типов:
;…
PUBLIC m_far ;сделать метку m_far видимой
;для внешних программ
…
m_far LABEL FAR ;определение метки дальнего типа m_far
m_near: ; определение метки ближнего типа m_near
MOV AX,pole_1
Слайд 8Примеры создания меток
…
mas_b LABEL BYTE
mas_w DW 15 DUP (0)
…
;в этом фрагменте оба идентификатора
относятся
;к одной области памяти
;и дают возможность работать с ней,
используя
;разные имена, либо как с
;байтовым массивом, либо как с массивом слов
…
MOV mas_b+10,AL ;запись из AL в массив байтов
;(в 11-й байт)
…
MOV mas_w,AX ; запись из AХ в первое слово
;области mas_w
;
…
Слайд 9Счетчик адреса команд
Счетчик адреса команд – это смещение конкретной команды
относительно начала сегмента кода. Т.о., каждая команда во время трансляции
имеет адрес, равный значению счетчика адреса команд. Транслятор ассемблера обеспечивает две возможности работы с этим счетчиком:
использование меток, атрибуту смещения которых транслятор присваивает значение счетчика адреса той команды, перед которой они появились;
применение специального символа $ для обозначения счетчика адреса команд. Этот символ позволяет в любом месте программы использовать численное значение счетчика адреса.
Str_mes DB 'Строка'
Len_Msg = $ - Str_mes ;После ассемблирования Len_mes ;будет равно длине строки
ORG выражение – задает значение счетчика адреса.
Слайд 10Безусловные переходы
Что именно модифицирует команда перехода зависит:
от типа операнда в
команде безусловного перехода (ближний или дальний);
от указания перед адресом перехода
(в команде перехода) модификатора; при этом сам адрес перехода может находиться либо непосредственно в команде (прямой переход), либо в регистре или ячейке памяти (косвенный переход). Модификатор может принимать следующие значения:
NEAR PTR – прямой переход на метку внутри текущего сегмента кода. Модифицируется только регистр IP на основе указанных в команде адреса (метки) или выражения, использующего символ извлечения значения счетчика адреса команд - $.
FAR PTR – прямой переход на метку в другом сегменте кода. Адрес перехода задается в виде непосредственного операнда или адреса (метки) и состоит из 16-битного селектора и 16-битного смещения, которые загружаются, соответственно, в регистры CS и IP.
WORD PTR – косвенный переход на метку внутри текущего сегмента кода. Модифицируется (значением смещения из памяти, по указанному в команде адресу или из регистра) только IP. Размер смещения 16 бит.
DWORD PTR - косвенный переход на метку в другом сегмента кода. Модифицируются (значением из памяти – и только из памяти, из регистра нельзя) оба регистра, CS и IP. Первое слово этого адреса представляет смещение и загружается в IP; второе загружается в CS.
Слайд 11Команда безусловного перехода JMP
Синтаксис команды безусловного перехода:
JMP [модификатор] адрес_перехода –
безусловный переход без сохранения информации о точке возврата. Адрес_перехода представляет
собой адрес в виде метки либо адрес области памяти, в котором находится указатель перехода.
Внутрисегментный переход предполагает, что изменяется только содержимое регистра IP. Три варианта внутрисегментного использования команды JMP:
прямой короткий (расстояние от команды JMP до адреса_перехода не более чем –128 или +127 байтов);
прямой (позволяет производить переходы в пределах 64 Кбайт относительно следующей за JMP команды);
косвенный.
Слайд 12Команда безусловного перехода JMP
JMP SHORT PTR m1
…;не более 35-40 команд (127
байтов)
m1:
или
m1:
…;не более 35-40 команд (-128 байтов)
JMP m1
__________________________
LEA BX,m1
JMP BX ;адрес перехода в регистре ВХ
…
m1:
__________________________
Сегмент
данных:
Addr_m1 DW m1
…
Сегмент кода:
…
JMP addr_m1 ;адрес перехода к ячейке памяти addr_m1
…
m1:
Слайд 13Команда безусловного перехода JMP
Переходы на разные метки (в зависимости от
содержимого SI)
Сегмент данных:
addr DW m1
DW m2
Сегмент кода:
cycl:
MOV SI,0
JMP addr[SI] ;адрес перехода в слове памяти addr+(SI)
…
MOV SI,2
JMP cycl
m1:
…
m2:
______________________
Сегмент данных:
addr DW m1
Сегмент
кода:
LEA SI,addr
JMP NEAR PTR[SI] ;адрес перехода в ячейке памяти addr
… ;модификатор NEAR PTR обязателен!
m1:
Слайд 14Команда безусловного перехода JMP
Межсегментные переходы
SEG_1 SEGMENT
JMP FAR PTR m2 ;здесь FAR
обязательно
m1 LABEL FAR
SEG_1 ENDS
SEG_2 SEGMENT
m2 LABEL FAR ;здесь FAR обязательно
JMP m1
________________________
DATA SEGMENT
addr_m1 DD m1 ;в поле addr_m1 значение смещения и
;адреса сегмента
метки m1
DATA ENDS
CODE_1 SEGMENT
JMP m1
CODE_1 ENDS
CODE_2 SEGMENT
m1 LABEL FAR
MOV AX,BX
CODE_2 ENDS
Слайд 15Команда безусловного перехода JMP
Косвенный регистровый межсегментный переход
DATA SEGMENT
addr_m1 DD m1 ;в поле addr_m1 значение
смещения и
;адреса сегмента метки m1
DATA ENDS
CODE_1 SEGMENT
…
LEA BX,addr_m1
JMP DWORD PTR [BX]
…
CODE_1 ENDS
CODE_2 SEGMENT
…
m1 LABEL FAR
MOV AX,BX
…
CODE_2 ENDS
Слайд 16Процедуры
Команды, осуществляющие работу с контекстом:
CALL [модификатор] имя_процедуры – вызов процедуры
(подпрограммы). Команда CALL, подобно JMP, передает управление по адресу с
символическим именем имя_процедуры. При этом процессор загружает в стек текущее значение регистра IP, если процедура имеет параметр NEAR, или значение CS, а потом значение IP, еслм процедура имеет параметр FAR. После этого процессор загружает регистр IP (для NEAR) или пару регистров CS:IP (для FAR) адресом начала подпрограммы и выполняет команды процедуры до того момента, пока не встретит команду RET. Адрес возврата – это адрес команды, следующей после команды CALL.
RET [число] – возвратить управление вызывающей программе. Команда RET считывает адрес возврата из стека и загружает его в регистр CS и IP, тем самым возвращая управление на команду, следующую за командой CALL. [число] – необязательный параметр, обозначающий количество элементов, удаляемых из стека при возврате процедуры.
Слайд 17Процедуры
Процедуру с атрибутом NEAR можно вызвать косвенно, используя переменную размером
в слово:
CALL WORD PTR [BX]
CALL WORD PTR [BX][SI]
CALL WORD PTR variabl_name
CALL WORD PTR variabl_name[BX]
CALL MEM_WORD
CALL WORD
PTR ES:[BX] [SI]
Процедуру с атрибутом FAR можно вызвать косвенно, используя переменную размером в двойное слово:
CALL DWORD PTR [BX]
CALL MEM_DWORD
CALL WORD PTR SS: variabl_name [SI]
Слайд 18Условные переходы
МП имеет 18 команд условного перехода, позволяющие проверить:
отношение между
операндами со знаком («больше-меньше»);
отношение между операндами без знака («выше-ниже»);
состояниями арифметических
флагов ZF,SF,CF,OF,PF (но не AF).
Источниками такого условия могут быть:
любая команда, изменяющая состояние арифметических флагов;
команда сравнения CMP, сравнивающая значение двух операндов;
состояние регистра СХ.
Синтаксис:
JX близкая_метка
Х – модификатор, состоящий из одной, двух или трех букв. Запись операнда близкая_метка подчеркивает, что метка перехода должна находиться только в пределах текущего сегмента кода; межсегментной передачи управления в условных переходах не допускается.
Слайд 19Команда сравнения CMP
Подобно команде SUB команда СМР вычитает операнд-источник из
операнда-приемника и в зависимости от результата устанавливает или обнуляет флаги.
В отличие от команды SUB команда СМР не сохраняет результат вычитания.
Слайд 20Перечень команд условного перехода
для команды СМР оп_1 оп_2
Слайд 21Базово-индексная адресация со смещением
Программа, которая обнуляет поле pole_m длиной n
байт
.DATA
n EQU 50
pole_m DB n DUP(?)
.CODE
XOR BX,BX
M1: MOV pole_m[BX],0
INC BX
CMP BX,n
JNE m1
Exit:
_______________
.DATA
mas DB DUP (?)
.CODE
…
CMP mas[SI],5 ;сравнить очередной элемент массива с 5
JE eql ;переход, если элемент
mas равен 5
JL low ; переход, если элемент mas меньше 5
JG grt ; переход, если элемент mas больше 5
Слайд 22Команды условного перехода и флаги
Слайд 23Команды условного перехода и регистр СХ
Архитектура МП предполагает специфическое использование
многих регистров. Регистр СХ также имеет определенное функциональное назначение –
он выполняет роль счетчика в командах управления циклами и при работе с цепочками символов.
Синтаксис этой команды условного перехода:
JCXZ метка_перехода – переход, если СХ=0;
Эту команду очень удобно использовать при организации цикла и при работе с цепочками символов. Нужно отметить ограничение, свойственное команде JCXZ. В отличие от других команд условной передачи управления, команда JCXZ может адресовать только короткие переходы – на –128 байт или на +127 байт от следующей за ней командой.
Слайд 24Организация циклов
В МП существует три команды для управления циклом:
LOOP метка_перехода –
повторить цикл.
Команда выполняет следующие действия:
декремент регистра СХ;
сравнение регистра СХ с
нулем:
если СХ > 0, то управление передается на метку перехода;
если СХ = 0, то управление передается на следующую после LOOP команду.
LOOPE/ LOOPZ метка_перехода – повторить цикл пока СХ <> 0 или ZF=0.
Команда выполняет следующие действия:
декремент регистра СХ;
сравнение регистра СХ с нулем;
анализ состояния флага нуля ZF:
если СХ > 0 и ZF=1, управление передается на метку перехода;
если СХ = 0 или ZF=0, управление передается на следующую после LOOP команду.
Слайд 25Организация циклов
LOOPNE/LOOPNZ метка_перехода – повторить цикл пока СХ 0 или
ZF=1.
Команда выполняет следующие действия:
декремент регистра СХ;
сравнение регистра СХ с нулем;
анализ
состояния флага нуля ZF:
если СХ > 0 и ZF=0, управление передается на метку перехода;
если СХ = 0 или ZF=1, управление передается на следующую после LOOP команду.
Недостаток команд организации цикла в том, что они реализуют только короткие переходы.
Слайд 26Команды управления флагами
Команды STC (SeT Carry flag – установить флаг
переноса) и CLC (CLear Carry flag – обнулить флаг переноса)
переводят флаг CF в состояние 0 или 1 соответственно. Команда CMC (Complement Carry flag – обратить флаг переноса) переводит флаг CF в состояние 0, если он имел состояние 1, и наоборот.
Команды STD (SeT Direction flag – установить флаг направления) и CLD (CLear Direction flag – обнулить флаг направления) переводят флаг CF в состояние 0 или 1 соответственно.
Команда CLI (clear interrupt flag – обнулить флаг прерываний) обнуляет флаг IF, что заставляет МП игнорировать маскируемые прерывания, инициируемые внешними устройствами системы. Команда SТI (set interrupt flag – установить флаг прерываний) переводит флаг IF в состояние 1, что разрешает МП реагировать на прерывания, инициируемые внешними устройствами системы.
Слайд 27Команды внешней синхронизации
Команда HLT (halt - остановиться) переводит МП в
состояние останова, при котором он находится на холостом ходу и
не выполняет никакие команды. Микропроцессор выходит из состояния останова только в том случае, если его заново инициировать или он получил внешнее прерывание, немаскируемое или маскируемое (если флаг IF=1).
Команда WAIT (wait – ожидать) также переводит МП на холостой ход, но при этом через каждые пять тактов он проверяет активность входной линии по имени TEST.
Команда ESC (escape - убежать) заставляет МП извлечь содержимое указанного в ней операнда и передать его на шину данных. Формат команды:
ESC внешний_код, источник
где внешний_код – 6-битовый непосредственный операнд, а источник – регистр или переменная. Команда ESC часто используется для передачи команд математическому сопроцессору.
Команда NOP (no operation – нет операции) не выполняет никакой операции, а только увеличивает значение указателя команд IP.