1 Компоновка, редактирование и отладка программ Архитектура компьютера



бет1/2
Дата14.06.2016
өлшемі344.22 Kb.
#135087
  1   2


1 Компоновка, редактирование и отладка программ
1.1. Архитектура компьютера
Структурные схемы компьютеров мало чем отличаются у разных моделей компьютеров. У всех компьютеров есть оперативная память, процессор, внешние устройства. Различными являются способы, средства и используемые ресурсы, с помощью которых компьютер функционирует как единый механизм. Совокупность функциональных программно-управляемых свойств компьютера называют архитектурой.

Архитектура ЭВМ – это абстрактное представление ЭВМ, которое отражает структурную, схемотехническую и логическую организацию. Приступить к изучению языка ассемблера любого компьютера имеет смысл только после выяснения того, какая часть из вышеперечисленных аспектов архитектуры оставлена видимой и доступной для программирования. Это так называемая программная модель компьютера. В приложении 1 приведена программная модель микропроцессора Intel (Pentium III). Как видно из приведенной модели, ее основу составляют регистры общего назначения, состояния и ряд других. В разных моделях компьютеров одной и той же фирмы-производителя количество и разрядность регистров могут существенно изменяться. Но в качестве базовой модели для языка программирования микропроцессоров Intel используется 14-регистровая система, на которой остановимся далее подробнее.



Универсальные регистры AX, BX, CX, DX имеют разрядность 16 бит (2 байта) и могут использоваться для временного хранения любых данных, при этом можно работать с каждым регистром целиком, а можно отдельно с каждым его байтом. Старшие байты РОН имеют имена AH, BH, DH, CH, а младшие – AL, BL, DL, CL. Регистры AL, AH образуют соответственно младший и старший байты условного регистра AX.

Кроме того, каждый из РОН может использоваться как специальный регистр при выполнении некоторых команд программы:

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

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

регистр AH используется при умножении и делении байтов;

регистр BX, базовый регистр, часто используется при адресации данных в памяти;

регистр CX, счетчик, используется как счетчик числа повторений цикла и в качестве номера позиции элемента данных при операциях над строками. Регистр CL используется как счетчик при операциях сдвига и циклического сдвига на несколько битов;

регистр DX, регистр данных, используется при умножении и делении слов. Кроме этого используется в операциях ввода-вывода как номер порта.

В микропроцессорах Intel программы и данные хранятся в отдельных областях памяти - сегментах, с объемом до 64 КБ (килобайт). Одновременно микропроцессор может иметь дело с 4 сегментами, начальные адреса которых содержатся в сегментных регистрах CS, DS, SS, ES. Эти регистры выполняют следующие функции:

- регистр сегмента команд CS указывает на сегмент, содержащий текущую исполняемую программу. Для вычисления адреса следующей подлежащей исполнению команды процессор складывает значение CS умноженное на 16 с указателем команд IP;

- регистр сегмента стека SS указывает на текущий сегмент стека - области памяти предназначенной для временного хранения данных и адресов;

- регистр сегмента данных DS указывает на текущий сегмент данных, который обычно содержит используемые в программе переменные;

- регистр дополнительного сегмента ES указывает на текущий дополнительный сегмент, который используется при выполнении операций над строками.
Регистры смещений IP, SP,BP, SI, DI используются для хранения относительных адресов ячеек памяти внутри сегментов (иначе говоря, смещений относительно начала сегментов):


  • регистр IP хранит смещение адреса текущей команды программы;

  • регистр SP указывает на вершину стека – смещение относительно начала стека;

  • в регистр BP записывается начальный адрес поля памяти, непосредственно отведенного под стек;

  • регистры SI и DI предназначены для хранения адресов индексов источника и приемника данных при операциях над строками и другими структурами данных.

Регистр флагов FL представляет собой 16-битовый регистр, где фиксируется информация о текущем состоянии процессора.

15 0














OF

DF

IF

TF

SF

ZF




AF




PF




CF

Рисунок 1 – Регистр флагов

Флаг OF называется флагом переполнения и OF=1 свидетельствует о наличии ошибки в операциях над числами со знаком.

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

Флаг прерывания IF обычно он устанавливается в 1 и такое его значение позволяет исполняемой программе пользователя реагировать на прерывания. Однако, когда вызывается программа обработки прерывания, флаг IF устанавливается в 0, чтобы никакие другие прерывания не могли помешать текущей обработке прерывания.

Флаг TF называется флагом трассировки, при его значении, равном 1, разрешается выполнение программы по шагам.

Флаг знака SF устанавливается в 1, если в результате выполнения операции над числами со знаком, получается отрицательное число.

Флаг нуля ZF устанавливается в 1, если результатом операции является нулевое значение.

Флаг вспомогательного переноса АF используется в двоично-десятичной арифметике. Этот флаг устанавливается в 1, если результат такой операции не является десятичной цифрой.

Флаг четности РF устанавливается в 1, если результат операции имеет четное количество битов, равных 1, в двоичном представлении результата.

Флаг СF называется флагом переноса и в него заносится перенос (или заем) из знакового (старшего) разряда числа.



Нужно уяснить, что не все команды программы на Ассемблере устанавливают в 0 или в 1 флаги. Причем, выполнение тех или иных команд связано с установкой конкретных флагов. Обратите внимание на это обстоятельство при изучении команд ассемблера.
1.2. Последовательность формирования программы
У большинства существующих реализаций ассемблера нет интегрированной среды, подобной Turbo Pascal или Turbo C. Поэтому для выполнения функций по вводу кода программы, ее трансляции, редактированию и отладке необходимо использовать отдельные служебные программы.

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






Ассемблирова-ние (MASM)



Компоновка (LINK)

Отладка (TD, DEBUG)

Ввод текста





Рис. 2. Процесс обработки ассемблер-программы


В процессе формирования программы на языке ассемблера выделено 4 этапа:

Начальной процедурой создания программы на языке Ассемблера является ввод исходного текста программы в файл с расширением .asm. При этом может быть использован любой текстовый редактор, сохраняющий текст в виде стандартных кодов ASCII, например, редактор NC или блокнот. Основное требование к редактору, заключается в том, чтобы он (редактор) не вставлял посторонних символов (специальных символов форматирования).

Следующим шагом формирования программы является компиляция, которая носит специфическое название ассемблирование. Этот этап может быть выполнен программами ASM, MASM или TASM (сложность программ-компиляторов растет в указанной последовательности). Результатом выполнения этого этапа является программа в машинных кодах с расширением .obj, или, иначе, объектная программа, уже “понятная” микропроцессору. Естественно перевод состоится лишь в том случае, если исходный текст программы не содержит ошибок. Одновременно с объектным файлом могут быть созданы файлы листинга (*.lst ) и перекрестных ссылок (*.crf). Рекомендуется файл листинга создавать обязательно, поскольку при наличии ошибок в листинге описывается характер ошибки сразу после ошибочной команды, что значительно упрощает внесение исправлений, особенно на этапе обучения.

Файл листинга содержит код ассемблера исходной программы, машинный (объектный) код каждой команды и ее смещение в кодовом сегменте (значение регистра IP). Кроме того, сообщения о найденных синтаксических ошибках в программе помещаются непосредственно после ошибочной команды (бывают исключения, когда ошибка не в самой команде, а ранее нее, но эти ситуации встречаются редко). Строки в файле листинга имеют следующий формат:

<глубина_вложенности>, <номер_строки>, <смещение>, <машинный_код>, <исходный код>,

где <глубина_вложенности> - уровень вхождения программного блока (программы, модуля, макроопределения, процедуры) в файл, <номер_строки> - номер строки в файле листинга, он фигурирует в сообщениях об ошибках, но не обязательно совпадает с номером команды в исходном тексте, <смещение> - смещение в байтах текущей команды относительно начала сегмента кода, <машинный_код> - машинное представление команды ассемблера, записанной правее в той же строке в поле <исходный код> , а <исходный код> является не чем иным, как записанной Вами командой языка ассемблер.

