Ассемблерная программа и ее структура

Компьютер понимает только один язык – язык машинных команд, структурированные комбинации последовательностей нулей и единиц. Поэтому программирование в машинных кодах – сложно, и было придумано средство, упрощающее программирование – Ассемблер.
Язык ассемблера, представляющий собой фактически символьную форму записи машинного языка: в нем вместо цифровых кодов операций выписывают привычные нам знаки операций или их словесные названия. Вместо адресов – применяют имена, а константы записывают в десятичной системе. Программу, записанную в таком виде, вводят в ПК и подают на вход транслятору, называемому ассемблером, который переводит ее на машинный язык, и далее полученную машинную программу выполняют.

Процесс разработки программы на ассемблере, включая постановку задачи, получение первых результатов и дальнейшее сопровождение программы, мало чем отличается от традиционного подхода с использованием любого из существующих языков программирования.

1) Постановка и формулировка задачи:

СТРУКТУРА ПРОЕКТА | СТРУКТУРА И ПОРЯДОК ВЫПОЛНЕНИЯ ПРОГРАММЫ | C# ОТ НОВИЧКА К ПРОФЕССИОНАЛУ Урок #2

-изучение предметной области и сбор материала в проблемно-ориентированном контексте;

-определение назначения программы, выработка требований к ней и представление требований, ели возможно, в формализованном виде;

-формулирование требований к представлению исходных данных и выходных результатов;

-определение структур входных и выходных данных;

-формирование ограничений и допущений на исходные и выходные данные.

2) Этап проектирования

-формирование «ассемблерной» модели задач;

-выбор метода реализации задачи;

-разработка алгоритма реализации задачи;

-разработка структуры программы в соответствии с выбранной моделью памяти.

3) Этап кодирования:

— уточнение структуры входных и выходных данных и определение ассемблерного формата их представления;

-комментирование текста и составление предварительного описания программы.

4) Этап отладки и тестирования:

-составление тестов для проверки работоспособности программы;

-обнаружение, локализация и устранение ошибок в программе, выявленных в тестах;

-корректировка кода программы и ее описания.

5) Этап эксплуатации и сопровождения:

-настройка программы на конкретные условия использования;

-обучение пользователей работе с программой;

-организация сбора сведений о сбоях в работе программы, ошибках в выходных данных, пожеланиях по улучшению интерфейса и удобства работы с программой;

-модификация программы с целью устранения выявленных ошибок и, при необходимости, изменения ее функциональных возможностей.

Главная цель формирования подобного списка работ – в том, чтобы изначально упорядочить процесс создания нового программного продукта с сохранением концептуальной целостности постановки задачи и исключения анархии в процессе разработки. Соблюдение всех пунктов необязательно и определяется конкретной поставленной задачей.

Для исполнения программы на ассемблере необходимо пройти следующие этапы:

Создание проекта в Visual Studio с ассемблерным модулем

1) ввести команды программы в компьютер с помощью редактора;

2) оттранслировать программу с помощью Ассемблера;

3) преобразовать результат работы Ассемблера в исполняемый модуль с помощью загрузчика (провести компоновку);

4) выполнить (вызвать на исполнение полученный исполняемый модуль).

Программа на Ассемблере состоит из последовательности предложений, каждое из которых занимает отдельную строку. Предложением может быть или команда, или псевдооператор языка ассемблер.

Команды представляют собой краткую нотацию системы команд микропроцессора, а псевдооператоры сообщают ассемблеру, что ему делать с командами и данными, которые вы вводите.

Каждая команда может иметь до четырех полей вида:

[Метка:] Мнемокод [Операнды] [;Комментарий ]

В квадратных скобках указываются необязательные поля. Метка и операнды указываются, когда требуются, комментарий ставится только для пояснений (если они необходимы)

Метка служит для присваивания имени команде. По ней на эту команду могут ссылаться другие команды программы. Метки могут содержать до 31 символа (латинские буквы и цифры, но первый символ — буква) и должны заканчиваться двоеточием.

Мнемокод содержит собственно наименование команды микропроцессора. Например, MOV – имя команды пересылки данных (move – переместить), или ADD – имя команды сложения (add – сложить).

В поле операндов сообщается микропроцессору, еде найти данные, подлежащие обработке. Например, в команде MOV CX,DX указывается, что содержимое регистра DX надо скопировать в регистр CX. Заметим, что если имеется два операнда, то первый из них есть приемник, а второй – источник.

