Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

гос / sp-lect (1)

.pdf
Скачиваний:
18
Добавлен:
16.02.2016
Размер:
2.59 Mб
Скачать

Команди передачі керування

Команди безумовної

Команди умовної

Команди управління циклом

передачі керування

передачі керування

 

Команда безумовного

 

Команда циклу з лічильником

Команди

в регістрі ECX|RCX LOOP

переходу JMP

переходу за

 

 

Команда циклу з лічильником

 

станом окремих

 

в регистрі ECX|RCX і з

Команди виклику

бітів RFLAGS

можливісттю завершенням

процедур і повернення

 

 

цикла за додатковою умовою

з процедур CALL і RET

Команди

LOOPE, LOOPZ, LOOPNE,

 

 

переходу за

 

LOOPNZ

Команди виклику

результатами

 

переривань і повернення

команди

Команди переходу за станом

з обробника переривань

порівняння

регістру ECX|RCX

INT, INTO, IRET

CMP

JECXZ|JRCXZ

Рисунок 3.16

У якості операндів команд передавання управління, тобто для позначення

впрограмі місця, в яке буде виконано передавання управління, найчастіше (але не обовязково) використовуються мітки. Мітку можна визначити:

1.Оператором :” ( двокрапка)

2.Директивою LABEL

Синтаксис:

<ім'я>: <команда 1>

<ім'я> LABEL [Атрибут відстані]

………………

<команда 1>

<команда N>

………………

 

<команда N>

[Атрибут відстані] визначеної в сегменті коду мітки може приймати 2 значення – NEAR або FAR.

NEAR – ближній перехід, що призводить до модифікації значення лише регістру RIP. Різновидом ближнього переходу є SHORT-перехід, який припускає модифікацію поточного значення регістру RIP на значення від -128 до +127. FAR – дальній перехід, що призводить до модифікації значень пари регістрів CS і EIP.

Асемблер MASM припускає використання локальних (безіменних) міток @@:, кількість яких може бути довільна. Для посилання на такі мітки в командах використовуються позначення @F/@B, що позначають уперед (@F –

forward) / назад (@B – back) на найближчу (безіменну) мітку @@: відносно команди в якій вони зустрічаються.

@@: <команда 1>

 

<команда 1>

@@: <команда 1>

 

 

 

………………

 

TPC @F

 

 

TPC @B

 

 

 

 

 

 

 

<команда N>

 

………………

 

@@: <команда K>

 

TPC @B

 

 

@@: <команда N>

 

TPC @B

 

 

 

 

 

 

 

 

 

 

 

 

 

<команда L>

 

 

 

 

 

 

 

TPC @B

 

 

 

 

 

 

 

 

 

 

Де TPC позначає узагальнене мнемонічне позначення будь якої з команд передачі керування.

3.5.1.5.1Команди безумовної передачі керування

Зцієї групи команд зараз ми розглянемо тільки команди JMP, CALL і

RET.

Мнемоніка

JMP операнд

 

 

Призначення

Перехід на виконання команди, адреса якої визначається

 

операндом, без збереження інформації для повернення

 

 

Алгоритм

В загальному випадку залежить від типу переходу. Зокрема при

 

виконанні NEAR– переходу команда завантажує в EIP|RIP

 

значення, що визначається її операндом.

 

 

Операнд

rel8, rel16, rel32, r16, r32, r64, m16, m32, m64, ptr16:16, ptr16:32,

 

m16:32, m16:64,

RFLAGS

не впливає окрім випадку перемикання задач

 

 

Приклад. Всі наведені нижче команди JMP виконують передавання керування в одне і те саме місце, демонструючи різні форми операнда команди

.data?

ma dd ?

.code

start: jmp m

jmp short m

lea eax,m

jmp eax

mov ma,eax jmp [ma] lea eax,ma

jmp dword ptr [eax] xor eax,eax

jmp ma[eax] jmp [eax+ma]

jmp [eax+eax*4+ma]

m:………………………

Мнемоніка

CALL операнд

 

 

Призначення

Виклик підпрограми.

 

 

Алгоритм

В загальному випадку залежить від типу виклику. Зокрема при

 

виконанні NEAR– виклику команда зберігає на верхівці стеку

 

подібно команді PUSH адресу наступної за нею команди і

 

змінює значення EIP|RIP на те, що визначається її операндом.

 

 

Операнд

rel16, rel32, r16, r32, r64, m16, m32, m64, ptr16:16, ptr16:32,

 

m16:16, m16:32, m16:64

RFLAGS

не впливає окрім випадку перемикання задач

 

 

Мнемоніка

RET [число]

 

 

Призначення

Повернення з підпрограми.

 

 

Алгоритм

В загальному випадку залежить від типу повернення. Зокрема

 

при виконанні NEAR– повернення команда зчитує з верхівки

 

стека подвійне|зчетверене слово (адресу повернення) в EIP|RIP

 

подібно команді POP. Якщо операнд присутній, то після

 

зчитування в EIP|RIP адреси повернення команда виконує

 

переміщення верхівки стеку ESP|RSP= ESP|RSP+число

 

 

Операнд

imm16

 

 

RFLAGS

не впливає окрім випадку перемикання задач

 

 

Приклад. Всі наведені нижче команди CALL виконують передавання керування в одне і те саме місце, демонструючи різні форми операнда команди.

.386

.model flat, stdcall option casemap :none

.data? ProcAddr dd ?

.code

start: call ProcName lea ebx,ProcName call ebx

mov ProcAddr,ebx call [ProcAddr] lea ebx,ProcAddr

call dword ptr [ebx] xor ebx,ebx

call ProcAddr[ebx] call [ebx+ProcAddr]

call [ebx+ebx*4+ProcAddr] push $+7

jmp ProcName ret

ProcName: xor eax,eax ret

end start

До практичного використання команд CALL/RET ми повернемося пізніше, при розгляді теми, присвяченої процедурному програмуванню.

3.5.1.5.2 Команди умовної передачі керування

Основною апаратною складовою, що забезпечує практичну реалізацію умовної передачі керування є регістр прапорців мікропроцесора. Значення прапорців регістра RFLAGS у кожен момент часу відображають стан самого мікропроцесора, і програми, що він виконує. Мікропроцесор «повідомляє» про результат виконання кожної команди установкою тих або інших прапорців.

При описі команд завжди відзначаються ті прапорці, які можуть бути змінені в результаті виконання команди, адже це надає можливість аналізувати стан програми, і втручатися в хід її виконання за допомогою команд умовної передачі керування.

Група команд умовної передачі керування налічує 28 різних мнемонічних позначень команд поєднаних загальним алгоритмом і спільним набором операндів. При описі команд цієї групи використовується узагальнене мнемонічне позначення Jcc, утворене додаванням до букви «J» (від Jump – стрибнути) мнемонічного позначенням умови «сс» при виконанні якої цей «стрибок» виконується.

Мнемоніка

Jcc операнд

 

 

Призначення

Аналіз під час виконання програми стану обчислювального

 

процесу на основі значень бітів регістра прапорців RFLAGS з

 

метою можливої зміни його подальшого шляху розвитку.

 

 

 

Алгоритм

1.

Перевірити умову, що визначається кодом операції

 

 

(мнемонічним позначенням умови сс”)

 

2.

Якщо умова виконується, то передати керування на

 

 

адресу, що визначається операндом команди Jсс

 

3.

Якщо умова не виконується, то передати керування

 

 

наступній за Jсс команді

 

 

Операнд

rel8, rel16, rel32 (rel16 не підтримуються в 64-бітному режимі)

 

 

RFLAGS

не впливає (можливе використання декількох команд Jсс одна за

 

іншою)

 

 

 

Умовою переходу завжди виступає певний стан тих або інших прапорців регістра RFLAGS, просто деякі з команд приймають рішення щодо виконання переходу, перевіряючи стан одного конкретного біта в RFLAGS, а інші виконують складні перевірки певного одночасного стану декількох прапорців RFLAGS. Розгляд групи команд умовної передачі керування почнемо з перших з них.

3.5.1.5.2.1 Команди переходу за станом окремих бітів RFLAGS

Мнемоніки команд передачі керування за станом окремих бітів RFLAGS виходять додаванням до букви «J» першої букви символічного імені прапорця RFLAGS при одиничному значенні якого здійснюється перехід. Якщо перехід необхідно виконати при нульовому значенні прапора, то до букви «J» додається

C (F)

 

 

P (F)

 

 

ще буква «N» (від Not - не): J (ump if ) [N(ot)] Z (F) .

S (F)

 

 

 

O (F)

 

 

Наступна таблиця містить усі мнемонічні позначення команд і умови, за яких вони виконують передачу керування

JC

JP

JZ

JS

JO

JNC

JNP

JNZ

JNS

JNO

 

 

 

 

 

 

 

 

 

 

CF=1

PF=1

ZF=1

SF=1

OF=1

CF=0

PF=0

ZF=0

SF=0

OF=0

 

 

 

 

 

 

 

 

 

 

3.5.1.5.2.2 Команди переходу за результатом команди порівняння

Рішення про передачу керування в програмі може прийматися на основі операцій порівняння виду «==», «!=», «<», «<=», «>», «>=» які є звичайними для мов програмування високого рівня.

В основу алгоритму порівняння, який можна реалізувати апаратними засобами покладене виконання операції вирахування. Якщо, наприклад, після виконання команди SUB EAX,EBX значення регістра EАХ виявиться нульовим, про що мікропроцесор відразу ж повідомить установкою в 1 прапорця ZF в RFLAGS, то очевидно, що до операції значення в регістрі EАХ дорівнювало значенню у регістрі EВХ.

Команда SUB руйнує значення операнда-приймача, що не зовсім зручно при програмуванні, і тому в системі команд мікропроцесора для виконання порівняння вирахуванням передбачена спеціальна команда CMP. Ця команда,

відрізняється від команди SUB тільки тим, що нікуди не розміщує результат вирахування, а тільки встановлює прапорці.

Аналізуючи стан прапорців регістра RFLAGS після вирахування різних за співвідношеннями операндів і з урахуванням їх знаків, можна прийти до висновку, що для кожного випадку є характерний і властивий тільки йому певний стан тих або інших прапорців. За результатами проведеного аналізу у систему команд включений набір команд передачі керування за результатами виконання команди порівняння вирахуванням. Це команди переходу за станом регістра RFLAGS, так би мовити, комплексної дії. Рішення про передачу керування приймається відповідно до стану одного або двох прапорців, характерних для результату виконання команди CMP при певнім співвідношенні її операндів і з урахуванням їх знаків.

Тип операндів в

Команда

Виконує перехід

Стан прапорців

команді CMP операнд1,

 

якщо

для виконання

операнд2

 

 

переходу

 

 

 

 

Зі знаком

JL/JNGE

операнд1< операнд2

SF<>OF

 

 

 

 

Зі знаком

JLE/JNG

операнд1<=операнд2

SF<>OF або ZF=1

 

 

 

 

Зі знаком

JG/JNLE

операнд1>операнд2

SF=OF і ZF=0

 

 

 

 

Зі знаком

JGE/JNL

операнд1>=операнд2

SF=OF

 

 

 

 

Без знаку

JB/JNAE

операнд1<операнд2

CF=1

 

 

 

 

Без знаку

JBE/JNA

операнд1<=операнд2

CF=1 або ZF=1

 

 

 

 

Без знаку

JA/JNBE

операнд1 > операнд2

CF=ZF=0

 

 

 

 

Без знаку

JAE/JNB

операнд1>=операнд2

CF=0

 

 

 

 

Будь-які

JE

операнд1 = операнд2

ZF=1

 

 

 

 

Будь-які

JNE

операнд1<>операнд2

ZF=0

 

 

 

 

Варіанти мнемонік команд Jcc легко запам'ятати за першими літерами

 

A (bove)

 

 

 

 

 

англійських слів

B (elow)

де Equal –

J (ump if ) [N(ot)]

[(or) E (qual)],

 

G (reat)

 

 

 

 

 

 

 

L (ess)

 

 

дорівнює, Below – нижче (менше) для без знакових, Above – вище (більше) для без знакових, Less – менше для знакових, Great – більше для знакових.

3.5.1.5.3Команди управління циклом

Взагальному випадку будь-який цикл можна організувати на основі попередньо розглянутих команд умовного передавання керування, однак у системі команд процесора є і спеціально передбачені для цього команди:

Мнемоніка

LOOP мітка

 

 

 

 

 

Призначення

Організація циклу з лічильником у регістрі ECX|RCX.

 

 

 