Однако объектная программа еще не является законченной и исполняемой, т.к. в ней определены не все адреса (программа не является “перемещаемой”) и не объединены части (блоки) программы, которые могут транслироваться отдельно с целью более простой отладки. Преобразование объектной программы в исполняемую (компоновка) выполняется загрузчиком (редактором связей) LINK либо TLINK (в зависимости от используемой программы ассемблирования: для ASM, MASM – LINK, для TASM – TLINK).

Чтобы проверить работоспособность созданной программы и увидеть результаты ее работы (если не использован вывод на дисплей), применяют программу отладчик. Тестирование и отладка исполняемой программы выполняется отладчиком TD или DEBUG.

Отладчик td.exe, разработанный фирмой Borland International представляет собой оконную среду отладки программ на уровне исходного текста на языках Pascal, C, ассемблер. Основные возможности отладчика, наиболее широко используемые студентами - это:


  • выполнение трассировки программы в прямом направлении, при котором за 1 шаг выполняется одна машинная инструкция;

  • просмотр и изменения состояния аппаратных ресурсов микропроцессора во время командного выполнения программы.

Управлять работой отладчика можно с помощью системы меню двух типов:

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

  • локального, учитывающего особенности окон и становящегося активным щелчком правой мыши или нажатием клавиш Alt+F10.

Специфика программы на ассемблере в том, что делать выводы о правильности ее функционирования можно, отслеживая работу на уровне микропроцессора, обращая внимание на то, как изменяется состояние ресурсов микропроцессора и компьютера в целом. Общее поведение программы позволяет просмотреть режим безусловного выполнения, который вызывается нажатием клавиши F9. Однако для детального изучения работы программы рекомендуется применять режим выполнения программы по шагам, для вызова которых выбираются пункты меню Run -> Trace into (прерывание или внутренняя процедура будут выполняться по шагам) или Run -> Step over (вызов процедуры или прерывание отрабатываются как одна обычная команда). При этом используется окно CPU, вызов которого осуществляется через глобальное меню командой View -> CPU. Окно CPU состоит из 5 подчиненных окон:

  • окно с исходной программой в машинных кодах,

  • Register – окно регистров микропроцессора, отражающее текущее состояние регистров,

  • окно флагов, отражающее состояние флагов микропроцессора в соответствии с таблицей 1;

Таблица 1

Обозначения и значения флагов



Имя флага

Обозначение флага

Установлен

Сброшен

Флаг переполнения

O

1

0

Флаг направления

D

1

0

Флаг прерывания

I

1

0

Флаг знака

S

1(<0)

0(>0)

Флаг нуля

Z

1

0

Флаг вспомогатель-ного переноса

A

1

0

Флаг четности

P

1

0

Флаг переноса

C

1

0

  • окно стека, в котором отражается содержимое области памяти, отведенной для стека,

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

Рекомендуемый порядок работы с отладчиком:

а) вызвать на выполнение td.exe.;

б) выбрать файл исполняемой программы, набрав комбинации клавиш FILE ->OPEN и имя Вашей программы в окне запроса. После ответа OK на сообщение об отсутствии символьной таблицы в окно CPU загружается программа с нулевого адреса относительно начала сегментного регистра кодов (для приведенного в конце описания лабораторной работы примера это будет команда PUSH DS);

в) выбрать режим пошагового выполнения Run -> Step over. В окне CPU появляется окрашенный треугольник между относительным адресом команды и машинным кодом команды. Он показывает очередную команду, которая будет выполнена процессором после нажатия функциональной клавиши F8. Изменения, которые происходят в сегментных регистрах после выполнения команды, отмечаются белым цветом соответствующей строки в окне регистров. Пошаговый процесс выполнять до тех пор, пока не появится сообщение об окончании программы (с ключевым словом terminated);