15. Команда пересылки, арифметические команды и директивы определения данных на Ассемблере.

КОМАНДЫ ПЕРЕСЫЛКИ ДАННЫХ:

MOV приемник, источник.

Выполняется так: значение в источнике пересылается в приемник. В качестве источника и приемника данных могут выступать регистры или регистр и область памяти.

XCHG операнд1,операнд2.

Команда меняет местами содержимое регистров.

Команда сложения: ADD приемник, источник.

Выполняется она так: приемник складывается с источником и результат помещается в приемник.

INC источник – увеличение источника на 1;

DEC источник – уменьшение источника на 1.

Команда вычитания: SUB приемник, источник.

Выполняется так: из приемника вычитается источник и результат помещается в приемник.

Команда умножения: MUL источник

Действует она так:

а) при умножении байтов: Содержимое регистра AL умножается на источник и результат помещается в AX (AH – старший байт результата, AL –младший байт результата).

б) при умножении слов: Содержимое регистра AX умножается на источник и результат помещается в DX (старшее слово результата) и в AX (младшее слово).

Команда деления: DIV источник

а) при делении на байт (в операнде источнике). Делимое берется из AX и частное возвращается в регистре AL, а остаток – в регистре AH;

б) при делении на слово (в операнде источнике). Делимое берется из DX и AX и частное возвращается в регистре AX, а остаток – в DX.

Обычно в программе используются переменные и константы. Нужно указать их имена и значения. Это делается с помощью директив. Общий вид директивы:

[имя] название директивы [операнды]

имя – это и есть название константы или переменной, название директивы – служебное слово, операнды – значения для переменных или констант.

Директивы определения данных:

— директива DB (определяет данные размером в байт)

— директива DW (определяет данные размером в слово- 2 байта)

— директива DD (определяет данные размеров в двойное слово — 4 байта)

— Директива эквивалентности и присваивания: EQU Директива описывает константу. Указанному операнду дается указанное имя. При ассемблировании все вхождения указанного имени будут заменены на операнд.

16. Безусловный переход, команда сравнения и условного перехода и команда управления циклом на Ассемблере.

Если требуется нарушить порядок выполнения команд программы, то применяют переходы. Переходы бываю условными и безусловными.

БЕЗУСЛОВНЫЙ ПЕРЕХОД (jump): JMP op

Здесь в операнде указывают адрес перехода, т.е. адрес команды, которая должна быть выполнена следующей. При программировании на Ассемблере не обязательно указывать напрямую адрес перехода, достаточно лишь пометить нужную команду и в команде перехода указать ее метку. При переходах адрес может быть указан либо напрямую (непосредственно адресом, меткой), либо может быть указано место где находится адрес перехода. Таким местом может быть регистр общего назначения или слово памяти.

Читайте также:
Как установить вася диагност на ноутбук программу

Если переход осуществляется только при выполнении некоторого условия и не осуществляется в противном случае, то такой переход называется условным. Условный переход реализуют в два шага: сначала сравниваются некоторые величины, в результате чего соответствующим образом формируются флаги, а затем выполняется собственно условный переход в зависимости от значения флагов.

Источник: cyberpedia.su

Краткие теоретические сведения

Каждый язык программирования имеет свои особенности. Язык ассемблера — не исключение. Традиционно первая программа выводит приветственное сообщение на экран ‘Hello World’.

В отличие от многих современных языков программирования в ассемблерной программе каждая команда располагается на ОТДЕЛЬНОЙ СТРОКЕ. Нельзя разместить несколько команд на одной строке. Не принято, также, разбивать одну команду на несколько строк.

Язык ассемблера является РЕГИСТРОНЕЧУВСТВИТЕЛЬНЫМ.Т. е. в большинстве случаев нет разницы между большими и малыми буквами. Команда может быть ДИРЕКТИВОЙ — указанием транслятору. Они выполняются в процессе превращения программы в машинный код. Многие директивы начинаются с точки. Для удобства чтения программы они обычно пишутся БОЛЬШИМИ БУКВАМИ.

Кроме директив еще бывают ИНСТРУКЦИИ — команды процессору. Именно они и будут составлять машинный код программы.

