
- •Флаги ЦП
- •Слово состояния FPU и флаги ЦП
- •Команды и изменение флагов
- •Флаги и условия
- •Условные команды
- •Условные команды и проверка флагов
- •Программирование нелинейных алгоритмов
- •Условие с операторами в одной ветви
- •Условие с операторами в двух ветвях
- •Цикл (сумма двоичных цифр x)
- •Обработка чисел с плавающей запятой
- •Сумма ряда

|
МИЭТ, СПИНТех, КАИ |
Передача управления (ветвления и циклы) |
8 / 13 |
||||
|
Условие с операторами в одной ветви |
|
|||||
|
x; |
x > 0 |
Начало |
|
1 |
int x = -6; |
|
|
|
2 |
asm |
|
|||
|
x = 0; |
x < 0 |
|
да |
3 |
( |
|
|
Или |
|
x > 0 |
4 |
"cmpl $0, %[X]\n" |
||
|
|
|
|||||
|
asm |
|
|
|
5 |
"jge end_check\n" |
|
1 |
|
нет |
|
|
|
|
|
2 |
( |
|
x = 0 |
|
6 |
"movl $0, %[X]\n" |
|
3 |
"cmpl $0, %[X]\n" |
|
|||||
|
|
|
|
|
|||
4 |
"cmovll %[Z], %[X]\n" |
|
|
7 |
"end_check:\n" |
||
5 |
: [X]"+r"(x) |
|
Конец |
|
|
|
|
6 |
: [Z]"r"(0) |
|
|
8 |
: [X]"+rm"(x) |
||
7 |
: "cc" |
|
|
|
9 |
: : "cc" |
|
8 |
); |
|
|
|
10 |
); |
|
Флаги и условия |
Условие с операторами в одной ветви |
Программирование нелинейных алгоритмов |
Условие с операторами в двух ветвях |
Обработка чисел с плавающей запятой |
Цикл (сумма двоичных цифр x) |

МИЭТ, СПИНТех, КАИ |
Передача управления (ветвления и циклы) |
9 / 13 |
Условие с операторами в двух ветвях
|
Начало |
|
|
Начало |
|
x > 0 |
|
да |
да |
нет |
|
|
x > 0 |
|
|
|
|
нет |
|
y = 0 |
|
|
y = 1 |
|
|
|
|
||
|
|
|
|
y = 0 |
|
Конец |
|
|
|
y(x) = 0; x < 0 |
y = 1 |
|||
|
1; |
x > |
0 |
|
asm( |
"cmpl $0, %[X]\n" |
Конец |
||
"movl $0, %[X]\n" |
|
|||
|
|
|||
"setge %[X]\n" |
|
|
||
: [X]"+m"(x) : : "cc" |
|
|||
); |
|
|
|
|
int x = -6, y; asm
(
"cmpl $0, %[X]\n" "jge setting_1\n"
"movl $0, %[Y]\n"
"jmp end_check\n"
"setting_1:\n"
"movl $1, %[Y]\n"
"end_check:\n"
:[Y]"=rm"(y) :[X]"rm" (x) : "cc"
);
Флаги и условия |
Условие с операторами в одной ветви |
Программирование нелинейных алгоритмов |
Условие с операторами в двух ветвях |
Обработка чисел с плавающей запятой |
Цикл (сумма двоичных цифр x) |

МИЭТ, СПИНТех, КАИ |
Передача управления (ветвления и циклы) |
10 / 13 |
|
Цикл (сумма двоичных цифр x) |
|
||
Начало |
1 |
int x = 7, count; |
|
2 |
asm |
|
|
|
3 |
( |
|
count = 0 |
4 |
"xorl %[Count], %[Count]\n" |
|
да |
5 |
"begin_iteration:\n" |
|
6 |
"cmpl $0, %[X]\n" |
|
|
x = 0 |
|
||
7 |
"je end_loop\n" |
|
|
нет |
|
||
|
|
|
|
CF = x&1, |
8 |
"shrl $1, %[X]\n" |
|
x = (x >> 1) |
|
||
|
|
|
|
нет |
9 |
"jnc end_iteration\n" |
|
CF = 1 |
|
||
да |
|
|
|
count = count + 1 |
10 |
"incl %[Count]\n" |
|
|
11 |
"end_iteration:\n" |
|
|
12 |
"jmp begin_iteration\n" |
|
|
13 |
"end_loop:\n" |
|
Конец |
14 |
:[Count]"=rm"(count),[X]"+rm"(x) |
|
15 |
: : "cc" |
|
|
|
16 |
); |
|
Флаги и условия |
Условие с операторами в одной ветви |
Программирование нелинейных алгоритмов |
Условие с операторами в двух ветвях |
Обработка чисел с плавающей запятой |
Цикл (сумма двоичных цифр x) |