г) после выполнения команд, связанных с изменением содержимого ячеек памяти, нужно просматривать эти изменения командой VIEW -> DUMP. При отсутствии мыши скрыть окно дампа памяти можно нажатием функциональной клавиши F6.
2 Режимы адресации
2.1. Команды ассемблера
Программа на языке ассемблера представляет собой последовательность операторов, описывающих выполняемые действия. Оператором (строкой) исходной программы может быть или команда, или псевдооператор (директива) ассемблера.

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

Команда может включать до 4-х полей следующего вида:

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

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

GETCOUNT: MOV CX,DX ;инициализация счетчика, поместить содержимое регистра DX в регистр CX

Пример команды с полем мнемокода:


PUSHF

Эта команда сохраняет в стеке содержимое регистра флагов.

Перечень команд ассемблера, применяемых во всех моделях микропроцессоров Intel приводится в приложении 2.

В качестве операнда в команде может фигурировать константа, которая может вводиться в следующих формах:

а) двоичной, как последовательность цифр 0 и 1, заканчивающихся буквой В, например, 10111010В;

б) десятичной, в привычной десятичной системе счисления с необязательной буквой D на конце, например, 129D или просто 129;

в) шестнадцатеричной, как последовательность цифр от 0 до 9 и букв от A до F, заканчивающаяся буквой H. Если шестнадцатеричная константа начинается с буквы, то такая константа дополняется первым символом - цифрой от 0 до 9, например, 0E23H (в данном случае первая цифра информирует Ассемблер о том, что E23 число, а не идентификатор или переменная);

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

Мнемокоды могут иметь от 2 до 6 букв, при трансляции мнемокод преобразуется в числовое значение по таблице перекодировки (внутри транслятора). Мнемокоды имеют жесткий формат, предусматривающий 1,2 или отсутствие операндов. Если операндов 2 , они отделяются друг от друга запятой.

Нельзя использовать в качестве меток имена регистров и мнемокоды, кроме того метка должна начинаться с буквы, но может содержать цифры и специальные символы: ?, @/, _, $ и точку, однако точка может быть только первым символом метки.

Важной особенностью машинных команд является то, что они не могут манипулировать одновременно 2-мя операндами, находящимися в оперативной памяти (ОЗУ). Это означает, что в команде только 1 операнд может указывать на ячейку ОЗУ, другой операнд должен быть либо регистром, либо непосредственным значением. По этой причине возможны следующие сочетания операндов в команде:

а) регистр - регистр;

б) регистр - память;

в) память – регистр;

г) регистр - непосредственный операнд;

д) память - непосредственный операнд.

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


2.2. Режимы адресации
Смещение, которое вычисляется операционным блоком для доступа к находящемуся в памяти операнду, называется исполнительным адресом операнда. Этот исполнительный адрес показывает, на каком расстоянии (в байтах) от начала сегмента располагается искомый операнд.

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

Различают адресацию операндов:

- непосредственную, которая заключается в указании в команде самого значения операнда, а не его адреса;



  • прямую, предполагающую указание в команде непосредственно исполнительного адреса;

  • косвенную, при которой в команде указывается адрес регистра или ячейки памяти, в которых хранится адрес операнда или его составляющие;

  • ассоциативную (используется в ассоциативных запоминающих устройствах, на ней останавливаться не будем);

  • неявную, когда адреса операндов в команде не указываются, а подразумеваются кодом операции.

Непосредственная адресация имеет место, если операнд-источник является константой или переменной, которой присвоено постоянное значение. Например:

MOV AX, 500 загружает значение 500 в РОН AX или

. . . . . . .

K EQU 1024

.. . . . . . . .

MOV CX, K загружает в РОН СХ константу 1024, определенную идентификатором К.

Следует отметить, что непосредственный операнд может быть задан простым выражением, в котором константы или идентификаторы констант связаны арифметическими операциями +, -, * или / (в таких выражениях не должно быть скобок). Например:

MOV AX, 156*10Н/2.

Следует помнить, что диапазон посылаемых чисел (значений непосредственного операнда) определяется вместимостью приемника - если это однобайтовый регистр (AH, AL, BL …), то в него можно посылать беззнаковые числа в диапазоне от 0 до 255, знаковые – от –128 до 127.