Алгоритм

Зменшити на 1 значення ECX|RCX. Якщо ECX|RCX не дорівнює

 

нулю, то перейти на команду, позначену міткою, інакше на

 

наступну за LOOP команду. Зміщення до мітки повинно бути в

 

діапазоні -128…+127 байтів.

 

 

 

 

 

Операнд

rel8

 

 

 

 

 

 

RFLAGS

не впливає

 

 

 

 

 

Мнемоніка

LOOPE|LOOPNE мітка

 

 

 

Призначення

Організація циклу з лічильником у регістрі ECX|RCX і

 

додатковою умовою

 

 

 

Алгоритм

Зменшити на 1 значення ECX|RCX. Якщо ECX|RCX не дорівнює

 

1 для LOOPE

позначену

 

нулю і ZF =

, то перейти на команду,

 

0

для LOOPNE

 

 

міткою, інакше на наступну за LOOPE|LOOPNE команду.

 

Зміщення до мітки повинно бути в діапазоні -128…+127

байтів.

 

 

 

 

Операнд

rel8

 

 

 

 

 

 

RFLAGS

не впливає

 

 

 

 

 

 

Як правило команда LOOP використовується за наступною схемою:

mov ecx, <кількість повторень циклу> <мітка циклу>: ; . . . . . . . . . . .

;тіло циклу

;. . . . . . . . . . .

loop <мітка циклу>

LOOP може виконувати тільки короткий (short) перехід, тобто розмір машинного коду команд тіла циклу, розташованих поміж командою LOOP і міткою-операндом не повинен перевищувати 128 байт. Таке обмеження можна обійти замінивши команду LOOP еквівалентною послідовністю

mov ecx, <кількість повторень циклу> <мітка циклу>: ; . . . . . . . . . . .

;тіло циклу

;. . . . . . . . . . .

dec ecx

jnz <мітка циклу>

3.5.1.6Команди обробки ланцюжків

Ланцюжок являє собою розміщену в памяті неперервну послідовність елементів однакової довжини байтів, слів, подвійних або зчетверених слів. Ланцюжок це логічне поняття яке використовується для структуризації даних. Прикладом ланцюжка може бути одновимірний масив або рядок символів. Для мікропроцесора байдуже цільове призначення елементів ланцюжка, для нього вся память може розглядатися як ланцюжок байт.

В системі команд мікропроцесора існує пять базових операцій обробки ланцюжків (Рисунок 3.17). Кожна з них реалізується в мікропроцесорі чотирма командами, мнемоніки яких відображають розмір елемента ланцюжка байт (B), слово (W), подвійне слово (D) або зчетверене слово (Q

тільки для 64-розрядного режиму).

Рисунок 3.17 Для адресації в памяті елементів ланцюжків команди їх обробки

використовують регістри (DS:ESI)|RSI та (ES:EDI)|RDI оперуючи при цьому такими поняттями як ланцюжок-джерело та ланцюжок-приймач (в 64- розрядному режимі сегментні регістри не використовується).

Джерело це ланцюжок, адреси елементів якого команди обробки ланцюжків визначають за вмістом регістрів (DS:ESI)|RSI (SI – Source Index).

Приймач це ланцюжок адреси елементів якого команди обробки ланцюжків визначають за вмістом регістрів (ES:EDI)|RDI (DI – Destination

Index).

3.5.1.6.1 Особливості адресації ланцюжків

Особливістю команд обробки ланцюжків є використання автоінкрементної або автодекрементної адресації. Алгоритм роботи будь-якої команди обробки ланцюжків обовязково передбачає модифікацію значення або регістра ESI|RSI, або регістра EDI|RDI, або пари регістрів ESI|RSI та EDI|RDI одночасно таким чином, щоб вони після виконання команди містили адресу наступного або наступних елементів ланцюжка.

Обробка елементів ланцюжка при автоінкрементній адресації йде у бік старших адрес памяті, тобто команди обробки ланцюжків збільшують значення або регістра ESI|RSI, або регістра EDI|RDI, або пари регістрів ESI|RSI та EDI|RDI одночасно.

Обробка елементів ланцюжка при автодекрементній адресації йде у бік молодших адрес памяті, тобто команди обробки ланцюжків зменшують

Соседние файлы в папке гос