Скачиваний:
74
Добавлен:
15.06.2014
Размер:
301.51 Кб
Скачать

Язык ассемблера для процессоров

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