Прямая регистровая адресация имеет место в командах, оперирующих с содержимым РОН или сегментных регистров в качестве одного или обеих операндов команды. Например, команда:

MOV DS, AX

копирует содержимое РОН АХ в сегментный регистр DS, при этом содержимое регистра AX не изменяется.

При использовании этого вида адресации в программах необходимо следить, чтобы разрядности обеих регистров были одинаковы.



Прямая адресация ячеек ОП имеет несколько вариантов:

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

MOV AX, SOURCE

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




0001

SOURCE

ВВ

0002




АА

0003

SOURCE+2



После выполнения вышеуказанной команды пересылки регистр АХ будет содержать АХ=ААВВ.

Примеры прямой обычной адресации вы можете видеть в программе, приведенной в приложении 1.А;


  • прямая с индексированием: =+, причем находится в индексном регистре, например:

  • MOV AX, SOURCE[SI];

  • прямая с базированием: =+, находится в базовом регистре, например:

  • MOV AX, SOURCE[ВХ].

Такая адресация предназначена для доступа к данным с известным смещением относительно некоторого базового адреса, при этом исполнительный адрес получается путем сложения значения сдвига с содержимым регистров BX или BP. Например, таблица TABLE содержит поля фамилии (FAM 20 байт), имени (NAME 15 байт) и адреса (PLACE 50 байт). Тогда командами

MOV ВХ, 20

MOV AL, TABLE[ВХ]

получим в регистре AL первый байт имени.



  • прямая с индексированием и базированием: =++, например:

MOV AX, SOURCE[ВХ+SI].

Возможна и такая форма записи команды:

MOV AX, NUMBER [BP][SI].

Существует 2 варианта косвенной адресации ячеек ОП:



  • косвенная обычная, когда исполнительных адрес находится в регистре, например:

MOV AX, [BX].

Исполнительный адрес операнда может находиться в любом из сегментных регистров, кроме регистра стека (в базовом регистре BX, регистре указателя базы BP или индексном регистре SI или DI). Косвенный регистровый операнд заключается в квадратные скобки, что означает ”в качестве адреса брать содержимое того адреса, на который указывает заключенный в квадратные скобки регистр”. Чтобы адрес-смещение переменной мог оказаться в РОН, используется команда пересылки следующего вида:

MOV BX, offset SOURCE.

Функции этой команды заключаются в том, что смещение (offset) ячейки памяти с именем SOURCE помещается в РОН ВХ. Естественно, в программе эта команда должна предшествовать команде пересылки с косвенной адресацией.

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


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

MOV AX, [BX+SII].

Смешанная непосредственная адресация ячеек памяти имеет несколько вариантов:



  • непосредственная обычная:

MOV AX, offset pole.

Здесь в качестве непосредственного операнда берется смещение адреса переменной pole;

непосредственная с индексированием, когда в качестве исполнительного адреса операнда берется сумма значений индексного регистра и непосредственного смещения:

MOV AX, [SI+const],

причем смещение, обозначенное const, может быть задано числом, идентификатором константы, смещением адреса переменной (offset), или их комбинацией в виде простого выражения;


  • непосредственная с базированием, в которой, в отличие от предыдущей адресации, фигурирует базовый, а не индексный регистр:

MOV AX, [BX+const].

Форма записи смещения относительно базы может быть любой из 3-ех нижеприведенных:

MOV AX, [BX]+4 ,

MOV AX, 4[BX] ,

MOV AX, [BX+4].

Это примечание относится и к форме записи команд с индексированием (предыдущий вид адресации);



  • непосредственная с базированием и индексированием отличается тем, что для вычисления исполнительного адреса берется сумма базового и индексного регистра, к которым добавляется непосредственно фигурирующее в команде смещение:

MOV AX, pole[BX+SI+const].

Адресация с базированием и индексированием очень полезна при работе с двумерными массивами и таблицами. В ней исполнительный адрес вычисляется как сумма значений базового регистра, индексного регистра и (возможно) сдвига. В случае двумерного массива базовый адрес может содержать начальный адрес массива, а значения сдвига и индексного регистра могут содержать смещения по строке и столбцу. Допустимыми форматами команд являются следующие записи:

MOV AX, [BX+2+DI],

MOV AX, [DI+BX+2],

MOV AX, [BX+2][DI],

MOV AX, [BX+2+DI].



3 Программирование ветвлений и циклов
3.1. Команды условного перехода
Команды передачи управления реализуют изменение естественного порядка выполнения команд программы. Их можно разделить на 3 подгруппы, описание которых приведено в приложении 1 [5]. В мнемонические обозначения команд условного перехода входят буквы, которые определяют условия в соответствии с таблицей 1 [1]. В этой таблице операнд “метка перехода” или “близкая метка” отражает тот факт, что метка помеченной команды должна находиться в пределах текущего сегмента кода и на относительном расстоянии от команды перехода >-128 и < 127 байтов. Ограничение (–128..127) байтов снято у процессоров, начиная с модели 80386, однако ограничение передачи управления в пределах текущего сегментного кода действует и в моделях PENTIUM.

Таблица 1

Мнемокоды команд условного перехода

Буква мнемокода

Условие

Тип операндов

Е

равно

любые

N

Не равно

любые

G

больше

Числа со знаком

L

меньше

Числа со знаком

А

Выше, в смысле “больше”

Числа без знака

В

ниже, в смысле “меньше”

Числа без знака

Решение о том, куда будет передано управление командой условного перехода, принимается на основании условия. Источниками таких условий могут быть:


  • любая команда, изменяющая состояние арифметических флагов (ниже эти флаги будут перечислены);

  • команда сравнения CMP.

Формат команды CMP:

CMP приемник, источник или CMP операнд1, операнд2.

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

Таблица 2

Значения флагов, устанавливаемые командой CMP



Сравниваемые операнды

Флаги




OF

SF

ZF

CF

Операнды без знака

Источник < приемник


Н

Н

0

0


Источник = приемник

Н

Н

1

0

Источник > приемник

Н

Н

0

1

Операнды со знаком













Источник < приемник

0/1

0

0

H

Источник = приемник

0

0

1

H

Источник > приемник

0/1

1

0

H

В этой таблице приняты следующие обозначения:

- “H” означает, что ‘не имеет значения” или иначе, на этот флаг операция не влияет;

- 0/1 означает, что флаг устанавливается или в 1 или в 0 в зависимости от значений операндов (отрицательные или положительные или разнознаковые операнды сравниваются).

Приведем еще одну таблицу 3, в которой отражается действие команд условного перехода по значениям анализируемых этими командами флагов. В этой таблице через слеш ‘/’ перечисляются идентичные команды, действие которых совершенно одинаково, и применение конкретной из них зависит от пристрастий программиста. Наличие идентичных команд объясняется тем фактом, что если число_1 >число_2, то можно с уверенностью утверждать, что число_1 не (меньше или равно) число_2.


Таблица 3

Логика команд условного перехода



Тип операндов

Мнемокод команды

Критерий перехода

Значения флагов для перехода

любые

JE

Операнд_1=операнд_2

ZF=1

Любые

JNE

Операнд_1<>операнд_2

ZF=0

Со знаком

JL/JNGE

Операнд_1<операнд_2

SF<>OF

Со знаком

JLE/JNG

Операнд_1<=операнд_2

SF<>OF или ZF=1

Со знаком

JG/JNLE

Операнд_1>операнд_2

SF=OF и ZF=0

Со знаком

JGE/JNL

Операнд_1>=операнд_2

SF=OF

Без знака

JB/JNAE

Операнд_1<операнд_2

CF=1

Без знака

JBE/JNA

Операнд_1<=операнд_2

CF=1 или ZF=1

Без знака

JA/JNBE

Операнд_1>операнд_2

CF=0 и ZF=0

Без знака

JAE/JNB

Операнд_1=>операнд_2

CF=0


Достарыңызбен бөлісу:
  1   2




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет