Скачать презентацию Системное программирование Лекция 6 Команды передачи управления Скачать презентацию Системное программирование Лекция 6 Команды передачи управления

06_Команды передачи управления.ppt

  • Количество слайдов: 27

Системное программирование Лекция № 6 Команды передачи управления Системное программирование Лекция № 6 Команды передачи управления

Передача управления Решение о том, какая команда будет выполняться в программе следующей, может быть: Передача управления Решение о том, какая команда будет выполняться в программе следующей, может быть: безусловным – в данной точке необходимо передать управление не той команде, которая идет следующей, а другой, которая находится на некотором удалении от текущей команды; условным – решение о том, какая команда будет выполняться следующей, принимается на основе анализа некоторых условий или данных.

Команды передачи управления 1. Команды безусловной передачи управления: команда безусловного перехода; вызов процедуры и Команды передачи управления 1. Команды безусловной передачи управления: команда безусловного перехода; вызов процедуры и возврата из процедуры; вызов программных прерываний и возврат из программных прерываний; 2. Команды безусловной передачи управления: команды перехода по результату команды сравнения; команды перехода по состоянию определенного флага; команды перехода по содержимому регистра СХ. 3. Команды управления циклом: команда организации цикла со счетчиком СХ; команда организации цикла со счетчиком СХ с возможностью досрочного выхода из цикла по дополнительному условию.

Метки Место, куда необходимо передать управление, определяется меткой. Метка – это символическое имя, обозначающее Метки Место, куда необходимо передать управление, определяется меткой. Метка – это символическое имя, обозначающее определенную ячейку памяти, предназначенное для использования в качестве операнда в командах передачи управления. Транслятор ассемблера присваивает любой метке три атрибута: имя сегмента кода, где эта метка описана; смещение – расстояние в байтах от начала сегмента кода, в котором описана метка; тип метки, или атрибут расстояния.

Атрибут расстояния Может принимать два значения: NEAR – переход на эту метку возможен только Атрибут расстояния Может принимать два значения: NEAR – переход на эту метку возможен только в пределах сегмента кода, в котором описана метка. Физически это означает, что для перехода на метку достаточно изменить только содержимое регистра IP; FAR – переход на эту метку возможен только в результате межсегментной передачи управления, для осуществления которой требуется изменение содержимого как регистра IP, так и регистра CS.

Метки Метку можно определить двумя способами: оператором : (двоеточие); директивой LABEL. С помощью оператора Метки Метку можно определить двумя способами: оператором : (двоеточие); директивой LABEL. С помощью оператора можно определить метку только ближнего типа – NEAR. Символическое имя в программе может быть определено только один раз. Определенную таким образом метку можно использовать в качестве операнда в командах JCC, JMP, CALL. Эти команды должны быть в сегменте кода, где определена метка. Команда ассемблера может находиться как на одной строке с меткой, так и на следующей. Синтаксис директивы LABEL: символическое_имя LABEL тип метки Тип метки принимает значения NEAR или FAR.

Примеры создания меток Описания меток ближнего типа эквивалентны: m 1: MOV AX, pole_1 ; Примеры создания меток Описания меток ближнего типа эквивалентны: m 1: MOV AX, pole_1 ; и m 1 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

Примеры создания меток … mas_b LABEL BYTE mas_w DW 15 DUP (0) … ; Примеры создания меток … mas_b LABEL BYTE mas_w DW 15 DUP (0) … ; в этом фрагменте оба идентификатора относятся ; к одной области памяти ; и дают возможность работать с ней, используя ; разные имена, либо как с ; байтовым массивом, либо как с массивом слов … MOV mas_b+10, AL ; запись из AL в массив байтов ; (в 11 -й байт) … MOV mas_w, AX ; запись из AХ в первое слово ; области mas_w ; …

Счетчик адреса команд – это смещение конкретной команды относительно начала сегмента кода. Т. о. Счетчик адреса команд – это смещение конкретной команды относительно начала сегмента кода. Т. о. , каждая команда во время трансляции имеет адрес, равный значению счетчика адреса команд. Транслятор ассемблера обеспечивает две возможности работы с этим счетчиком: использование меток, атрибуту смещения которых транслятор присваивает значение счетчика адреса той команды, перед которой они появились; применение специального символа $ для обозначения счетчика адреса команд. Этот символ позволяет в любом месте программы использовать численное значение счетчика адреса. Str_mes DB 'Строка' Len_Msg = $ - Str_mes ; После ассемблирования Len_mes ; будет равно длине строки ORG выражение – задает значение счетчика адреса.