Нужно отметить, что понятие «машинного кода» очень условно. Часто оно обозначает просто содержимое выполняемого файла, хранящего кроме собственно машинных команд еще и данные. В нашем случае это будет текст выводимого сообщения «Hello».

1.2 Особенности создания ассемблерной программы в среде DOS средствами TASM и MASM

Язык ассемблера является самым низкоуровневым языком программирования.Т. е. он ближе любых других приближен к архитектуре ЭВМ и ее аппаратным возможностям, позволяя получить к ним полный доступ. В отличие от языков высокого уровня (ЯВУ) ассемблерная программа содержит только тот код, который ВВЕЛ ПРОГРАММИСТ. Никаких дополнительных «обвязок». Вся ответственность за «логичность» кода ПОЛНОСТЬЮ лежит на узких плечах ПРОГРАММИСТА.

Простой пример. Обычно подпрограммы заканчиваются командой возврата. Если ее не задать явно, транслятор все равно добавит ее в конец подпрограммы. Ассемблерная подпрограмма без команды возврата НЕ ВЕРНЕТСЯ в точку вызова, а будет выполнять код, следующий за подпрограммой, как-будто он является ее продолжением. Еще пример. Можно попробовать «выполнить» данные вместо кода.

Часто это лишено смысла. Но если программист это сделает, транслятор промолчит. Язык ассемблера позволяет делать все! Тут нет НИКАКИХ ограничений. Но с другой стороны это часто является источником ошибок.

Эти особенности приводят к тому, что ассемблерные программы часто «подвешивают» компьютер, особенно у начинающих программистов.

Выделим три разновидности «зависания» по способу борьбы с ним.

Простое — для выхода из него достаточно нажать Ctrl+Break или Ctrl+C (сначала нажимается клавиша Ctrl и, НЕ ОТПУСКАЯ ее, нажимается вторая клавиша — C или Break; отпускаются в обратном порядке). Программа при этом аварийно завершается выходом в DOS.

Мягкое — машина не реагирует на Ctrl+Break, но клавиатура «дышит».Т. е. при нажатии на клавиши, типа NumLock, моргают соответствующие светодиоды. В этом случае машину нужно будет перегрузить, нажав Ctrl+Alt+Del. В среде Windows нужно просто «убить» сеанс, закрыв окно.

Жесткое — машина никак не реагирует на клавиатуру и не воспринимает комбинацию Ctrl+Alt+Del. В этом случае поможет аппаратный сброс при помощи кнопки «Reset», расположенной на передней панели системного блока. Не нужно ВЫКЛЮЧАТЬ и включать ЭВМ. Вы как будущие разработчики аппаратуры должны знать, что она выходит из строя в основном при включении и выключении.

1.3 Процесс обработки программы на языке ассемблера

Из-за своей специфики, а также по традиции, для программирования на языке ассемблера нет никаких сред-оболочек типа Turbo C, Turbo Pascal и т.д. Тут приходится пользоваться «утилитами командных строк», как 30 лет назад. Весь процесс технического создания ассемблерной программы можно разбить на 4 шага (исключены этапы создания алгоритма, выбора структур данных и т.д.).

Набор программы в текстовом редакторе и сохранение ее в отдельном файле. Каждый файл имеет имя и тип, называемый иногда расширением. Тип в основном используется для определения назначения файла. Например, программа на C имеет тип C, на Pascal — PAS, на языке ассемблера — ASM.

Обработка текста программы транслятором. На этом этапе текст превращается в машинный код, называемый объектным. Кроме того, есть возможность получить листинг программы, содержащий кроме текста программы различную дополнительную информацию и таблицы, созданные транслятором. Тип объектного файла — OBJ, файла листинга — LST. Этот этап называется ТРАНСЛЯЦИЕЙ.

Обработка полученного объектного кода компоновщиком. Тут программа «привязывается» к конкретным условиям выполнения на ЭВМ. Полученный машинный код называется выполняемым. Кроме того, обычно получается карта загрузки программы в ОЗУ. Выполняемый файл имеет тип EXE, карта загрузки — MAP.

Этот этап называется КОМПОНОВКОЙ или ЛИНКОВКОЙ.

Запуск программы. Если программа работает не совсем корректно, перед этим может присутствовать этап ОТЛАДКИ программы при помощи специальной программы — отладчика. При нахождении ошибки приходится проводить коррекцию программы, возвращаясь к шагу 1. Таким образом, процесс создания ассемблерной программы можно изобразить в виде следующей схемы. Конечной целью, напомним, является работоспособный выполняемый файл HELLO. EXE.

Источник: kazedu.com

Ассемблер и язык ассемблера

§ 1.1. Ассемблер и язык ассемблера «Сердцем» компьютера является процессор. С точки зрения программирования процессор – это «маленькая коробка», которой можно посылать команды и ждать результат.

Для того чтобы процессор мог исполнить программу, исходный текст программы должен преобразовываться (кем? – системой программирования) в исполняемый модуль – именно он будет загружаться в память на выполнение. Исполняемый модуль (исполняемая программа) – это последовательность кодов команд процессора и кодов данных, то есть последовательность чисел (в двоичном коде) – машинный код.

Пример: exe-файлы. Язык ассемблера – это ЯП, позволяющий писать исходную программу непосредственно на уровне команд процессора – это ЯП низкого уровня. Инструкции (команды) языка ассемблера соответствуют командам процессора: каждой команде процессора сопоставлена англоязычная аббревиатура (инструкция) языка ассемблера.

Существуют различные модели процессоров со своим собственным набором команд. Þ Существуют разновидности (диалекты) языка ассемблера. Не важно, язык какого именно ассемблера изучать. Главное понять принцип работы на уровне команд процессора. Тогда не составит труда освоить не только другой язык ассемблера, но и любой другой процессор со своим набором команд.

В лекциях рассматривается система команд процессоров Intel. Трансляция (ассемблирование) – преобразование записанных на языке ассемблера инструкций и данных в машинные коды. Ассемблер – программа-транслятор – программа, которая выполняет трансляцию в машинные коды.

Дизассемблер – программа, выполняющая обратную задачу: переводит машинные коды в ассемблерные инструкции. int i = 5; mov dword ptr [i], 5 c7 45 f8 05 int j = 2; mov dword ptr [j], 2 c7 45 ec 02 j = j + i; mov eax, dword ptr [j] 8b 45 ec add eax, dword ptr [i] 03 45 f8 mov dword ptr [j], eax 89 45 ec Отличие ассемблеров от компиляторов Трансляторы с языка ассемблера и компиляторы с ЯПВУ выполняют одну задачу: получить машинный код из исходного текста программы. Принципиальное отличие: • Транслятор преобразует одну инструкцию языка ассемблера в одну машинную команду – преобразование «один к одному». • Компилятор с ЯПВУ преобразует один оператор языка в последовательность из нескольких машинных команд – преобразование «один к нескольким».

Читайте также:
Программа чтобы восстановить сообщения в контакте

Чем «выше» уровень ЯП, тем к большему числу команд процессора будут преобразовываться операторные конструкции языка. Кроме инструкций для процессора, в языке ассемблера есть служебные указания для транслятора – директивы. Их используют в исходном тексте программы для описания её структуры, форматов данных, управления трансляцией и т.д.

Место языка ассемблера в программировании 1. Там, где нужен прямой программный доступ к памяти и аппаратуре. 2. Для создания минимальной по размеру и/или минимальной по времени исполнения программы. С помощью ассемблерных вставок часто оптимизируют отдельные фрагменты программ на ЯПВУ.

На практических занятиях программы на языке ассемблера необходимо будет реализовать как ассемблерные вставки на языке C/C++. 3. Это инструмент анализа исполняемых программ при отсутствии их исходных текстов.

4. Это уникальный учебный инструмент для понимания механизмов взаимодействия процессора с памятью и устройствами вычислительной системы. #include int main() < int i = 5; int j = 2; //j = j + i; _asm< mov eax,i add eax,j mov i,eax >printf(«%i», i); return 0; > Часто вместо «язык ассемблера» говорят «ассемблер». § 1.2. Представление данных Двоичная система счисления Чтобы отличать двоичные числа от десятичных, в ассемблерных программах в конце каждого двоичного числа ставят букву «b».

