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

M_Asm2009LS

.pdf
Скачиваний:
12
Добавлен:
23.02.2016
Размер:
2.34 Mб
Скачать

IP|EIP. Ця форма команди дозволяє передати керування в межах сегмента.

В команді непрямого переходу в межах сегмента

JMP reg|mem

адреса переходу (16 або 32 біти) обмежена поточним сегментом коду. Однак тепер вона знаходиться в регістрі або комірці пам’яті і при передачі керування завантажується в регістр IP|EIP.

Команда прямого міжсегментного переходу

JMP ptr

містить безпосередній операнд, який є вказівником цільової команди. Він складається з 16-бітового селектора, який завантажується в регістр CS, і 16або 32-бітового зміщення, яке завантажується в регістр IP або EIP відповідно.

Команда непрямого міжсегментного переходу адресує в пам’яті повний 32або 48-бітовий вказівник селектор:зміщення. Селектор завантажується в регістр CS, а зміщення в регістр IP або EIP відповідно.

Тип мітки переходу можна вказати безпосередньо в команді, використовуючи оператори SHORT PTR, NEAR PTR або FAR PTR. Оператор SHORT PTR застосовують для здійснення коротких, NEAR PTR ближніх (у межах сегмента), а FAR PTR – між сегментних переходів.

2. Команди умовних переходів

Загальний вигляд команд умовного переходу

Jcc мітка.

Алгоритм виконання: якщо умова cc на основі аналізу стану відповідних прапорців у регістрі FLAGS|EFLAGS справджується, то здійснюється перехід на мітку. Інакше керування передається наступній команді після команди умовного переходу.

Команди умовного переходу з кодом операції Jcc, де cc задає умову переходу, дозволяють передати керування в межах сегмента, якщо умова справджується. Перехід реалізується додаванням зміщення (знакове ціле число), яке знаходиться в команді, до вмісту регістра IP|EIP. Набір символів cc може набувати значень з такої множини:

cc {A, NBE, AE, NB, B, NAE, BE, NA, C, E, Z, G, NLE, GE, NL, L, NGE, LE, NG, NC, NE, NZ, NO, NP, PO, NS, O, P, PE, S}.

31

Команди умовного переходу

 

 

 

Таблиця 3.1.

Мнемоніка

Стан прапорців, які

 

 

 

команди

перевіряються

 

Перейти, якщо

 

JA|JNBE

CF = 0 і ZF = 0

вище| не нижче або дорівнює

 

JAE|JNB

CF = 0

вище або дорівнює|не нижче

 

JB|JNAE

CF = 1

нижче|не вище або дорівнює

 

JBE|JNA

CF = 1 або ZF = 1

нижче або дорівнює| не вище

 

JC

CF = 1

є перенесення

 

JE|JZ

ZF = 1

дорівнює|нуль

 

JG|JNLE

ZF = 0 і SF = OF

більше|не менше або дорівнює

 

JGE|JNL

SF = OF

більше або дорівнює|не менше

 

JL|JNGE

SF <> OF

менше|не більше або дорівнює

 

JLE|JNG

ZF=1 або SF <> OF

менше або дорівнює|не більше

 

JNC

CF = 0

немає перенесення

 

JNE|JNZ

ZF = 0

не дорівнює|не нуль

 

JNG

ZF = 1 або SF <> OF

якщо не більше

 

JNO

OF=0

немає переповнення

 

 

 

немає

паритету|паритет

 

JNP|JPO

PF = 0

непарний

 

JNS

SF = 0

немає знака (додатний)

 

JO

OF = 1

є переповнення

 

JP|JPE

PF = 1

є паритет|паритет парний

 

JS

SF = 1

є знак (від’ємний)

 

Для перевірки вмісту регістра CX|ECX, якщо він використовується як лічильник циклу, зручно користуватися командами JCXZ|JECXZ. Оскільки в командах циклу декремент регістра CX|ECX відбувається до перевірки вмісту на нуль, то використання команди JCXZ або JECXZ попередить неправильне використання кількості повторень циклу, тобто, розміщуючи команду JCXZ або JECXZ перед циклом, можна обійти цикл при нульовому значенні лічильника. В обох командах розмір зміщення – вісім бітів.

Загальний вигляд команд:

JCXZ мітка

JECXZ мітка

Команди виконуються так: якщо вміст регістра CX|ECX дорівнює 0, то відбувається перехід на мітку, інакше виконується наступна команда після команди JCXZ або JECXZ.

32

3. Команди організації циклів ( LOOP,LOOPE|LOOPZ, LOOPNE|LOOPNZ)

Три команди керування циклами застосовуються для організації програмних циклів. У цих командах передбачено використання регістра cx|ecx як лічильника циклу. В регістр CX|ECX перед використанням команд циклу потрібно обов’язково завантажити сталу, яка визначає кількість повторення циклу і вважається додатнім цілим числом. Виконання команд не впливає на стан прапорців.

Команда

LOOP мітка

Алгоритм виконання команди:

декремент регістра CX|ECX;

порівняння вмісту регістра CX|ECX з нулем; якщо (CX|ECX)>0, то передати керування на мітку;

якщо (CX|ECX)=0, то передати керування наступній

після LOOP команді.

Команда

LOOPE|LOOPZ мітка

Обидві команди абсолютно ідентичні. Алгоритм виконання:

декремент регістра CX|ECX;

порівняння вмісту регістра CX|ECX з нулем;

аналіз прапорця zf;

якщо (CX|ECX)>0 і zf=1, передати керування на мітку;

якщо (CX|ECX)=0 або zf=0, то передати керування наступній після LOOPE|LOOPZ команді.

Команда

LOOPNE|LOOPNZ мітка

Ці команди також абсолютно ідентичні. Алгоритм виконання:

декремент регістра CX|ECX;

порівняння вмісту регістра CX|ECX з нулем;

аналіз прапорця zf;

якщо (CX|ECX)>0 і zf=0, передати керування на мітку;

якщо (CX|ECX)=0 або zf=1, передати керування наступній після LOOPNE|LOOPNZ команді.

Недолік команд циклу в тому, що вони реалізують тільки короткі переходи в межах від – 128 до + 127 байтів. Довгі цикли приходиться організовувати по-іншому, використовуючи команди умовного переходу і команду JMP.

Виконання команди не впливає на стан прапорців.

33

4. Способи завантаження ефективної адреси

Для завантаження ефективної адреси в загальний регістр можна використати команду LEA, загальний вигляд якої

LEA reg16|32,mem16|32

Алгоритм виконання цієї команди:

обчислити зміщення операнда mem16|32 у сегменті;

шістнадцятиабо тридцятидвобітове зміщення (ефективну адресу) передати в шістнадцятиабо тридцятидвобітовий загальний регістр з певним

перетворенням Команда не впливає на стан прапорців.

Адресу об’єкта можна одержати ще одним способом, використовуючи оператор одержання зміщення виразу offset. У цьому випадку адреса обчислюється на етапі трансляції програми, тоді як за допомогою команди LEA адреса об’єкта обчислюється динамічно під час виконання програми.

5. Стекові передачі даних

Стек – це область оперативної пам’яті, яка знаходиться в поточному сегменті стека і застосовується для тимчасового зберігання будь-яких даних. Початок сегмента стека визначається вмістом сегментного регістра SS, а регістр SP|ESP адресує вершину стека. Всі стекові операції автоматично модифікують вміст регістра SP|ESP.

Операція запису в стек ініціюється командою

PUSH src

і виконується за таким алгоритмом: Якщо розмір операнда – слово, то

відняти 2 від вмісту регістра SP|ESP;

передати слово src у вершину стеку SS:[SP|ESP]. Інакше ( розмір операнда – подвійне слово):

відняти 4 від вмісту регістра SP|ESP;

передати подвійне слово src у вершину стеку

SS:[SP|ESP].

Як src можна вказувати сегментний регістр sreg, загальний регістр reg16|32, комірку пам’яті mem16|32 або сталу imm16|32.

Усистемі команд є зручна для розробки процедур команда запису

встек вмісту всіх восьми шістнадцятиабо тридцятидвобітових загальних регістрів PUSHA|PUSHAD. Вміст регістрів записується в стек у такому порядку: AX|EAX, CX|ECX, DX|EDX, BX|EBX, SP|ESP, BP|EBP, SI|ESI, DI|EDI. Для регістра SP|ESP у стек записується те значення, яке було в ньому до виконання команди PUSHA|PUSHAD.

34

Вибір зі стеку можна виконати командою

POP dst,

дію якої описують так:

Якщо розмір операнда – слово, то

передати слово з вершини стеку в dst; додати 2 до вмісту регістра SP|ESP.

Інакше ( розмір операнда подвійне – слово)

передати подвійне слово з вершини стеку в dst; додати 4 до вмісту регістра SP|ESP.

Як приймач dst, у команді можна вказувати sreg, reg16|32, mem16|32.

Двоїстою до команди PUSHA|PUSHAD є команда POPA|POPAD. Вона поновлює вміст восьми загальних регістрів зі стеку у зворотному порядку, ефективно замінюючи сім команд POP. Значення, яке мало б записатися в регістр SP|ESP, ігнорується.

П о ч а т о к

c > d

 

т а к

x = c

 

 

 

 

 

 

 

 

 

 

 

н і

 

 

 

 

 

 

 

c = d

 

т а к

x = 1

 

 

 

 

 

ні

x = d + 1

 

x = 0

 

т а к

 

f = 0

 

 

 

 

 

 

 

 

 

 

н і

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r = a + b

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

н і

 

т а к

 

 

 

 

 

 

 

 

 

 

x < 0

 

 

 

 

 

f = r

 

 

 

 

 

 

 

 

 

 

н і

 

 

т а к

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x > r

 

 

 

f = r - x

 

 

 

 

 

 

 

 

 

 

 

 

н і

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x < a

т а к

 

f = c + d

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

н і

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f = d - x

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

К ін е ц ь

Рис. 1.

Розвязування задач за тематикою заняття

35

Задача 1. Задано цілі беззнакові числа a (a >=0) та b (b>=0), цілі знакові c та d. Побудувати блок-схему та написати процедуру обчислення виразу:

0,

x =0,

 

 

при

 

 

c,

 

а = 404

a+b,

x <0,

c > d,

b =13

 

x >0 andx >a+b,

 

c = d,

c = -34

f = a+bx,

де x = 1,

 

x >0andx<a,

 

 

d = 625

c+d,

d +1,

c < d,

 

 

 

 

 

 

dx,

x >0andx a andx a+b,

 

 

 

 

 

 

 

 

Розв’язування. Блок-схема зображена на рисунку 1. Код програми

такий:

 

 

 

Data

 

 

Segment

para 'code'

a

 

 

dw

657

b

 

 

dw

265

c

 

 

dw

738

d

 

 

dw

273

f

dw

?

 

Data

 

 

Ends

 

stk

 

 

segment stack

 

 

 

dw 256 dup (?)

stk

 

ends

 

Code

Segment

para 'code'

Main Proc far

 

 

 

 

ASSUME CS: Code,DS : Data

 

 

 

push DS

 

 

 

 

sub AX,AX

 

 

 

push AX

 

 

 

 

mov AX,Data

 

 

 

mov DS,AX

 

 

 

call CalcExpr

retf

 

 

Main Endp

 

 

CalcExpr

Proc near

; Процедура обчислення виразу.

 

mov CX,c

; Записати в регістр СX число с.

 

cmp CX,d;

; Значення х записати в регістр СX.

 

jg m1

 

 

je m2

 

 

mov CX,d

 

 

inc CX

 

36

 

 

 

jmp m1

 

m2:

mov CX,1

 

m1:

mov AX,0

; AX=0

 

mov BX,a

; Обчислити вираз r=a+b

 

add BX,b

; і записати в ВX.

 

cmp CX,0

; Значення f записати в регістр AX

 

je me

; x=0 тоді f=0

 

jg m4

; x>0

 

mov AX,BX

; x<0 тоді f=a+b

 

jmp me

 

m4:

cmp CX,BX

 

 

jle m5

; x<=a+b

 

mov AX,BX

;x>0 i x>a+b тоді f=a+b-x

 

sub AX,CX

 

 

jmp me

 

m5:

cmp CX,a

 

 

jg m6

; x>0 i x>=a i x<=a+b тоді f=d-x

 

mov AX,c

; x>0 i x<a тоді f=c+d

 

add AX,d

 

 

jmp me

 

m6:

mov AX,d

 

 

sub AX,CX

 

me:

mov f,AX

 

 

ret

; Повернення з процедури.

CalcExpr

Endp

; Директива кінця процедури.

Code Ends

 

 

End

Main

 

Задача 2. Задано два масиви X, Y розмірності n знакових та n беззнакових цілих чисел. Розробити програму впорядкування за зростанням елементів масиву X та масиву Y відповідно.

Розв’язування.

Code Segment para 'code'

Assume cs:Code,ds:Code,es:Nothing

xdb 5,8,-3,-6,-8,1,-1,0,7,-4

y db 83h,32h, 43h,34h,43h, 65h,93h, 48h,95h,37h num =10

Main Proc push DS sub AX,AX

37

push AX

 

mov AX,Code

 

mov DS,AX

 

lea SI,x

; Завантаження відносні адреси масивів X та

lea DI,y

; Y в індексні регістри SI та DI відповідно.

mov CX,num

; Кількість елементів масивів.

Enext: sub BX,BX

; Очищення регістра BX (BX=0).

push CX

; Занести вміст регістра CX у стек.

mov AL, [SI]

; Гіпотеза. Нехай у регістрах AL і DL

mov DL, [DI]

; найменші елементи.

next: cmp AL,[BX+SI]

; Порівняння елемента масиву X з AL.

jl m1

; перехід, якщо AL менше (для знакових)

xchg AL,[BX+SI]

; Обмін елементів регістр-память.

m1: cmp DL,[BX+DI] ; Порівняння елемента масиву Y з DL

jb m2

; перехід, якщо DL менше (для, беззнакових)

xchg DL,[BX+DI] ; Обмін елементів регістр-память.

m2: inc BX

;Збільшення вмісту регістра BX на 1,

 

;щоб вибирати наступні елементи масивів.

loop next

;Внутрішній цикл.

pop cx

; Відновити вміст регістра CX для

 

; зовнішнього циклу .

mov [SI],AL

; Записати найменші елементи підмасиву

mov [DI],DL

; на першу позицію.

inc SI

; Збільшення вмісту регістрів SI і DI на 1, щоб

inc DI

; продовжити пошук елементів

 

; (розмірність підмасиву зменшується на 1).

loop Enext

; Зовнішній цикл .

retf

 

Endp

Code Ends

End Main

Задача 3. Побудувати блок-схему та написати процедуру обчислення суми виразу

8

s= (−1)i+1 (100 − (1 + 2 * i)).

i=1

Розв’язування. Блок-схема зображена на рисунку 2. Код програми такий:

38

П о ч а т о к

S = 0

n = 8

r = 1

q = 2

p = 1

w = 1 0 0 - r

p > 0

т а к

 

 

 

S = S + w

н і

 

 

 

 

S = S - w

r = r + q

p = - p

 

т а к

n > 0

n = n - 1

ні

Кі н е ц ь

 

 

 

Рис. 2.

 

Data

Segment

para 'code'

S

dw

?

 

n

dw

8

 

Data

Ends

 

 

Code

Segment para 'code'

 

Main Proc far

 

 

ASSUME CS: Code,DS : Data

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

 

Основна програма.....................................

 

push DS

 

 

sub AX,AX

 

 

push AX

 

 

mov AX,Data

 

 

mov DS,AX

 

 

call CalcSumm

 

retf

 

 

Main Endp

 

 

CalcSumm

Proc near

; Процедура обчислення виразу.

39

 

xor AX,AX

; AX =0 (S=0 , AX -> S).

 

mov CX,n

; CX -> n

 

mov BX,1

; BX -> r : 1, 1+2, 1+4, 1+6 …

 

mov DI,2

; DI -> q

 

mov SI,1

; SI -> p : (-1)**(i+1) -1 1 -1 1 ... -1 1

 

mov BP,100

; BP -> 100

m1:

mov DX,BP

 

 

sub DX,BX

; 100-r

 

cmp SI,0

; (-1)**(i+1)

 

jl m2

 

 

add AX,DX

; S=S+(100-r)

 

jmp m3

 

m2:

sub AX,DX

; S=S-(100-r)

m3:

add BX,DI

; q = q+2 ---- (i*2)

 

neg SI

; 1 -1 1 -1

 

loop m1

 

 

mov S,AX

 

 

ret

; Повернення з процедури.

CalcSumm

Endp

; Директива кінця процедури.

Code Ends

 

 

End

Main

 

Завдання для самостійної роботи

1.Задано цілі беззнакові числа a та b , цілі знакові c та d. Побудувати блок –схему та розробити процедуру обчислення виразу:

 

 

 

 

 

 

 

 

 

1

 

 

a > 10,

 

c,

c > d ,

а = 44

 

c,

 

 

 

 

 

a = 10,

 

c = d ,

b =103

 

 

b,

x = 1,

 

f

 

a < 10 and x > a,

 

 

c < d,

c = -34

 

= a + b x,

d + 1,

 

 

 

 

 

 

 

 

 

d = 625

 

 

c + d ,

a < 10 and x = a,

 

 

 

 

 

 

d x,

a < 10 and x < a,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

a c,

 

b > a,

 

 

a > d ,

а = 554

 

 

c,

 

 

 

b + a,

 

b = a,

 

 

 

b =103

 

 

 

x = 1,

a = d ,

 

 

 

 

 

 

 

 

c = 304

 

f

 

 

b < a and x > a,

 

a < d,

 

= a + b x,

d + 1,

d = -66

 

 

 

 

 

 

 

 

 

 

c + d + 1,

b < a and x = a,

 

 

 

 

 

 

d x −1,

b < a and x < a,

 

 

 

 

 

 

 

 

 

 

 

 

 

40

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]