Последние записи
- Рандомное слайдшоу
- Событие для произвольной области внутри TImage
- Удаление папки с файлами
- Распечатка файла
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
1st
Сен
ASSEMBLER&WIN32. КУРС МОЛОДОГО БОЙЦА. УРОК 7.
Posted by key under assembler
Переходы (прыжки)
Cmp eax, ebx
Cmp edx, 045567890h
Cmp [ebx], esi
Cmp byte ptr [VALUE1], 045h
Регистр флагов.
Регистр флагов имеет набор флагов, которые устанавливаются или сбрасываются в зависимости от вычислений или других событий. Я не буду расказывать о всех, а только о некоторых важных:
ZF (Zero flag) Флаг нуля
Этот флаг устанавливается, когда результат вычисления нулевой (чтобы сравнить — фактически substraction без того, чтобы сохранить(экономить) результаты, но устанавливать флажки только). This flag is set when the result of a calculation is zero (сравнение это фактически вычитание без сохранения результата, и установка соответствующих флагов).
SF (Sign flag) Флаг знака
Если установлен, значит результат вычисления — отрицательное число.
CF (Carry flag) Флаг переноса
Флаг переноса, содержит крайний левый (старший) бит после вычислений.
OF (Overflow flag) Флаг переполнения
Указывает переполнение результата вычисления, т.е. результат больше, приемник.
Есть еще большое колличество флагов (флаг паритета (pf), вспомогательный флаг переноса (af), флаг трассировки (tf), флаг прерывания (if), флаг управления (df), флаг уровня привилегий ввода/вывода (iopl) , флаг вложенности задачи (nt), флаг возобновления (rf), флаг виртуального режима (vm)) но так как мы не будем их использовать, я не буду о них рассказывать.
Прыжки.
Приведу пример самой распространённой команды условного перехода jz:
Cmp eax, 42h
Jz metka2
Если регистр eax равен 42, то управление передастся первой команде после метки metka2.
Также есть команда безусловного перехода — jmp. Она передаёт управление в любом случае. Вы скажете: «Для этого нужна команда call». Я отвечу: «Команда call пихает в стек адрес возврата, а jmp не трогает стек». Условные переходы могут делать только ближний прыжок, а команда jmp может делать и короткий и дальний прыжки. Вот таблица всех условных переходов.
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=1 or ZF=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=1 or ZF=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 сброшен.
С переходами разобрались. Разобрались не только с переходами, но и с циклами. Продолжаем изучение ассемблера, читаем следующий урок.
Programming articles
Создание сайтов на шаблонах
Множество вариантов работы с графикой на канве
Шифруем файл с помощью другого файла
Перехват API функций — Основы
Как сделать действительно хороший сайт
Создание почтового клиента в Delphi 7
Применение паскаля для
решения геометрических задач
Управление windows с помощью Delphi
Создание wap сайта
Операционная система unix, термины и понятия
SQL враг или друг
Возникновение и первая редакция ОС UNIX
Оптимизация проекта в Delphi
Ресурсы, зачем нужны ресурсы
Термины программистов 20 века
Советы по созданию собственного сайта с нуля
Шифруем файл с помощью пароля
Фракталы — геометрия природы
Crypt — Delphi программа для шифрования
Рассылка, зачем она нужна и как ее организовать?
Учебник по C++ для начинающих программистов
Уроки для изучения ассемблера
Загадочный тип PCHAR
Средства по созданию сайтов
Операторы преобразования
классов is и as
Borland Developer studio 2006. Всё в одном
Создание базы данных в Delphi, без сторонних БД
Software engineering articles
Случайные статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)