- •Тема 1.
- •Понятия вычислительного процесса и Ресурса
- •Процессы и треды
- •Независимые и взаимодействующие вычислительные процессы
- •Прерывания.
- •Файловая система ntfs (New Technology File System)
- •Интерфейс прикладного программирования
- •Реализация функций api на уровне ос
- •Реализация функций api на уровне системы программирования
- •Реализация функций api с помощью внешних библиотек
- •Платформенно-независимый интерфейс posix
- •Семафорные примитивы Дейкстры
- •Мьютексы
- •Мониторы Хоара
- •Почтовые ящики
- •Конвейеры
- •Организация очереди на массиве
- •Очереди сообщений
- •Понятие тупиковой ситуации при выполнении параллельных вычислительных процессов
- •Студенты, не защитившие лабораторные работы, к сдаче зачетной единицы не допускаются
- •Общие сведения
- •Удаление элемента из списка.
- •Теоретическая часть (в популярном для студентов стиле).
- •0030:4012 (Всё шестнадцатиричное)
- •Выделение памяти.
- •(Каждый блок представляет байт)
- •Чтобы узнать, что происходит в памяти, при размещении и извлечении значений в стеке, см. На рисунок ниже:
- •Регистр eax почти всегда используется для хранения результата процедуры.
- •Строки.
- •Заполнение данными.
- •Все команды перехода имеют один операнд: смещение для перехода.
- •Организация циклов.
- •Имеются также другие формы:
- •Xor (не или) устанавливает бит результата в 1, если бит источника отличается от бита приемника. Not инвертирует бит источника.
- •Подпрограммы.
- •Структуры.
- •Упрощённый вызов api функций в tasm.
- •А вот и операторы, которые вы можете использовать:
- •Пример: команды ror (циклический сдвиг вправо)
- •Стековые операции.
Xor (не или) устанавливает бит результата в 1, если бит источника отличается от бита приемника. Not инвертирует бит источника.
Пример:
mov ax, 3406d mov dx, 13EAh xor ax, dx
ax = 3406 (десятичное), в двоичном - 0000110101001110.
dx = 13EA (шестнадцатиричное), в двоичном - 0001001111101010.
Выполнение операции XOR на этими битами:
Источник = 0001001111101010(dx)
Приемник = 0000110101001110 (ax)
Результат = 0001111010100101 (новое значение в ax)
Новое значение в ax, после выполнения команды - 0001111010100101 (7845 - в десятичном, 1EA5 - в шестнадцатиричном).
Другой пример:
mov ecx, FFFF0000h not ecx
FFFF0000 в двоичном это - 11111111111111110000000000000000 Если вы выполните инверсию каждого бита, то получите: 00000000000000001111111111111111 , в шестнадцатиричном это 0000FFFF Значит после операции NOT, ecx будет содержать 0000FFFFh.
Увеличение/Уменьшение - INC/DEC. Есть 2 очень простые команды, DEC и INC. Эти команды увеличивают или уменьшают содержимое памяти или регистра на единицу. Просто поместите:
inc регистр ; регистр = регистр + 1 dec регистр ; регистр = регистр - 1
inc dword ptr [103405] ; значение в [103405] будет увеличено на 1. dec dword ptr [103405] ; значение в [103405] будет уменьшено на 1.
Ещё одна команда сравнения - test. Команда Test выполняет операцию AND (логическое И) с двумя операндами и в зависимости от результата устанавливает или сбрасывает соответствующие флаги. Результат не сохраняется. Test используется для проверки бит, например в регистре:
test eax, 100b jnz смещение
Команда jnz выполнит переход, если в регистре eax третий бит справа - установлен. Очень часто комманду test используют для проверки, равен ли регистр нулю:
test ecx, ecx jz смещение
Команда jz выполнит переход, если ecx = 0.
Ничего не делающая команда - nop. Эта команда не делает абсолютно ничего (пустая команда). Она только занимает пространство и время. Используется для резервирования места в сегменте кода или организации
программной задержки.
Обмен значениями - XCHG. Команда XCHG также весьма проста. Назначение: обмен двух значений между регистрами или между регистрами и памятью:
mov eax , 237h mov ecx, 978h xchg eax, ecx в результате: eax = 978h ecx = 237h
На этом уроке я вам расскажу про подпрограммы и структуры. Подпрограмма по-простому это процедура (или функция: без разницы, язык Pascal дал этим терминам разные определения), а структура это запись.
Подпрограммы.
Подпрограммы удобны, когда некоторое действие повторяется несколько раз в программе. Процедуры делают программу более читабельной и надёжнее, в такой программе легче устранять ошибки и улучшать.
Процедуры задаются директивами proc и endp. Proc обозначает начало процедуры, а endp конец процедуры. Вот пример объявления процедуры:
SameProc proc
more code
Ret ; обязательно SameProc endp Вызов процедуры
Call SameProc
Если вызывающий использует, какие либо регистры и подпрограмме нельзя изменять их то для этого эти регистры надо сохранять в стеке.
SameProc proc Push ebx Push edi .. ..more code .... Mov esi, edx
.изменяем сохранённые регисты.... Pop edi Pop ebx Ret
SameProc endp
Специально для этого создана директива uses.
SameProc proc uses ebx,esi ..more code..
Mov esi, edx .изменяем сохранённые регисты..
Ret ; обязательно SameProc endp
И всё теперь вместо всяких "пушев" и "попов" ставите ret, TASM сделает всё за вас: в начале поставит "пуши" вместо ret поставит "попы" (извините за выражение) и ret.
Имя процедуры становится обычной меткой. Можно получать значение, на которое она указывает (обычно это значение равно опкоду первой инструкции процедуры), но изменить его получится, поскольку секция кода доступна только для чтения.