10010110b = 1×27+0×26+0×25+1×24+0×23+1×22+1×21+0×20 = 150 Остаток Разряд 150/2 = 75 75/2 = 37 37/2 = 18 18/2 = 9 9/2 = 4 4/2 = 2 2/2 = 1 1/2 = 0 1 1 1 1 1 2 3 4 5 6 7 Результат: 10010110b 1 1 1 1 7 6 5 4 3 2 1 байт 1 1 1 1 15 8 7 слово старший байт младший байт aдрес (x+1) aдрес (x) Шестнадцатеричная система счисления В ассемблерных программах при записи чисел, начинающихся с А, В, С, D, E, F, в начале приписывается цифра 0, чтобы нельзя было спутать такое число с названием переменной или другим идентификатором. После шестнадцатеричных чисел ставится буква «h».

1 2 3 4 5 6 7 0000b 0001b 0010b 0011b 0100b 0101b 0110b 0111b 0h 1h 2h 3h 4h 5h 6h 7h 8 9 10 11 12 13 14 15 1000b 1001b 1010b 1011b 1100b 1101b 1110b 1111b 8h 9h 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh Перевод в двоичную систему и обратно: вместо каждой шестнадцатеричной цифры подставляют соответствующее четырехзначное двоичное число: 10010110b = 96h 0ADh = 10101101b 16 = 10000b = 10h Целые числа со знаком Для представления отрицательных чисел существует специальная операция, известная как дополнение до двух. Для изменения знака числа выполняют инверсию, то есть заменяют в двоичном представлении числа все единицы нулями и нули единицами, а затем прибавляют 1. 150 = 0000000010010110b = 0096h инверсия дает: 1111111101101001b +1 = 1111111101101010b = 0FF6Ah Проверим, что полученное число на самом деле -150: сумма с +150 должна, быть равна нулю: +150 + (-150) = 0096h + 0FF6Ah = = 10000h = 10000000000000000b Единица в l6-м разряде не помещается в слово, и значит, мы действительно получили 0. § 1.3.

Организация памяти Структура вычислительной системы: • Байты памяти, • регистры и • порты контроллеров – «источники» данных для системы команд процессора. Память – последовательность байт – единое адресное пространство. Каждый байт имеет уникальный (физический) адрес: 0, 1, 2, 3, и т.д. Байт – минимальная «единица» чтения или записи в память.

Регистры – специальные ячейки высокоскоростной памяти, расположенные физически внутри процессора. Доступ к регистрам осуществляется не по адресам, а по именам. Разрядность регистров: 8, 16, 32, 64 бит. Порты – это регистры внутри контроллеров. Разрядность: 8 бит.

С памятью процессор связан несколькими шинами: • На шину адреса процессор «выставляет» адрес памяти. • По шине данных затем считывает данные из памяти в регистр или записывает из регистра в память. От разрядности шины адреса зависит объем памяти, которую может адресовать процессор: 2N байтов, где N – разрядность адресной шины.

Для процессоров с 32-разрядной адресной шиной объем физически адресуемой памяти составляет 232 байтов (4 Гб): от 0 до 232 – 1 . Чтение из памяти слова, начиная с адреса 120: Основные принципы архитектуры фон-Неймана: 1. Линейное пространство памяти: оперативная память представляет собой совокупность ячеек с последовательной нумерацией (физическими адресами) 0, 1, 2, . 2. Принцип хранимой программы: код программы и ее данные находятся в одном и том же адресном пространстве памяти. 3. Отсутствие разницы между данными и командами в памяти: с точки зрения процессора и данные, и команды – это последовательности 0 и 1. 4. Последовательное выполнение программы.

Процессор после включения питания оказывается в режиме реальной адресации памяти, или просто реальном режиме. Операционная система переводит его в защищенный режим, позволяющий обеспечивать многозадачность, распределение памяти и др.

Пользовательские программы часто работают в виртуальном режиме, из которого им доступно все то же, что и из реального, кроме инструкций, относящихся к управлению защищенным режимом. Измерение объемов памяти в более крупных единицах: 1 Килобайт = 1024 байтов (210 байтов), 1 Мегабайт = 1024 Кб (220 байтов); 1 Гигабайт = 1024 Мб (230 байтов); 1 Терабайт = 1024 Гб (240 байтов). § 1.4.

Регистры Группа регистров Назначение 1. Основные 1.1. Общего назначения (8): eax, ebx, ecx, edx, esi, edi, ebp, esp Хранение данных и адресов 1.2. Сегментные (6): cs, ds, es, fs, gs, ss Хранение адресов сегментов памяти 1.3.

Состояния и управления (2): eip, eflags 2. Сопроцессора: sf(0), sf(1), …, sf(7) Работа с числами с плавающей точкой 3. MMX-расширения 4. Системные Регистры общего назначения eax/ax/ah/al ebx/bx/bh/bl ecx/cx/ch/cl edx/dx/dh/dl esi/si edi/di ebp/bp esp/sp Младшие 16 бит каждого из 32-разрядных (32-битных) регистров общего назначения могут использоваться как самостоятельные регистры и имеют имена. Отдельные байты в первых четырех 16-битных регистрах тоже имеют свои имена и могут использоваться как 8-битные регистры. -x e- -h -l 31 16 15 8 7 Буквы в названии регистра и их обозначения e- Extended – 32 бита -h High – старшие 8 бит -x eXtended – 16 бит -l Low – младшие 8 бит eax, ebx, ecx, edx могут использоваться для хранения данных и адресов.

Названия этих регистров происходят от того, что некоторые инструкции применяют их специальным образом: • либо использование какого-то регистра обязательно, • либо происходит неявно. Аккумулятор (Accumulator register) ax eax ah al 31 16 15 8 7 Для хранения промежуточных данных. В некоторых инструкциях используется обязательно.

База (Base register) bx ebx bh bl 31 16 15 8 7 Для хранения базового адреса некоторого объекта в памяти. Счетчик (Count register) cx ecx ch cl 31 16 15 8 7 В инструкциях, производящих повторяющиеся действия. Регистр данных (Data register) dx edx dh dl 31 16 15 8 7 Применяется для хранения промежуточных данных.

Читайте также:
Программа подготовки пожарной команды

Следующие 4 регистра имеют более конкретное назначение и могут применяться для хранения всевозможных временных данных, только когда они не используются по назначению. Индекс источника (Sourse Index register) esi si 31 16 15 Индекс приемника (Destination Index register) edi di 31 16 15 esi и edi используются в паре в строковых (цепочечных) инструкциях: esi содержит текущий адрес элемента в цепочке-«источнике», edi содержит текущий адрес элемента в цепочке-«приемнике».

Указатель базы (Base Pointer register) ebp bp 31 16 15 Указатель стека (Stack Pointer register) esp sp 31 16 15 ebp и esp используются при работе со стеком: esp содержит адрес вершины стека. Сегментные регистры Сегментированная модель памяти: программы работают с памятью как с несколькими непрерывными последовательностями байт – сегментами.

Для задания физического адреса байта требуется два числа: • адрес начала сегмента – база (селектор), • адрес байта внутри сегмента – смещение (эффективный адрес). физический адрес = база : смещение Процессор аппаратно поддерживает организацию программы в виде 3-х частей: сегмент стека, сегмент кода и сегмент данных. 1) сегмент стека – содержит временные данные (параметры вызываемых подпрограмм, локальные переменные, адреса возврата); 2) сегмент кода – содержит команды исполняемой программы; 3) сегмент данных – содержит обрабатываемые программой данные.

Сегментные регистры содержат адреса памяти, с которых начинаются соответствующие сегменты. Регистр сегмента стека (Stack Segment register) ss 15 Регистр сегмента кода (Code Segment register) cs 15 Регистры сегмента данных (Data Segment register) ds es fs gs 15 Регистр eip и адресное пространство памяти Адрес «следующей выполняемой команды» всегда хранится в специальном регистре eip (относится к регистрам состояния и управления).

Программисту не доступен. Указатель команды Instruction Pointer register eip ip 31 16 15 После чтения команды из памяти значение в eip аппаратно увеличивается на длину прочитанной команды в байтах. Если быть точнее, в eip хранится не физический адрес, а смещение следующей выполняемой команды.

В регистре esp также хранится смещение, а не физический адрес. сs:eip – физический адрес следующей выполняемой команды ss:esp – физический адрес вершины стека При записи в стек значение смещения уменьшается, то есть стек растет вниз от максимально возможного адреса. При вызове подпрограммы параметры в большинстве случаев помещают в стек, а в ebp записывают текущее значение esp.

Тогда, если подпрограмма использует стек для хранения локальных переменных, esp изменится, но ebp можно будет использовать для того, чтобы считывать значения параметров напрямую из стека (их смещения будут записываться как ebp + номер параметра). Регистр флагов Используется при выполнении большинства инструкций (относится к регистрам состояния и управления).

Регистр флагов (Flag register) eflags flags 31 16 15 В этом регистре каждый бит является флагом: устанавливается в 1 при определенных условиях или установка его в 1 изменяет поведение процессора. Младшее слово регистра флагов (регистр flags) nt iopl of df if tf sf zf af pf 1 cf 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 cf – флаг переноса.

Устанавливается в 1, если результат выполненной арифметической операции не уместился в «приемнике» и произошел перенос из старшего бита или если требуется заем (при вычитании), иначе устанавливается в 0. При работе с числами без знака равенство 1 сигнализирует об ошибке. zf – флаг нуля. Устанавливается в 1, если результат выполненной инструкции равен нулю. sf – флаг знака.

Этот флаг всегда равен старшему биту результата. of – флаг переполнения. Этот флаг устанавливается в 1, если результат выполненной арифметической операции над числами со знаком выходит за допустимые для них пределы. При работе с числами со знаком равенство 1 сигнализирует об ошибке.

Перенос из разрядной сетки Перенос в знаковый бит Флаги + + cf = 1, of = 0 + — cf = 1, of = 1 — + cf = 0, of = 1 — — cf = 0, of = 0 Пусть складываются два числа со знаком 110 = 012 + -110 = 112 (в дополнительном коде) 0 = 1002 (+ +) cf = 1, of = 0 ошибки нет 110 = 012 + 110 = 012 2 ? 112 = -110 (- +) cf = 0, of = 1 ошибка 30566 = 0111011101100110b + 30566 = 0111011101100110b 61132 = 1110111011001100b (- +) cf = 0, of = 1 Произошел перенос из 14-го разряда, из 15-го разряда переноса нет. Ошибка, т.к. переполнение: 16-битное число со знаком максимум +32767. -30566 = 1000100010011010b + -04875 = 1110110011110101b -35441 = 10111010110001111b (+ -) cf = 1, of = 1 Произошел перенос из 15-го разряда.

Ошибка, так как старший бит 0 и ответ получился положительным. -4875 = 1110110011110101b + -4875 = 1110110011110101b -9750 = 11101100111101010b (+ +) cf = 1, of = 0 Есть переносы из 14-го и 15-го разрядов. Ошибки нет. pf – флаг четности (паритета).

Устанавливается в 1, если младший байт результата выполненной команды содержит четное число бит, равных 1; устанавливается в 0, если число единичных бит нечетное. af – флаг полупереноса или вспомогательного переноса. Устанавливается в 1, если в результате выполнения команды произошел перенос (или заем) из третьего бита в четвертый.

Этот флаг используется автоматически командами двоично-десятичной коррекции. tf – флаг трассировки. Этот флаг был предусмотрен для работы отладчиков, не использующих защищенный режим. Установка его в 1 приводит к тому, что после выполнения каждой команды программы управление временно передается отладчику (вызывается прерывание № 1). if – флаг прерываний.

Установка этого флага в 1 приводит к тому, что процессор перестает обрабатывать прерывания от внешних устройств. Обычно его устанавливают на короткое время для выполнения критических участков кода. df – флаг направления. Этот флаг контролирует поведение команд обработки строк – когда он установлен в 1, строки обрабатываются в сторону уменьшения адресов, а когда = 0 – наоборот. Флаги iopl (уровень привилегий ввода-вывода) и nt (вложенная задача) применяются в защищенном режиме. Все флаги, расположенные в старшем слове регистра, имеют отношение к управлению защищённым режимом.

В закладки

Разместил пособие

den_nikulin_99

Эксперт по предмету «Программирование»

Поделись лекцией и получи скидку 30% на платформе Автор24

Заполни поля и прикрепи лекцию. Мы вышлем промокод со скидкой тебе на почту

Твоя лекция отправлена! Жди скидку на почте. Есть еще материалы? Загрузи прямо сейчас

Загрузить еще лекции

Поделись лекцией и получи промокод на скидку 30% на платформе Автор24

Заполни поля и прикрепи лекцию. Мы вышлем промокод со скидкой тебе на почту

Твоя лекция отправлена! Жди скидку на почте. Есть еще материалы? Загрузи прямо сейчас

Источник: spravochnick.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru