M_Asm2009LS
.pdfIP|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+b−x, |
де x = 1, |
|||
|
x >0andx<a, |
|
|
d = 625 |
c+d, |
d +1, |
c < d, |
|
|
|
|
|
|
|
d−x, |
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