Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/2256: Рейтинг темы: голосов - 2256, средняя оценка - 4.63
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16381 / 7693 / 1080
Регистрация: 11.11.2010
Сообщений: 13,779
15.11.2013, 04:52  [ТС]
ГЛАВА 13
ПЕРЕХОДЫ И ЦИКЛЫ
(часть 5/5)

Регистр RFLAGS/EFLAGS
64/32-разрядный регистр RFLAGS/EFLAGS содержит некоторые флаги состояния и управления процессором, а также некоторые системные флаги (см. рисунок). После инициализации процессора, регистр флагов содержит значение 00000002h, его биты 1, 3, 5, 15 и от 22 до 31 зарезервированы и программы не должны их использовать.
Некоторые флаги регистра EFLAGS можно изменять непосредственно, при помощи специальных команд (они описаны ниже). Для загрузки значений флагов в регистр EFLAGS и считывания из него предназначены команды LAHF, SAHF, PUSHF, PUSHFD, POPF и POPFD. Значение любого флага всегда можно проверить, для этого нужно сохранить содержимое регистра EFLAGS в стек, затем извлечь его в регистр общего назначения и проверить командами TEST или BT. Изменить значения флагов можно путём загрузки его через стек из регистра общего назначения, но некоторые флаги таким образом изменить нельзя (например, двухбитовое поле IOPL в защищённом режиме).
Регистр EFLAGS автоматически сохраняется процессором в стек при дальних вызовах и восстанавливается из него при дальних возвратах; при переключении задач процессор сохраняет содержимое EFLAGS в TSS старой задачи и загружает значение из TSS новой.
До появления 32-разрядного процессора i386, регистр флагов был 16-разрядным и назывался FLAGS. Младшие 16 разрядов регистра EFLAGS, для совместимости со старыми программами, полностью аналогичны регистру FLAGS i8086, 8 младших разрядов которого, в свою очередь, аналогичны регистру FLAGS i8080.
Регистр EFLAGS представляет собой набор флагов, устанавливаемых или сбрасываемых по результатам выполняемых команд. Флаг – это переменная длиной 1 бит, используемая в командах условного перехода.
Если значение этой переменной равно 1, то считается, что флаг установлен, если 0 – сброшен. Флаги встречаются не только в регистре EFLAGS, в IA32 есть много регистров, целиком или частично состоящих из флагов – регистры управления, отладки, тестирования, MSR и так далее, поэтому термины «сброс» и «установка» флага употребляются везде, где идёт речь об изменении флагов.
Формат регистра флагов EFLAGS
Флаги состояния и флаг направления DF
Флаги состояния отображают результаты целочисленных арифметических операций (ADD, SUB, MUL и пр.), этими флагами являются биты 0, 2, 4, 6, 7 и 11 регистра EFLAGS (флаги CF, PF, AF, ZF, SF, OF).
Флаг переноса (CF – Carry flag). Устанавливается, если арифметическая операция приводит к переносу или займу в/из старшего разряда, таким образом, этот флаг показывает условие переполнения при выполнении арифметических операций. Также, этот флаг используется некоторыми командами сдвига – именно в него выдвигается «лишний» бит. Флаг CF наиболее удобно использовать при ветвлении программы, потому что, с одной стороны, множество команд взаимодействует с этим флагом, с другой стороны, простые команды условного перехода JC и JNC обеспечивают быстрый и компактный способ условной передачи управления.
Флаг чётности (PF – Parity flag). Устанавливается, если младший байт результата команды содержит чётное число бит, иначе – сбрасывается.
Вспомогательный флаг переноса (AF – Auxiliary carry Flag). Устанавливается, если арифметическая операция производит перенос из 3-го бита в 4-й бит в результате сложения, или при займе из 4-го бита в 3-й в результате вычитания, в остальных случаях сбрасывается. Этот флаг используется командами работающими с BCD-числами (AAA, AAS, AAD, AAM, DAA, DAS).
Флаг нуля (ZF – Zero flag). Устанавливается, если результат операции – нуль, иначе – сбрасывается.
Флаг знака (SF – Sign flag). Всегда равен значению старшего бита результата, который интерпретируется как знаковый в некоторых арифметических операциях (0 – число положительное /1 – отрицательное).
Флаг переполнения (OF – Overflow flag). Устанавливается, если знаковый результат операции не соответствует беззнаковому.
Из всех флагов состояния только флаг CF можно менять непосредственно командами STC, CLC и CMC. Также флаг CF используют команды BT, BTS, BTR, BTC сохраняя в него результат.
Флаги состояния используются командами арифметики трех типов – знаковой, беззнаковой и BCD:
  • для знаковой арифметики – флаги OF, SF;
  • для беззнаковой арифметики – флаг CF;
  • для BCD-арифметики – флаг AF.
Команды условного ветвления Jcc, SETcc, LOOPcc и CMOVcc используют один или несколько флагов состояния.
Флаг направления (DF – Direct flag) управляет командами строковой обработки (MOVS, CMPS, SCAS, LODS и STOS). Если DF сброшен, то строки обрабатываются в направлении от младших адресов к старшим; если DF установлен – обработка в обратном направлении (от старших адресов к младшим). Флаг явно изменяется командами STD и CLD.
Системные флаги и поле IOPL
Эти флаги предназначены для использования на системном уровне и подразумевается, что прикладные программы не должны менять их значения (а в защищённом режиме – не могут).
Флаг разрешения прерываний (IF – Interrupt enable flag). Управляет реакцией процессора на маскируемые аппаратные прерывания – если установлен, то в ответ на IRQ процессор генерирует прерывания, если сброшен – процессор не отвечает на них (но не игнорирует).
Флаг ловушки (TF – Trap flag). Если установлен, то процессор использует покомандную отладку текущей программы; если сброшен – программа выполняется обычным образом.
Поле привилегий для ввода/вывода (IOPL – In/Out Privilege Level field). Содержит для текущей задачи уровень привилегий для операций ввода/вывода. Текущий уровень привилегий (CPL – current privilege level) текущей задачи или программы должен быть численно меньше или равен значению в поле IOPL, для того, чтобы были возможны операции ввода/вывода. Это поле может меняться только командами POPF/POPFD и IRET и только на нулевом уровне привилегий.
Флаг вложенности задачи (NT – Nested Task flag). Устанавливается процессором, когда происходит переход из одной задачи в другую командой CALL или аппаратным прерыванием и показывает, что текущая задача либо является вызванной из предыдущей (флаг NT=1), либо нет (NT=0).
Флаг возобновления (RF – Resume flag). Управляет ответом процессора на исключение отладки.
Флаг режима виртуального процессора 8086 (VM – Virtual-8086 Mode flag). Когда устанавливается, процессор переходит в режим виртуального 8086, когда сбрасывается – возвращается в защищённый режим.
Флаг проверки выравнивания (AC – Alignment Check flag). Установка этого флага вместе с установленным флагом AM в CR0 заставляют процессор проверять выравнивание при доступе к памяти и в случае невыравненного доступа генерировать исключение.
Флаг виртуальных прерываний (VIF – Virtual Interrupt flag). Это виртуальный образ флага IF, используется совместно с флагом VIP при включённом расширении режима виртуального 8086.
Флаг ожидания виртуального прерывания (VIP – Virtual Interrupt Pending flag). Устанавливается, когда возникает прерывание. Процессором только считывается и используется совместно с флагом VIF; изменяется только программно.
Флаг идентификации (ID – Identification flag). Если программа смогла установить или сбросить этот флаг, то это значит, что процессор может выполнять команду CPUID.
Контрольные вопросы и упражнения
  1. Какое максимальное количество байтов могут обойти команды SHORT JMP и LOOP?
  2. Предположим, что регистры AX и BX содержат знаковые данные, а CX и DX – беззнаковые. Определите команды (где необходимо) и команды условного перехода для следующих проверок:
    1. значение в DX больше, чем в CX;
    2. значение в BX больше, чем в AX;
    3. CX содержит нуль;
    4. было ли переполнение;
    5. значение в BX равно или меньше, чем в AX;
    6. значение в DX равно или меньше, чем в CX?
  3. На какие флаги воздействуют следующие события и какое значение этих флагов:
    1. произошло переполнение;
    2. результат отрицательный;
    3. совпадение;
    4. обработка в пошаговом режиме;
    5. нулевой результат;
    6. передача данных должна быть справа налево?
  4. Напишите программу для вычисления 12 чисел Фибоначчи: 1, 1, 2, 3, 5, 8, 13,… (каждое число в последовательности представляет собой сумму двух предыдущих чисел). Для организации цикла используйте команду LOOP. Выполните ассемблирование, компоновку и с помощью отладчика трассировку программы.
  5. Напишите программу которая проверяет байт STATUS и переходит к ROUTINE_1, если биты 1, 3 или 5 содержат 1. В противном случае она переходит к ROUTINE_2, если оба бита 1 и 3 содержат 1, и к ROUTINE_3, если биты 1 и 3 содержат 0. Во всех остальных случаях программа переходит к ROUTINE_4. Считайте что подпрограммы ROUTINE_i имеют длину более 128 байт. Постройте схему программы.
  6. Считайте содержимое регистров DX:AX 32-битной величиной и напишите программу, загружающую в регистр BL номер младшего бита, который содержит 1.
  7. Напишите программу, которая вычисляет квадратный корень используя алгоритм последовательного приближения. Пусть X – число, из которого необходимо извлечь квадратный корень, а Y – предполагаемое значение его квадратного корня. Величина Y возводится в квадрат и сравнивается с X. Если Y2 > X, то Y уменьшается, а если Y2 < X, то Y увеличивается. Процедура повторяется, пока Y2 не станет приблизительно равным X. Автор программы должен сам решить, насколько Y2 должен быть близко к X, чтобы можно было прервать цикл.
  8. Напишите программу, которая вычисляет квадратный корень используя следующий алгоритм. Пусть https://www.cyberforum.ru/cgi-bin/latex.cgi?X – число, из которого необходимо извлечь квадратный корень, https://www.cyberforum.ru/cgi-bin/latex.cgi?Y – предполагаемое значение его квадратного корня, а https://www.cyberforum.ru/cgi-bin/latex.cgi?R_{1}=\frac{X}{Y}. На каждом шаге величина https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{Y+R_{n}}{2} возводится в квадрат и сравнивается с https://www.cyberforum.ru/cgi-bin/latex.cgi?X. Если https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{(Y+R_{n})^{2}}{4}\neq X, то https://www.cyberforum.ru/cgi-bin/latex.cgi?R_{n+1}=\frac{2X}{Y+R_{n}}. Процедура повторяется, пока https://www.cyberforum.ru/cgi-bin/latex.cgi?R_{n}^2 не станет приблизительно равным https://www.cyberforum.ru/cgi-bin/latex.cgi?X.
  9. Докажите, что при сравнении не может возникнуть такая комбинация флагов OF=1, SF=0, CF=1.
  10. Докажите, что при сравнении не может возникнуть такая комбинация флагов OF=1, SF=1, CF=0.
  11. Оцените время выполнения следующих эквивалентных программных фрагментов:
    1. Assembler
      1
      2
      3
      4
      5
      
       MOV ECX,100000
      NEXT: ADD EAX,[ECX]
      DEC ECX
      CMP EAX,0
      JNE NEXT
    2. Assembler
      1
      2
      3
      4
      
       MOV ECX,100000
      NEXT: ADD EAX,[ECX]
      DEC ECX
      JNZ NEXT
    3. Assembler
      1
      2
      3
      
       MOV ECX,100000
      NEXT: ADD EAX,[ECX]
      LOOP NEXT
  12. Напишите программу, вычисляющую сумму арифметической прогрессии первых 90 членов при условии, что первый член прогрессии https://www.cyberforum.ru/cgi-bin/latex.cgi?a=7, а разность прогрессии https://www.cyberforum.ru/cgi-bin/latex.cgi?d=7
  13. Напишите программу, вычисляющую сумму бесконечно убывающей геометрической прогрессии при условии, что первый член прогрессии https://www.cyberforum.ru/cgi-bin/latex.cgi?b=1, а знаменатель прогрессии https://www.cyberforum.ru/cgi-bin/latex.cgi?q=0,4.
  14. Напишите программу, вычисляющую сумму геометрической прогрессии первых 11 членов при условии, что первый член прогрессии https://www.cyberforum.ru/cgi-bin/latex.cgi?b=4, а знаменатель прогрессии https://www.cyberforum.ru/cgi-bin/latex.cgi?q=5.
  15. Напишите программу, которая по двум целым числам, введённым с клавиатуры, определяет:
    1. максимальное число;
    2. минимальное число.
  16. Напишите программу, которая по двум целым числам, введённым с клавиатуры, определяет: делится ли без остатка первое введённое число на второе.
  17. Напишите программу, которая по двум целым числам, введённым с клавиатуры соответственно в регистры AX и BX, делает следующее:
    • меняет значения AX и BX местами, если оба они больше 16;
    • уменьшает значения AX и BX на 16 в противном случае.
  18. Напишите программу, которая по координатам точки M(x,y), где x и y определяют номер квадранта, в котором она расположена.
  19. Напишите программу, которая по трём целым числам, введённым с клавиатуры, определяет:
    1. максимальное;
    2. минимальное.
  20. Напишите программу, которая устанавливает, образуют ли арифметическую прогрессию три целых числа, введённых с клавиатуры.
  21. Напишите программу, которая по заданным сторонам квадрата и прямоугольника определяет, какая из этих двух фигур (квадрат или прямоугольник) имеет большую площадь и периметр.
  22. Напишите программу, реализующую алгоритм нахождения модуля целого числа, введённого с клавиатуры.
  23. Напишите программу, которая по двум первым членам https://www.cyberforum.ru/cgi-bin/latex.cgi?a1 и https://www.cyberforum.ru/cgi-bin/latex.cgi?a2 арифметической прогрессии определяет сумму первых десяти её членов (при условии, что разность прогрессии https://www.cyberforum.ru/cgi-bin/latex.cgi?d=a2-a1 \neq 0 ).
  24. Напишите программу, которая по однобайтовым целым числам https://www.cyberforum.ru/cgi-bin/latex.cgi?a, https://www.cyberforum.ru/cgi-bin/latex.cgi?b, https://www.cyberforum.ru/cgi-bin/latex.cgi?c и https://www.cyberforum.ru/cgi-bin/latex.cgi?n (введённым с клавиатуры) определяет, будет ли функция https://www.cyberforum.ru/cgi-bin/latex.cgi?f(x)=a\cdot x^{2}+b\cdot x+c :
    • убывать на интервале https://www.cyberforum.ru/cgi-bin/latex.cgi?(-\infty;n);
    • возрастать на интервале https://www.cyberforum.ru/cgi-bin/latex.cgi?(n;+\infty).
  25. Напишите программу, которая по однобайтовым целым числам a, b и c (введённым с клавиатуры) определяет промежуток, на котором функция f(x)=ax2+bx+c :
    1. убывает;
    2. возрастает.
  26. Напишите программу, которая по однобайтовым целым числам a, b и c (введённым с клавиатуры) определяет количество действительных корней функции f(x)=ax2+bx+c.
  27. Напишите программу, которая по однобайтовым целым числам a, b и c (введённым с клавиатуры) определяет, будет ли функция f(x)=ax2+bx+c :
    • принимать отрицательные значения для каждого значения переменной x;
    • принимать положительные значения для каждого значения переменной x.
  28. Напишите программу, реализующую алгоритм возведения целого числа в квадрат без использования команды умножения.
    Указание. Квадрат любого натурального числа n можно представить в виде суммы n первых нечётных чисел, например:
    12=1
    22=1+3
    32=1+3+5
    42=1+3+5+7
    52=1+3+5+7+9
  29. Напишите программу, реализующую алгоритм вычисления целой части квадратного корня из натурального числа n.
    Указание Алгоритм решения задачи состоит в подсчёте количества нечётных чисел, последовательно вычитаемых из числа n с получением неотрицательного результата.
  30. Напишите программу, реализующую алгоритм умножения двух натуральных чисел без использования команд умножения.
  31. Напишите программу, реализующую алгоритм деления двух натуральных чисел без использования команд деления.
  32. Напишите программу разложения числа на два множителя: нечётное целое число и степень двойки, используя логические команды.
  33. Напишите программу для нахождения наименьшего числа из отрезка [2,k], на которое не делится число n (2https://www.cyberforum.ru/cgi-bin/latex.cgi?\leqk<n, где k и n – однобайтовые числа, вводимые с клавиатуры).
  34. Напишите программу для нахождения номера указанного числа в отрезке чисел. Отрезок и число для поиска вводятся с клавиатуры.
  35. Напишите программу, которая заданное натуральное число (введённое с клавиатуры) выводит в обратном порядке.
  36. Напишите программу для нахождения всех двухзначных чисел, записанных с помощью одной цифры.
  37. Напишите программу для нахождения всех двухзначных чисел, делящихся на 8 без остатка.
  38. Напишите программу для нахождения всех двухзначных чисел, оканчивающихся на 1.
  39. Напишите программу для нахождения всех двухзначных чисел, запись которых образует возрастающую последовательность цифр.
  40. Напишите программу выдающую все двухзначные числа, сумма цифр которых равна натуральному числу, введённому с клавиатуры.
  41. Напишите программу для нахождения всех двухзначных чисел, обладающих тем свойством, что удвоенная сумма их цифр равна их произведению.
  42. Напишите программу для нахождения всех двухзначных чисел, обладающих тем свойством, что они равны утроенному произведению своих цифр.
  43. Напишите программу для нахождения всех двухзначных чисел, сумма квадратов цифр которых делится на 17.
0
Закрытая тема Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru