
Lectures / 18-19
.pdf
Нумерация регистров стека
До записи
Поле top
SWR 000
r0 st(0)
r1 st(1)
r2 st(2)
r3 st(3)
r4 st(4)
r5 st(5)
r6 st(6)
r7 st(7)
После записи
Поле top
SWR 111
r0 st(1)
r1 st(2)
r2 st(3)
r3 st(4)
r4 st(5)
r5 st(6)
r6 st(7)
r7 st(0)

Нумерация регистров стека
До записи
Поле top
SWR 111
r0 st(1)
r1 st(2)
r2 st(3)
r3 st(4)
r4 st(5)
r5 st(6)
r6 st(7)
r7 st(0)
После записи
Поле top
SWR 110
r0 st(2)
r1 st(3)
r2 st(4)
r3 st(5)
r4 st(6)
r5 st(7)
r6 st(0)
r7 st(1)

Регистр состояния swr
Флаги исключений
Указатель
вершины
стека
Коды условий Флаг исключения
|
Ошибка стека |
|
Точность |
|
Антипереполнение |
|
|
Занятость FPU |
Переполнение |
|
Деление на ноль |
|
|
|
Денормализация |
|
Неверная операция |

Регистр управления cwr
Управление |
Управление |
|
|
округлением |
точностью |
|
Маски исключений |
|
|
|
|
00 |
- К ближайше- |
00 |
- короткий |
|
му или четному |
01 |
- резерв |
||
01 |
- Округлить к |
|||
10 |
- двойной |
|||
большему |
||||
10 |
- Округлить к |
11 |
- расшир. |
|
меньшему |
Точность |
|||
11 |
- Отбросить |
|||
дробную часть |
Антипереполнение |
|||
|
|
|||
|
Резерв |
Переполнение |
||
|
Деление на ноль |
|||
|
|
|||
|
|
Денормализация |
||
|
|
Неверная операция |

Три формы математических команд
1) Без операндов
OP ; ST(1) = ST(1) OP ST(0) и
выталкивание из стека, ST(0)=результат
2) С одним операндом
OP mem ; ST(0 )= ST(0) OP mem
3) С двумя операндами
OP ST(0), ST(i)
OP ST(i), ST(0) ; dest = dest OP source
dest source

1) Команда FADD: без операндов
OP ; ST(1) = ST(1) OP ST(0) и
выталкивание из стека, ST(0)=результат
; Сегмент кода |
ST(0) |
ST(1) |
ST(2) |
||
|
fld |
x1 |
41.8 |
? |
? |
|
fld |
x2 |
12.4 |
41.8 |
? |
|
fadd |
|
54.2 |
? |
? |
; Сегмент данных |
|
|
|
||
|
|
|
|||
x1 |
dd |
41.8 |
|
|
|
x2 |
dd |
12.4 |
|
|
|

2) Команда FADD: один операнд
OP mem ; ST(0 )= ST(0) OP mem
; Сегмент кода |
ST(0) |
ST(1) |
fld x1 |
41.8e13 |
? |
fadd x2 |
54.2e13 |
? |
|
|
|
; Сегмент данных x1 dd 41.8e13 x2 dq 12.4e13

3) Команда FADD: два операнда
|
OP |
ST(0), ST(i) |
|
|
|
||
|
OP |
ST(i), ST(0); dest = dest OP source |
|||||
; |
|
|
|
||||
Сегмент кода |
|
|
|
|
|||
ST(0) ST(1) |
ST(2) ST(3) |
||||||
fld |
x1 |
|
4.8 |
? |
? |
? |
|
fld |
x2 |
|
1.4 |
4.8 |
? |
? |
|
fld |
x3 |
|
5.2 |
1.4 |
4.8 |
? |
|
fadd ST(2),ST |
5.2 |
1.4 |
10.0 |
? |
|||
|
|
|
|
|
|
||
; Сегмент данных |
|
|
|
||||
x1 |
dd |
4.8 |
|
|
|
|
|
x2 |
dq |
1.4 |
|
|
|
|
|
x3 |
dt |
5.2 |
|
|
|
|

Выражения: инфиксная и
постфиксная формы
|
|
|
Инфиксная |
a + b |
|
|
Постфиксная |
|
|
||
|
(обратная польская запись) |
|
+ |
+ |
a |
b |
a |
b |
|
Обход слева |
|
Обход снизу |
|
направо |
|
вверх |
a + b |
a b + |

Вычисление выражений
x=a+b*c-d/(a+b)
-
+ |
|
|
/ |
a |
* |
d |
+ |
b |
c |
a |
b |
abc*+dab+/-
fld a fld b fld c fmul fadd fld d fld a fld b fadd fdiv fsub fstp x