- •Тема 1.
- •Понятия вычислительного процесса и Ресурса
- •Процессы и треды
- •Независимые и взаимодействующие вычислительные процессы
- •Прерывания.
- •Файловая система ntfs (New Technology File System)
- •Интерфейс прикладного программирования
- •Реализация функций api на уровне ос
- •Реализация функций api на уровне системы программирования
- •Реализация функций api с помощью внешних библиотек
- •Платформенно-независимый интерфейс posix
- •Семафорные примитивы Дейкстры
- •Мьютексы
- •Мониторы Хоара
- •Почтовые ящики
- •Конвейеры
- •Организация очереди на массиве
- •Очереди сообщений
- •Понятие тупиковой ситуации при выполнении параллельных вычислительных процессов
- •Студенты, не защитившие лабораторные работы, к сдаче зачетной единицы не допускаются
- •Общие сведения
- •Удаление элемента из списка.
- •Теоретическая часть (в популярном для студентов стиле).
- •0030:4012 (Всё шестнадцатиричное)
- •Выделение памяти.
- •(Каждый блок представляет байт)
- •Чтобы узнать, что происходит в памяти, при размещении и извлечении значений в стеке, см. На рисунок ниже:
- •Регистр eax почти всегда используется для хранения результата процедуры.
- •Строки.
- •Заполнение данными.
- •Все команды перехода имеют один операнд: смещение для перехода.
- •Организация циклов.
- •Имеются также другие формы:
- •Xor (не или) устанавливает бит результата в 1, если бит источника отличается от бита приемника. Not инвертирует бит источника.
- •Подпрограммы.
- •Структуры.
- •Упрощённый вызов api функций в tasm.
- •А вот и операторы, которые вы можете использовать:
- •Пример: команды ror (циклический сдвиг вправо)
- •Стековые операции.
cmp
x, y
Опкод
Значение(переход,если...)
Условие
JA
Jump
if above (X > Y)
CF=0&
ZF=0
JAE
Jump
if above or equal (X >= Y)
CF=0
JB
Jump
if below (X < Y)
CF=1
JBE
Jump
if below or equal (X < Y)
CF=1orZF=1
JC
Jump
if carry (cf=1)
CF=1
JCXZ
Jump
if CX=0
регистр
CX=0
JE
(то же, что и JZ)
Jump
if equal (X = Y)
ZF=1
JG
Jump
if greater (signed) (X > Y)
ZF=0
& SF=OF
JGE
Jump
if greater or equal (signed) (X >= Y)
SF=OF
JL
Jump
if less (signed) (X < Y)
SF
!= OF
JLE
Jump
if less or equal (signed) (X <= Y)
ZF=1
or SF!=OF
JMP
Безусловный
переход
-
JNA
Jump
if not above (X <= Y)
CF=1orZF=1
JNAE
Jump
if not above or equal (X < Y)
CF=1
JNB
Jump
if not below (X >= Y)
CF=0
JNBE
Jump
if not below or equal (X > Y)
CF=1&
ZF=0
JNC
Jump
if not carry (cf=0)
CF=0
JNE
Jump
if not equal (X != Y)
ZF=0
JNG
Jump
if not greater (signed) (X <= Y)
ZF=1
or SF!=OF
JNGE
Jump
if not greater or equal (signed) (X < Y)
SF!=OF
JNL
Jump
if not less (signed) (X >= Y)
SF=OF
JNLE
Jump
if not less or equal (signed) (X > Y)
ZF=0
& SF=OF
JNO
Jump
if not overflow (signed) (of=0)
OF=0
JNP
Jump
if no parity (pf=0)
PF=0
JNS
Jump
if not signed (signed) (sf=0)
SF=0
JNZ
Jump
if not zero (X != Y)
ZF=0
JO
Jump
if overflow (signed) (of=1)
OF=1
JP
Jump
if parity (pf=1)
PF=1
JP
Jump
if parity (pf=1)
PF=1
JPE
Jump
if parity even
PF=1
JPO
Jump
if parity odd
PF=0
JS
Jump
if signed (signed)
SF=1
JZ
Jump
if zero (X = Y)
ZF=1
Все команды перехода имеют один операнд: смещение для перехода.
Организация циклов.
Иногда надо организовать цикл, т.е. совершить повторение количество раз, которое указано в регистре ECX. Следовательно, надо у теле цикла уменьшать значение ECX. Именно для этого предназначена команда loop. Он проверяет, равен ли регистр ECX нулю, если он не равен нулю, то значение регистра ECX уменьшается на 1 и совершается ближний прыжок на смещение указанное в операнде.
Mov ecx, 023h repeat:
; обязательно ближнее расстояние
Loop repeat Тело цикла выполнится 23h раза.
Команда loope делает то же самое, но перед прыжком проверяет, установлен ли флаг ZF, если он установлен, то прыжок совершается. Точно тоже самое делает команда loopz. Команды loopne и loopnz делают то же сомое что и loope, но прыгают, если флаг ZF сброшен.
Арифметические операции - ADD, SUB, MUL, DIV. Многие опкоды делают вычисления. Вы можете узнать многие из них по их названиям: add (addition - добавление), sub (substraction - вычитание), mul (multiply - умножение), div (divide - деление).
Опкод add имеет следующий синтаксис: add приемник, источник
Выполняет вычисление: приемник = приемник + источник.
Имеются также другие формы:
приемник |
источник |
пример |
регистр |
регистр |
add ecx, edx |
регистр |
память |
add ecx, dword ptr [104h] / add ecx, [edx] |
регистр |
значение |
add eax, 102 |
память |
значение |
add dword ptr [401231h], 80 |
память |
регистр |
add dword ptr [401231h], edx |
Эта команда очень проста. Она добавляет значение источника к значение приемника и помещает результат в приемник. Другие математические команды:
sub приемник, источник (приемник = приемник - источник) mul множимое, множитель (множимое = множимое * множитель) div делитель (eax = eax / делитель, edx = остаток)
Поскольку регистры могут содержать только целочисленные значения (то есть числа, не, с плавающей запятой), результат деления разбит на частное и остаток. Теперь, в зависимости от размера источника, частное сохраняется в eax, а остаток в edx:
размер источника |
деление |
частное в... |
остаток в... |
BYTE (8-bits) |
ax / делитель |
AL |
AH |
WORD (16-bits) |
dx:ax* / делитель |
AX |
DX |
DWORD (32-bits) |
edx:eax* / делитель |
EAX |
EDX |
* = Например: если dx = 2030h, а ax = 0040h, dx: ax = 20300040h. Dx:ax - значение dword, где dx представляет старшее word, а ax - младшее. Edx:eax - значение quadword (64 бита), где старшее dword в edx и младшее в eax.
Источник операции деления может быть:
8-бит регистр (al, ah, cl,...)
16-бит регистр (ax, dx, ...)
32-бит регистр (eax, edx, ecx...)
8-бит значение из памяти (byte ptr [xxxx])
16-бит значение из памяти (word ptr [xxxx])
6a 32-бит значение памяти (dword ptr [xxxx])
Источник не может быть непосредственным значением, потому что тогда процессор не сможет определить размер исходного операнда.
Логические операции с битами - OR, XOR, AND, NOT-Эти команды работают с приемником и источником, исключение команда 'NOT'. Каждый бит в приемнике сравнивается с тем же самым битом в источнике, и в зависимости от команды, 0 или 1 помещается в бит приемника:
команда |
AND |
OR |
XOR |
NOT |
|||||||||||||
Бит источника |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
|||
Бит приемника |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
X |
X |
|||
Бит результата |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
AND (логическое И) устанавливает бит результата в 1, если оба бита, бит источника и бит приемника установлены в 1. OR (логическое ИЛИ) устанавливает бит результата в 1, если один из битов, бит источника или бит приемника установлен в 1.