Язык ассемблера для процессоров
INTEL, 5-е издание
Кип Р. Ирвин
Глава 6: Условные вычисления
Слайды подготовил: Кип Р. Ирвин
Редакция: С.Б. Мусин
(c) Pearson Education, 2006-2007. All rights reserved. You may modify and copy this slide show for your personal use, or for use in the classroom, as long as this copyright statement, the author's name, and the title are not changed.
Обзор
•Булевы операции и команды сравнения
•Команды условного перехода
•Команды условного цикла
•Условные выражения
•Реализация конечных автоматов
•Директивы генерации условных выражений
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
2 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Булевы операции и команды сравнения
•Флаги состояния ЦП
•Команда AND
•Команда OR
•Команда XOR
•Команда NOT
•Команда TEST
•Команда CMP
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
3 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Флаги состояния ЦП
•Флаг нуля (ZF), если результат выполнения операции равен 0.
•Флаг переноса (CF) устанавливается если разрядность результата выполнения команды превышает разрядность приемника.
•Флаг знака (SF) установлен, если результат отрицательный.
•Флаг переполнения (OF) установлен, если результат со знаком некорректен (перенос 7 бита XOR перенос 6 бита).
•Флаг четности (PF) установлен, если результат содержит четное число бит.
•Флаг служебного переноса (AF) установлен, если был перенос из 3 бита в 4 бит.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
4 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Команда AND
•Побитно выполняет булеву операцию «И» над операндами
•Syntax:
AND приемник, источник |
AND |
|
(тип операндов как у команды MOV) |
||
|
0 0 1 1 1 0 1 1 AND 0 0 0 0 1 1 1 1
cleared 0 0 0 0 1 0 1 1 unchanged
AND используется для проверки бит по маске.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
5 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Команда OR
•Побитно выполняет булеву операцию «ИЛИ» над операндами
•Syntax:
OR приемник, источник
OR
OR используется для установки бит по маске.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
6 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
1
Команда XOR
• Побитно выполняет булеву операцию «ИСКЛЮЧАЮЩЕЕ ИЛИ» над операндами
• Syntax: |
XOR |
||||||
|
XOR приемник, источник |
||||||
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
XOR используется для переключения бит по маске.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
7 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Примеры (1 - 5)
•Задача: Перевести строчную букву из AL в прописную.
•Решение: Используя AND сбросить бит 5.
mov |
al,'a' |
; |
AL |
= |
01100001b |
and |
al,11011111b |
; |
AL |
= |
01000001b |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
9 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Примеры (3 - 5)
•Задача: Включить режим CapsLock
•Решение: Используя команду OR установить 6 бит байта флага клавиатуры 0040:0017h в области данных BIOS.
mov ax,40h |
; BIOS segment |
mov ds,ax |
; keyboard flag byte |
mov bx,17h |
|
or BYTE PTR [bx],01000000b |
; CapsLock on |
Работает только в реальном режиме, под DOS
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
11 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Команда NOT
• |
Побитно выполняет булеву операцию «НЕ» над |
||||
|
операндом |
|
|||
• |
Syntax: |
NOT |
|||
|
|
NOT приемник |
|||
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NOT используется для инвертирования бит по маске.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
8 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Примеры (2 - 5)
•Задача: Перевести двоично-десятичное значение байта в соответствующий ASCII символ.
•Решение: С помощью OR установить 4 и 5 бит.
mov |
al,6 |
; |
AL |
= |
00000110b |
or |
al,00110000b |
; |
AL |
= |
00110110b |
'6' = 00110110b
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
10 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Примеры (4 - 5)
•Задача: Переход на метку, если число четное.
•Решение: С помощью AND проверить младший бит. Если бит нулевой, число четное.
mov |
ax,wordVal |
; low bit set? |
|
and |
ax,1 |
flag set |
|
jz |
EvenValue |
; jump if Zero |
JZ (jump if Zero) рассматривается далее.
Задача: Напишите фрагмент кода, который позволяет выполнить переход на метку, если число отрицательное.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
12 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
2
Примеры (5 - 5)
•Задача: Переход на метку, если значение AL не равно 0.
•Решение: OR значения с самим собой, потом использовать команду JNZ (jump if not zero).
or |
al,al |
; jump if not zero |
jnz |
IsNotZero |
Устанавливаются только флаги.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
13 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Команда CMP (1 - 3)
•Сравнивает приемник с источником
•источник вычитается из приемника, результат отбрасывается, но флаги сохраняются.
•Синтаксис: CMP приемник, источник
•Пример: приемник == источник
mov |
al,5 |
; Zero flag set |
cmp |
al,5 |
• Пример: приемник < источник
mov al,4 |
; Carry flag set |
|
cmp al,5 |
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
15 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Команда TEST
•Выполняет AND для операндов, не сохраняя результат
•Хотя операнды не изменяются, устанавливается ZF(Zero flag).
•Пример: переход на метку, если в AL установлен бит 0 или бит 1.
test al,00000011b jnz ValueFound
• Пример: переход на метку, если бит 0 и бит 1 сброшены.
test al,00000011b jz ValueNotFound
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
14 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Команда CMP (2 - 3)
• Пример: приемник > источник
mov |
al,6 |
; ZF = 0, CF = 0 |
cmp |
al,5 |
(сброшены оба флага Zero flag и Carry flag)
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
16 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Команда CMP (3 - 3)
Во всех примерах сравниваются значения со знаком.
• |
Пример: приемник > источник |
|
|
|
|
mov al,5 |
; Sign flag == Overflow flag |
|
|
|
cmp al,-2 |
|
||
• |
Пример: приемник < источник |
|
|
|
|
mov al,-1 |
; Sign flag != Overflow flag |
|
|
|
cmp al,5 |
|
||
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
17 |
||
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 |
http://ppl.yohng.com. |
|
|
|
|
|
|
|
|
Команды условного перехода
•Команды J[cond] . . .
•переход по флагам
•переход по равно
•сравнение без знака
•сравнение со знаком
•Примеры
•Шифрование строки
•Команда проверка бит (BT)
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
18 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
3
Команда J[cond]
•Выполняет условный переход на метку в зависимости от содержимого специального регистра или регистра флагов
•Примеры:
•JB, JC переход если установлен Carry flag
•JE, JZ переход если установлен Zero flag
•JS переход если установлен Sign flag
•JNE, JNZ переход если сброшен Zero flag
•JECXZ переход если ECX содержит 0
Границы перехода
•Предшественники ЦП 386:
•диапазон от –128 до +127 байт от текущей позиции
•ЦП IA-32:
•32-битное смещение позволяет выполнять неограниченный переход
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
19 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
20 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Переход по флагам
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
21 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
|
|
Переход по равенству
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
22 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Переход по сравнению чисел без знака
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
23 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
|
|
Переход по сравнению чисел со знаком
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
24 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
|
|
4
Примеры (1 - 5)
•Задача: Переход на метку, если значение без знака, которое хранится в EAX, больше чем в EBX
•Решение: Использовать CMP, затем JA
cmp eax,ebx ja Larger
•Задача : Переход на метку, если значение со знаком, которое хранится в EAX, больше чем в EBX
•Решение: Использовать CMP, затем JG
cmp eax,ebx jg Greater
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
25 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Примеры (3 - 5)
•Сравнить значения без знака AX и BX, и скопировать большее значение в переменную Large
mov Large,bx cmp ax,bx jna Next mov Large,ax
Next:
•Сравнить значения со знаком AX и BX, и скопировать меньшее значение в переменную Small
mov Small,ax cmp bx,ax jnl Next mov Small,bx
Next:
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
27 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Примеры (5 - 5)
•Задача: Переход на метку L1 если биты 0, 1 и 3 в AL установлены.
•Решение: Очистить все биты, кроме 0, 1 и 3. Затем сравнить результат с 00001011.
and |
al,00001011b |
; clear |
unwanted bits |
cmp |
al,00001011b |
; check |
remaining bits |
je |
L1 |
; all set? jump to L1 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
29 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Примеры (2 - 5)
•Переход на метку L1, если значение без знака в EAX меньше либо равно Val1
cmp |
eax,Val1 |
; below or equal |
jbe |
L1 |
•Переход на метку L1, если значение со знаком в EAX меньше либо равно Val1
cmp eax,Val1 jle L1
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
26 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Примеры (4 - 5)
•Переход на метку L1, если слово в памяти, на которое указывает ESI равно нулю
cmp WORD PTR [esi],0 je L1
•Переход на метку L2 если двойное слово в памяти, на которое указывает EDI равно нулю
test DWORD PTR [edi],1 jz L2
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
28 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Задачи . . .
•Реализуйте переход на метку L1, если бит 4, либо 5, либо 6 установлен в регистре BL.
•Реализуйте переход на метку L1, если бит 4 и 5 и 6 установлены в регистре BL.
•Реализуйте переход на метку L2, если количество единиц в регистре AL четно.
•Реализуйте переход на метку L3, если регистр EAX содержит отрицательное значение.
•Реализуйте переход на метку L4, если (EBX – ECX) больше нуля.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
30 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
5
Шифрование строки |
|
Следующий цикл использует команду XOR для |
|
кодирования символов строки. |
|
KEY = 239 |
; can be any byte value |
BUFMAX = 128 |
|
.data |
|
buffer BYTE BUFMAX+1 DUP(0) |
|
bufSize DWORD BUFMAX |
|
.code |
; loop counter |
mov ecx,bufSize |
|
mov esi,0 |
; index 0 in buffer |
L1: |
; translate a byte |
xor buffer[esi],KEY |
|
inc esi |
; point to next byte |
loop L1
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
31 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Программа шифрования строки
•Задачи:
•Ввести сообщение пользователя
•Зашифровать сообщение
•Отобразить зашифрованное сообщение
•Расшифровать сообщение
•Отобразить расшифрованное сообщение
См. Encrypt.asm. Пример вывода:
Enter the plain text: Attack at dawn.
Cipher text: «¢¢Äîä-Ä¢-ïÄÿü-Gs
Decrypted: Attack at dawn.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
32 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Команда BT (Bit Test)
•Копирует n-й бит из операнда в флаг CF(Carry flag)
•Синтаксис: BT bitBase, n
•bitBase может быть r/m16 or r/m32
•n может быть r16, r32, or imm8
•Пример: переход на метку L1,если установлен бит 9 регистра AX:
bt |
AX,9 |
; CF = |
bit 9 |
|
jc |
L1 |
; jump |
if Carry |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
33 |
||
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
Команды условного цикла
•LOOPZ и LOOPE
•LOOPNZ и LOOPNE
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
34 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
LOOPZ и LOOPE
•Синтаксис: LOOPE метка LOOPZ метка
•Семантика:
•ECX ← ECX – 1
•если ECX > 0 и ZF=1, переход на метку
•Применяется для поиска первого элемента массива, который не совпадает с заданным значением
LOOPNZ and LOOPNE
•LOOPNZ (LOOPNE)
•Синтаксис: LOOPNZ метка LOOPNE метка
•Семантика:
•ECX ← ECX – 1;
•если ECX > 0 и ZF=0, переход на метку
•Применяется для поиска первого элемента массива, который совпадает с заданным значением
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
35 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
36 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
6
Пример использования LOOPNZ
Поиск первого положительного элемента в массиве:
.data |
|
array SWORD -3,-6,-1,-10,10,30,40,4 |
|
sentinel SWORD 0 |
|
.code |
|
mov esi,OFFSET array |
|
mov ecx,LENGTHOF array |
|
next: |
; test sign bit |
test WORD PTR [esi],8000h |
|
pushfd |
; push flags on stack |
add esi,TYPE array |
; pop flags from stack |
popfd |
|
loopnz next |
; continue loop |
jnz quit |
; none found |
sub esi,TYPE array |
; ESI points to value |
quit:
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
37 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Задача. . .
Найти первый ненулевой элемент в массиве.
.data
array SWORD 50 DUP(?) sentinel SWORD 0FFFFh
.code
mov esi,OFFSET array
mov ecx,LENGTHOF array |
; check for zero |
|
L1: cmp WORD PTR [esi],0 |
|
|
(fill in your code here) |
|
|
quit: |
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
38 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
|
|
. . . решение
.data |
|
array SWORD 50 DUP(?) |
|
sentinel SWORD 0FFFFh |
|
.code |
|
mov esi,OFFSET array |
|
mov ecx,LENGTHOF array |
; check for zero |
L1: cmp WORD PTR [esi],0 |
|
pushfd |
; push flags on stack |
add esi,TYPE array |
; pop flags from stack |
popfd |
|
loope L1 |
; continue loop |
jz quit |
; none found |
sub esi,TYPE array |
; ESI points to value |
quit:
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
39 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Условные выражения
•Идиома конструкции IF
•Логическое AND
•Логическое OR
•Идиома цикла WHILE
•Управление с помощью таблиц
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
40 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Идиома конструкции IF
Конструкции языка высокого уровня, например C++/Java, соответствует определенный набор команд на языке ассемблера . :
if( op1 == op2 ) |
mov |
eax,op1 |
|
X = 1; |
cmp eax,op2 |
||
jne |
L1 |
||
else |
|||
mov |
X,1 |
||
X = 2; |
|||
jmp |
L2 |
||
|
L1: mov |
X,2 |
|
|
L2: |
|
Задача. . .
Переведите на язык ассемблера, все значения без знака:
if( ebx <= ecx ) |
cmp ebx,ecx |
|
{ |
ja next |
|
mov eax,5 |
||
eax = 5; |
||
mov edx,6 |
||
edx = 6; |
||
next: |
||
} |
||
|
(Существует несколько правильных решений)
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
41 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
42 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
7
Задача. . .
Переведите на язык ассемблера, все значения 32битные числа со знаком:
if( var1 <= var2 ) |
mov |
eax,var1 |
|
var3 = 10; |
cmp eax,var2 |
|
|
jle |
L1 |
|
|
else |
|
||
mov var3,6 |
|
||
{ |
|
||
mov var4,7 |
|
||
var3 = 6; |
jmp L2 |
|
|
var4 = 7; |
L1: mov var3,10 |
|
|
} |
L2: |
|
|
(Существует несколько правильных решений) |
|
||
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
|
Web site Examples |
43 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
Логическое AND (2 - 3)
if (al > bl) AND (bl > cl)
|
|
X = 1; |
Вот одна из возможных реализаций . . . |
||
cmp al,bl |
; first expression... |
|
ja |
L1 |
|
jmp next |
|
|
L1: |
|
; second expression... |
cmp bl,cl |
||
ja |
L2 |
|
jmp |
next |
; both are true |
L2: |
X,1 |
|
mov |
; set X to 1 |
next:
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
45 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Логическое AND (1 - 3)
•«Короткое замыкание»
•В следующем примере, если первое выражение ложно, второе не вычисляется:
if (al > bl) AND (bl > cl) X = 1;
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
44 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Логическое AND (3 - 3)
if (al > bl) AND (bl > cl) X = 1;
Следующая реализация использует обратное условие для первой проверки, что позволяет сэкономить 29% кода.
Программа пропускает второе условие:
cmp al,bl |
; first expression... |
|
jbe next |
; quit if false |
|
cmp bl,cl |
; second expression... |
|
jbe next |
; quit |
if false |
mov X,1 |
; both |
are true |
next:
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
46 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Задача. . .
Переведите на язык ассемблера. Все значения без знака:
if( ebx <= ecx |
cmp |
ebx,ecx |
|
&& ecx > edx ) |
ja |
next |
|
cmp ecx,edx |
|
||
{ |
|
||
jbe next |
|
||
eax = 5; |
|
||
mov eax,5 |
|
||
edx = 6; |
mov edx,6 |
|
|
} |
next: |
|
|
(Существует несколько правильных решений) |
|
||
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
|
Web site Examples |
47 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
Логическое OR (1 - 2)
•«Короткое замыкание»
•В следующем примере, если первое выражение ложно, второе не вычисляется:
if (al > bl) OR (bl > cl) X = 1;
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
48 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
8
Логическое OR (2 - 2)
if (al > bl) OR (bl > cl) X = 1;
Досрочное прекращение вычисления позволяет уменьшить код:
cmp |
al,bl |
; is AL > BL? |
ja |
L1 |
; yes |
cmp |
bl,cl |
; no: is BL > CL? |
jbe |
next |
; no: skip next statement |
L1: mov |
X,1 |
; set X to 1 |
next:
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
49 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Задача . . .
Переведите на язык ассемблера (числа 32-бита без знака):
while( ebx <= val1)
{
ebx = ebx + 5; val1 = val1 - 1
} |
|
|
top:cmp ebx,val1 |
; check loop condition |
|
ja next |
; false? exit loop |
|
add ebx,5 |
; body of loop |
|
dec val1 |
; repeat the loop |
|
jmp top |
|
|
next: |
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
51 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Управление с помощью таблиц (2 - 3)
Шаг 1: создание таблицы:
.data |
; lookup value |
|
CaseTable BYTE 'A' |
|
|
DWORD Process_A |
; address of procedure |
|
EntrySize = ($ - CaseTable) |
|
|
BYTE 'B' |
|
|
DWORD Process_B |
|
|
BYTE 'C' |
|
|
DWORD Process_C |
|
|
BYTE 'D' |
|
|
DWORD Process_D |
|
|
NumberOfEntries = ($ - CaseTable) / EntrySize |
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
53 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Идиома цикла WHILE
Цикл WHILE реализуется как конструкция IF с телом цикла внутри и последующим безусловным переходом на начало. Например:
while( eax < ebx)
eax = eax + 1; |
|
Возможная реализация: |
|
top:cmp eax,ebx |
; check loop condition |
jae next |
; false? exit loop |
inc eax |
; body of loop |
jmp top |
; repeat the loop |
next:
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
50 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Управление с помощью таблиц (1 - 3)
•Таблица соответствия (LookUp Table) заменяет разветвленную логику
•Таблица хранит пары значение и смещение соответствующей значению метки или
процедуры
•Цикл поиска по таблице
•Используется при необходимости вычисления большого количества условий
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
52 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Управление с помощью таблиц (3 - 3)
Step 2: Цикл поиска в таблице и вызова соответствующей процедуры:
mov |
ebx,OFFSET CaseTable |
; point EBX to |
the table |
|
mov |
ecx,NumberOfEntries |
; loop counter |
|
|
L1: cmp |
al,[ebx] |
; match found? |
|
|
jne |
L2 |
; no: continue |
|
|
call NEAR PTR [ebx + 1] |
; yes: call the procedure |
|
||
jmp |
L3 |
; and exit the |
loop |
|
L2: add |
ebx,EntrySize |
; point to next entry |
|
|
loop L1 |
; repeat until ECX = 0 |
|
||
L3: |
|
|
|
|
|
т.к. указатель на |
|
|
|
|
процедуру |
|
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
54 |
||
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
9
Реализация конечных автоматов
•Конечный автомат (Finite-State Machine) – граф-структура, которая изменяет свое текущее состояние в зависимости от входа. Задается диаграммой состояний (state-transition diagram).
•Представляется в виде графа, где окружности или квадраты задают узлы (nodes), а линии со стрелками дуги (edges, arcs).
•Частный случай направленного графа, диграф (directed graph).
•Три основных состояния задают узлы:
•Начальное состояние (Start state)
•Заключительное состояние (Terminal state(s))
•Промежуточное состояние (Nonterminal state(s))
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
55 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Конечный автомат
•Принимает последовательность символов, которая переводит автомат в заключительное состояние
•Используется для распознавания и проверки корректности цепочек символов, определенных правилами языка (регулярные выражения)
•Плюсы:
•Наглядно представляется
•Легко модифицировать
•Легко реализовать
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
56 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
|
Примеры КА |
|
|||
• |
'x‘ ('a‘ - 'y‘)* 'z': |
|
|
|
• Целые числа со знаком: |
|
• Задача: найдите и объясните ошибку: |
|
|||||
|
|
|
digit |
|
||
|
|
|
|
|
digit |
|
|
|
start |
A |
+,- |
B |
|
|
|
|
|
|
||
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
|
Web site Examples |
57 |
|||
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 |
http://ppl.yohng.com. |
|
|
|
Реализация конечных автоматов
Реализация State A КА для распознавания целых чисел:
StateA: |
; read next char into AL |
call Getnext |
|
cmp al,'+' |
; leading + sign? |
je StateB |
; go to State B |
cmp al,'-' |
; leading - sign? |
je StateB |
; go to State B |
call IsDigit |
; ZF = 1 if AL = digit |
jz StateC |
; go to State C |
call DisplayErrorMsg |
; invalid input found |
jmp Quit |
|
см. Finite.asm.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
58 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Процедура IsDigit
Получает символ в AL. Устанавливает ZF (Zero flag) если в AL цифра.
IsDigit PROC |
; ZF = 0 |
|
cmp |
al,'0' |
|
jb |
ID1 |
; ZF = 0 |
cmp |
al,'9' |
|
ja |
ID1 |
; ZF = 1 |
test |
ax,0 |
|
ID1: ret |
|
|
IsDigit ENDP
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
59 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Блок схема алгоритма
State A
State A допускает знак плюс, минус или цифру
|
|
|
|
|
|
|
|
|
|
|
|
60 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
|
|
|
Web site Examples |
||||||||
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10