Безусловные переходы Что именно модифицирует команда перехода зависит: от типа операнда в команде безусловного Безусловные переходы Что именно модифицирует команда перехода зависит: от типа операнда в команде безусловного перехода (ближний или дальний); от указания перед адресом перехода (в команде перехода) модификатора; при этом сам адрес перехода может находиться либо непосредственно в команде (прямой переход), либо в регистре или ячейке памяти (косвенный переход). Модификатор может принимать следующие значения: NEAR PTR – прямой переход на метку внутри текущего сегмента кода. Модифицируется только регистр IP на основе указанных в команде адреса (метки) или выражения, использующего символ извлечения значения счетчика адреса команд - $. FAR PTR – прямой переход на метку в другом сегменте кода. Адрес перехода задается в виде непосредственного операнда или адреса (метки) и состоит из 16 -битного селектора и 16 -битного смещения, которые загружаются, соответственно, в регистры CS и IP. WORD PTR – косвенный переход на метку внутри текущего сегмента кода. Модифицируется (значением смещения из памяти, по указанному в команде адресу или из регистра) только IP. Размер смещения 16 бит. DWORD PTR - косвенный переход на метку в другом сегмента кода. Модифицируются (значением из памяти – и только из памяти, из регистра нельзя) оба регистра, CS и IP. Первое слово этого адреса представляет смещение и загружается в IP; второе загружается в CS.

Команда безусловного перехода JMP Синтаксис команды безусловного перехода: JMP [модификатор] адрес_перехода – безусловный переход Команда безусловного перехода JMP Синтаксис команды безусловного перехода: JMP [модификатор] адрес_перехода – безусловный переход без сохранения информации о точке возврата. Адрес_перехода представляет собой адрес в виде метки либо адрес области памяти, в котором находится указатель перехода. Внутрисегментный переход предполагает, что изменяется только содержимое регистра IP. Три варианта внутрисегментного использования команды JMP: прямой короткий (расстояние от команды JMP до адреса_перехода не более чем – 128 или +127 байтов); прямой (позволяет производить переходы в пределах 64 Кбайт относительно следующей за JMP команды); косвенный.

Команда безусловного перехода JMP SHORT PTR m 1 …; не более 35 -40 команд Команда безусловного перехода JMP SHORT PTR m 1 …; не более 35 -40 команд (127 байтов) m 1: или m 1: …; не более 35 -40 команд (-128 байтов) JMP m 1 _____________ LEA BX, m 1 JMP BX ; адрес перехода в регистре ВХ … m 1: _____________ Сегмент данных: Addr_m 1 DW m 1 … Сегмент кода: … JMP addr_m 1 ; адрес перехода к ячейке памяти addr_m 1 … m 1:

Команда безусловного перехода JMP Переходы на разные метки (в зависимости от содержимого SI) Сегмент Команда безусловного перехода JMP Переходы на разные метки (в зависимости от содержимого SI) Сегмент данных: addr DW m 1 DW m 2 Сегмент кода: cycl: MOV SI, 0 JMP addr[SI] ; адрес перехода в слове памяти addr+(SI) … MOV SI, 2 JMP cycl m 1: … m 2: ___________ Сегмент данных: addr DW m 1 Сегмент кода: LEASI, addr JMP NEAR PTR[SI] ; адрес перехода в ячейке памяти addr … ; модификатор NEAR PTR обязателен! m 1:

Команда безусловного перехода JMP Межсегментные переходы SEG_1 SEGMENT JMP FAR PTR m 2 ; Команда безусловного перехода JMP Межсегментные переходы SEG_1 SEGMENT JMP FAR PTR m 2 ; здесь FAR обязательно m 1 LABEL FAR SEG_1 ENDS SEG_2 SEGMENT m 2 LABEL FAR ; здесь FAR обязательно JMP m 1 ____________ DATA SEGMENT addr_m 1 DD m 1 ; в поле addr_m 1 значение смещения и ; адреса сегмента метки m 1 DATA ENDS CODE_1 SEGMENT JMP m 1 CODE_1 ENDS CODE_2 SEGMENT m 1 LABEL FAR MOV AX, BX CODE_2 ENDS

Команда безусловного перехода JMP Косвенный регистровый межсегментный переход DATA SEGMENT addr_m 1 DD m Команда безусловного перехода JMP Косвенный регистровый межсегментный переход DATA SEGMENT addr_m 1 DD m 1 ; в поле addr_m 1 значение смещения и ; адреса сегмента метки m 1 DATA ENDS CODE_1 SEGMENT … LEABX, addr_m 1 JMP DWORD PTR [BX] … CODE_1 ENDS CODE_2 SEGMENT … m 1 LABEL FAR MOV AX, BX … CODE_2 ENDS

Процедуры Команды, осуществляющие работу с контекстом: CALL [модификатор] имя_процедуры – вызов процедуры (подпрограммы). Команда Процедуры Команды, осуществляющие работу с контекстом: CALL [модификатор] имя_процедуры – вызов процедуры (подпрограммы). Команда CALL, подобно JMP, передает управление по адресу с символическим именем имя_процедуры. При этом процессор загружает в стек текущее значение регистра IP, если процедура имеет параметр NEAR, или значение CS, а потом значение IP, еслм процедура имеет параметр FAR. После этого процессор загружает регистр IP (для NEAR) или пару регистров CS: IP (для FAR) адресом начала подпрограммы и выполняет команды процедуры до того момента, пока не встретит команду RET. Адрес возврата – это адрес команды, следующей после команды CALL. RET [число] – возвратить управление вызывающей программе. Команда RET считывает адрес возврата из стека и загружает его в регистр CS и IP, тем самым возвращая управление на команду, следующую за командой CALL. [число] – необязательный параметр, обозначающий количество элементов, удаляемых из стека при возврате процедуры.

Процедуры Процедуру с атрибутом NEAR можно вызвать косвенно, используя переменную размером в слово: CALL Процедуры Процедуру с атрибутом NEAR можно вызвать косвенно, используя переменную размером в слово: CALL WORD PTR [BX][SI] 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 близкая_метка Х – модификатор, состоящий из одной, двух или трех букв. Запись операнда близкая_метка подчеркивает, что метка перехода должна находиться только в пределах текущего сегмента кода; межсегментной передачи управления в условных переходах не допускается.

Команда сравнения CMP Подобно команде SUB команда СМР вычитает операнд-источник из операнда-приемника и в Команда сравнения CMP Подобно команде SUB команда СМР вычитает операнд-источник из операнда-приемника и в зависимости от результата устанавливает или обнуляет флаги. В отличие от команды SUB команда СМР не сохраняет результат вычитания. Условие OF SF ZF CF Операнды без знака Источник < приемник x x 0 0 Источник = приемник x x 1 0 Источник > приемник x x 0 1 Операнды со знаком Источник < приемник 0/1 0 0 x Источник = приемник 0 0 1 x Источник > приемник 0/1 1 0 x

Перечень команд условного перехода для команды СМР оп_1 оп_2 Типы операндов Мнемокод команды условного Перечень команд условного перехода для команды СМР оп_1 оп_2 Типы операндов Мнемокод команды условного перехода Любые JE Любые JNE Критерий условного перехода Значения флагов для осуществления перехода оп_1 = оп_2 ZF=1 оп_1 <> оп_2 ZF=0 Со знаком JL/JNGE оп_1 < оп_2 SF<>OF Со знаком JLE/JNG оп_1 <= оп_2 SF<>OF or ZF=1 Со знаком JG/JNLE оп_1 > оп_2 SF=OF and ZF=0 Со знаком JGE/JNL оп_1 >= оп_2 SF=OF Без знака JB/JNAE оп_1 < оп_2 CF=1 Без знака JBE/JNA оп_1 <= оп_2 CF=1 or ZF=1 Без знака JA/JNBE оп_1 > оп_2 CF=0 and ZF=0 Без знака JAE/JNB оп_1 >= оп_2 CF=0

Базово-индексная адресация со смещением Программа, которая обнуляет поле pole_m длиной n байт. DATA n Базово-индексная адресация со смещением Программа, которая обнуляет поле pole_m длиной n байт. DATA n EQU 50 pole_m DB n DUP(? ). CODE XOR BX, BX M 1: MOV pole_m[BX], 0 INCBX CMP BX, n JNE m 1 Exit: ________. DATA mas DB DUP (? ). CODE … CMP mas[SI], 5 ; сравнить очередной элемент массива с 5 JE eql ; переход, если элемент mas равен 5 JL low ; переход, если элемент mas меньше 5 JG grt ; переход, если элемент mas больше 5

Команды условного перехода и флаги Название флага Номер бита в FLAGS Команда условного перехода Команды условного перехода и флаги Название флага Номер бита в FLAGS Команда условного перехода Значения флагa для осуществления перехода Флаг переноса CF 1 JC CF=1 Флаг четности PF 2 JP PF=1 Флаг нуля ZF 6 JZ ZF=1 Флаг знака SF 7 JS SF=1 Флаг переполнения OF 11 JO OF=1 Флаг переноса CF 1 JNC CF=0 Флаг четности PF 2 JNP PF=0 Флаг нуля ZF 6 JNZ ZF=0 Флаг знака SF 7 JNS SF=0 Флаг переполнения OF 11 JNO OF=0

Команды условного перехода и регистр СХ Архитектура МП предполагает специфическое использование многих регистров. Регистр Команды условного перехода и регистр СХ Архитектура МП предполагает специфическое использование многих регистров. Регистр СХ также имеет определенное функциональное назначение – он выполняет роль счетчика в командах управления циклами и при работе с цепочками символов. Синтаксис этой команды условного перехода: JCXZ метка_перехода – переход, если СХ=0; Эту команду очень удобно использовать при организации цикла и при работе с цепочками символов. Нужно отметить ограничение, свойственное команде JCXZ. В отличие от других команд условной передачи управления, команда JCXZ может адресовать только короткие переходы – на – 128 байт или на +127 байт от следующей за ней командой.

Организация циклов В МП существует три команды для управления циклом: LOOP метка_перехода – повторить Организация циклов В МП существует три команды для управления циклом: LOOP метка_перехода – повторить цикл. Команда выполняет следующие действия: декремент регистра СХ; сравнение регистра СХ с нулем: если СХ > 0, то управление передается на метку перехода; если СХ = 0, то управление передается на следующую после LOOP команду. LOOPE/ LOOPZ метка_перехода – повторить цикл пока СХ <> 0 или ZF=0. Команда выполняет следующие действия: декремент регистра СХ; сравнение регистра СХ с нулем; анализ состояния флага нуля ZF: если СХ > 0 и ZF=1, управление передается на метку перехода; если СХ = 0 или ZF=0, управление передается на следующую после LOOP команду.

Организация циклов LOOPNE/LOOPNZ метка_перехода – повторить цикл пока СХ <> 0 или ZF=1. Команда Организация циклов LOOPNE/LOOPNZ метка_перехода – повторить цикл пока СХ <> 0 или ZF=1. Команда выполняет следующие действия: декремент регистра СХ; сравнение регистра СХ с нулем; анализ состояния флага нуля ZF: если СХ > 0 и ZF=0, управление передается на метку перехода; если СХ = 0 или ZF=1, управление передается на следующую после LOOP команду. Недостаток команд организации цикла в том, что они реализуют только короткие переходы.

Команды управления флагами Команды STC (Se. T Carry flag – установить флаг переноса) и Команды управления флагами Команды STC (Se. T Carry flag – установить флаг переноса) и CLC (CLear Carry flag – обнулить флаг переноса) переводят флаг CF в состояние 0 или 1 соответственно. Команда CMC (Complement Carry flag – обратить флаг переноса) переводит флаг CF в состояние 0, если он имел состояние 1, и наоборот. Команды STD (Se. T Direction flag – установить флаг направления) и CLD (CLear Direction flag – обнулить флаг направления) переводят флаг CF в состояние 0 или 1 соответственно. Команда CLI (clear interrupt flag – обнулить флаг прерываний) обнуляет флаг IF, что заставляет МП игнорировать маскируемые прерывания, инициируемые внешними устройствами системы. Команда SТI (set interrupt flag – установить флаг прерываний) переводит флаг IF в состояние 1, что разрешает МП реагировать на прерывания, инициируемые внешними устройствами системы.

Команды внешней синхронизации Команда HLT (halt - остановиться) переводит МП в состояние останова, при Команды внешней синхронизации Команда HLT (halt - остановиться) переводит МП в состояние останова, при котором он находится на холостом ходу и не выполняет никакие команды. Микропроцессор выходит из состояния останова только в том случае, если его заново инициировать или он получил внешнее прерывание, немаскируемое или маскируемое (если флаг IF=1). Команда WAIT (wait – ожидать) также переводит МП на холостой ход, но при этом через каждые пять тактов он проверяет активность входной линии по имени TEST. Команда ESC (escape - убежать) заставляет МП извлечь содержимое указанного в ней операнда и передать его на шину данных. Формат команды: ESC внешний_код, источник где внешний_код – 6 -битовый непосредственный операнд, а источник – регистр или переменная. Команда ESC часто используется для передачи команд математическому сопроцессору. Команда NOP (no operation – нет операции) не выполняет никакой операции, а только увеличивает значение указателя команд IP.