Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Кафедра вычислительной техникиСтр 1 из 8Следующая ⇒
Кафедра вычислительной техники МАШИННО-ОРИЕНТИРОВАННЫЕ ЯЗЫКИ (микропроцессор 8088) Конспект лекций Для студентов специальности ЭВМ зс-2010 Иркутск 2010 г Оглавление Введение Предмет и задачи курса. Архитектура МП 8086. 3 Архитектура МП 8086. 3 ЛЕКЦИЯ №1 Язык Ассемблера МП 8080. Основные операторы. 8 Структура оператора. 9 Директивы определения данных. 10 ЛЕКЦИЯ №2 Система команд МП 8086. 11 Способы адресации операндов. 12 Команды передачи данных. 12 ЛЕКЦИЯ №3 Команды двоичной арифметики. 15 Арифметические команды языка ассемблера. 15 Команды преобразования данных. 18 ЛЕКЦИЯ №4 Программирование разветвлений. 18 Команда сравнения двоичных целых чисел. 18 Команды передачи управления. 18 Команды условного перехода. 19 Управление циклом.. 21 Лекция №5 Работа с массивами. 22 Основные понятия. Массив. Элемент массива. 22 Примеры составления программ работы с массивами. 23 Лекция № 6 Прерывания. 26 Векторы прерываний. 26 Контроллер 8259 фирмы Intel 26 Прерывание DOS int 21h: 28
Введение Предмет и задачи курса. Архитектура МП 8086
Современные компьютеры можно сравнить с существами, взаимодействующими с внешним миром на уровне большого, но ограниченного набора безусловных рефлексов. Этот набор рефлексов образует систему машинных команд. На каком бы высоком уровне вы не общались с компьютером, в конечном итоге все сводится к последовательности машинных команд. Каждая машинная команда является своего рода раздражителем для возбуждения того или иного безусловного рефлекса. Реакция на этот раздражитель всегда однозначная и “зашита” в блоке микрокоманд в виде микропрограммы. Эта микропрограмма и выполняет действия по реализации машинной команды, но уже на уровне сигналов, подаваемых на те или иные логические схемы компьютера, тем самым, управляя различными подсистемами компьютера. В этом состоит так называемый принцип микропрограммного управления. Машинно-ориентированное программирование появилось одновременно с созданием электронных вычислительных машин. Сначала это были программы в машинных командах. Таким образом, внешне являясь полиглотом, компьютер понимает только один язык — язык машинных команд. Конечно, для общения и работы с компьютером, необязательно знать этот язык, но практически любой профессиональный программист рано или поздно сталкивается с необходимостью его изучения. Еще в 50-е годы программисты стали использовать для программирования символический аналог машинного языка, который назвали языком ассемблера. Язык ассемблера является первой ступенью в автоматизации процесса программирования. Этот язык точно отражает все особенности машинного языка. Именно поэтому, в отличие от языков высокого уровня, язык ассемблера для каждого типа компьютера свой. Так как для компьютера язык ассемблера “родной”, то очевидно, и самая эффективная программа может быть написана только на нем (при условии, что ее пишет квалифицированный программист). Здесь есть одно маленькое “но”: это очень трудоемкий, требующий большого внимания и практического опыта процесс. Поэтому реально на ассемблере пишут в основном программы, которые должны обеспечить эффективную работу с аппаратной частью. Программы на языке Ассемблер (ЯА), разработанные квалифицированными программистами, по размеру компактны и выполняются быстрее программ, составленных на других языках. В то время как эффективность выходного кода компиляторов языков высокого уровня определяется качеством генераторов машинного кода. Иногда на ассемблере пишутся критичные по времени выполнения или расходованию памяти участки программы. Впоследствии они оформляются в виде подпрограмм и совмещаются с кодом на языке высокого уровня, которые имеют возможность включения вставок языка ассемблера (корректность вставки определяется знанием внутренних правил использования ресурсов процессора). В данном курсе будет рассматриваться язык Ассемблера персональных ЭВМ IBM PC Intel процессора 8086, это базовый язык всех моделей, начиная с 8088 и к старшим моделям процессоров данного семейства (286 ® 386 ® 486® Pentium), так как программы совместимы от младших моделей к старшим. Архитектура МП 8086 Принципиально все современные компьютеры базируются на архитектуре фон Неймана - совместное хранение данных и программы. Она включает в себя три основные составляющие: центральный процессор (ЦП, CPU- Cetnral Processing Unit), оперативное запоминающее устройство (ОЗУ) и внешние запоминающие устройства (ВЗУ). У семейства IBM PC ЦП и ОЗУ размещаются на материнской плате. На этой плате есть соответствующие разъемы, к которым может быть подсоединено огромное количество разнообразных ВЗУ: клавиатура, дисплей, дисководы, принтер, модем и прочие. Команды и данные находятся либо в ОЗУ, либо в ВЗУ. В случае, когда программа выполняется, она должна находиться в ОЗУ. Обмен информацией между процессором и ОЗУ происходит через адресную шину и/ или через шину данных в зависимости от вида обрабатываемой информации. От пропускной способности этих шин зависит скорость вычислений и размер адресуемой памяти. Для разработки эффективных программ языки программирования должны учитываться особенности аппаратуры вычислительного комплекса, возможность оперировать такими объектами, как биты, байты, слова, строки, сегменты, смещения, содержимое регистров, символы, целочисленные данные разной длины со знаком и без знака. Ниже приведена схема взаимодействия основных блоков процессора 8086.
Рис.1 Архитектура МП Использованы обозначения: ЦП – центральный процессор; АЛУ – арифметико-логическое устройство; УУ – устройство управления; ОЗУ – оперативно запоминающее устройство: Ув/в – устройство ввода-вывода. АЛУ предназначено для выполнения арифметических и логических операций, а также операций сравнения. В АЛУ имеются специальные ячейки, называемые регистрами, которые служат для приема и хранения данных, участвующих в выполняемой операции. Регистры микропроцессора 8086 бывают 8- и 16-разрядные, то есть максимальная разрядность -16 битов, следовательно, разрядность шины данных (ШД) тоже 16 бит. Оперативная память физически выполнена в виде микросхем и предназначена для временного хранения программ и данных.ОЗУ можно представить в виде ячеек( байтов), каждая из которых имеет свой номер. Максимальный объем оперативной памяти МП 8086- 1 Мб. Линейный или физический адрес любого байта памяти - это его порядковый номер от начала памяти, то есть, целое число в интервале от 0 до 220-1 или в 16-ричной системе 00000-FFFFF. Откуда следует, что разрядность адресной шины должна быть 20 битов или 20 двоичных разрядов. Управляющая шина служит для передачи сигналов из УУ в периферийные устройства. В архитектуру процессора i8086/i8088 была заложена идея сегментной организации памяти, которая сохранилась с появлением новых семейств процессоров. Оперативная память процессора 8086 разбита на сегменты. Размер сегмента не более 64 килобайт или 65536 байт. Для удобства адресации оперативной памяти используется относительная адресация, из двух частей: адрес начала сегмента, где находится байт, и смещение ( расстояние) байта от начала сегмента. Минимальное смещение равно 0, это первый байт сегмента. Максимальное смещение равно 65535=216-1 для последнего байта сегмента или FFFFh
В центральном процессоре доступны программисту следующие регистры: 1. РОН - р егистры о бщего н азначения 2. Сегментные регистры; 3. Счетчик команд IP (instruction pointer) 4. Индексные регистры; 5. Регистр флагов. Регистры общего назначения Четыре регистра общего назначения (или общих регистров) процессора 8086 (каждый размером 16 бит ) используются в операциях большинства инструкций в качестве источника или приемника при перемещении данных и вычислениях, указателей на ячейки памяти и счетчиков. Каждый регистр общего назначения может использоваться для хранения 16-битового значения в арифметических и логических операциях, может выполняться обмен между регистром и памятью (запись из регистра в память и наоборот). Допускается интерпретация регистра в виде двух 8-битовых регистров High (старший и Low (младший ).
Кроме такого общего свойства регистров, как использование их для хранения значений или в качестве источника и приемника при работе с данными, каждый регистр общего назначения имеет свою особенность. AX - cумматор (accumulator). Является основным регистром при выполнении всех арифметических и логических команд. Команды операций с сумматором работают эффективней подобных команд с другими регистрами. Они короче по длине и исполняются быстрее. Регистр AX используется во всехкомандах ввода и вывода.Команды умножения и деления используют обязательно только регистр AX в случае 16-разрядных операндов; или AL для 8-разрядных. ВХ – регистр базы (Base Register). Регистр ВХ может использоваться как арифметический регистр, а так же для указания адреса операнда, который хранится в ОЗУ (адрес операнда указывается [BX], т.е. имеет место косвенная адресация операнда); Регистр ВХ хранит смещение операнда. Он используется для передачи адресов параметров в процедуры.
СХ – регистр- счётчик (Count Register). Регистр СХ используется: как любой арифметический регистр; как счётчик циклов; как счётчик сдвигов.– Сl.
DX–регистр данных (Data Register): Специфическое применение в операциях умножения и деления 16-разрядных операндов. Перед выполнением операции умножения в регистре АХ должно быть 16-разрядное множимое. При выполнении умножения на 16-разрядный множитель получается 32-разрядное произведение. Старшие 16 разрядов произведения заносятся в регистр DX, младшие разряды - в регистр АХ. Перед выполнением операции деления делимое должно быть записано в виде 32- разрядного кода в пару регистров DX и AX. В результате деления нацело на 16-разрядный делитель 16- разрядный остаток от деления помещается в регистр DX, . частное попадает в регистр AX. Регистр DX используется в операциях вывода для передачи адреса данного. Регистр DX - это единственный регистр, которые может использоваться в качестве указателя адреса ввода-вывода в инструкциях IN и OUT Сегментные регистры В процессоре имеется четыре сегментных регистра CS, DS, ES, SS. Они служат для указания начала соответствующего сегмента.
1. Регистр CS (Code Segment) содержит адрес начала текущего сегмента кода, где располагаются команды или коды программы. 2. SS ( Stack Segment) - содержит адрес начала сегмента стека. Регистр SS инициализируется операционной системой автоматически 3. DS ( Dat a Segment) –содержит адрес текущего сегмента данных. Вообще в программе может быть несколько сегментов данных. 4. ES ( Extra Segment) – регистр дополнительного сегмента данных. Адресация сегмента стека В программе всегда только один сегмент стека Стек - это область памяти, в которой можно сохранять значения и из которой они могут затем извлекаться по дисциплине " последний пришел- первый ушел" (LIFO). То есть последнее сохраненное в стеке значение будет первым значением, которое вы получите при чтении из стека. Классической аналогией стека является стопка тарелок. Поскольку тарелки можно класть только сверху стопки (и брать также), то первая положенная тарелка будет последней, которую вы сможете взять. Доступ к элементам стека происходит с помощью двух регистров SP и BP Регистр SP (stack pointer) - 16 разрядный регистр, называется также указателем текущей вершины стека. Регистр SP в начале работы программы имеет значение объема стека( максимальное значение). При каждом занесении данных в стек регистр SP автоматически уменьшается на 2 (длина слова). Текущая вершина стека имеет адрес [SS]: [ SP]; действительный адрес вычисляется по формуле [ss]*16+[sp]. Как и в случае стопки тарелок, вершина стека - это то место, в котором в стеке сохраняется последнее помещенное туда значение. Действие, состоящее в занесении значений в стек, называют также " заталкиванием" (pushing) в стек. В самом деле, инструкция PUSH используется для занесения значений в стек. Аналогично, действие, состоящее в извлечении (выборке) значений из стека, называют также " выталкиванием" (popping) из стека (для этого используется инструкция POP). При выталкивании слова из стека регистр SP увеличивается на 2. Регистр ВР - basa pointer служит для косвенной адресации и доступа к содержимому стека без разрушения стека (выталкивания данных из стека). Регистр SP копируется в регистр BP, адрес [SS] [BP+2] обеспечит доступ к содержимому стека, расположенному на 2 байта дальше вершины стека. Индексные регистры Регистр SI (Source Index). Этот 16-разрядный регистр является индексом источника, обычно он используется в паре [DS]: [SI] для выполнения операций над цепочками символов или строк. Регистр DI (Destination Index ). Этот 16-разрядный регистр является индексом назначения или приемника, обычно он используется в паре [ES]: [ DI] также для строковых операций.. Оба регистра можно применять в арифметических операциях. Индексные регистры используются при работе с таблицами данных, где доступ к отдельному элементу обеспечен с помощью расширенной индексной адресации операндов. Структура оператора Каждый оператор занимает одну строку. Операторы могут быть трех видов: комментарий, директива и машинная команда. комментарий -; не транслируется. Директива не порождает машинную команду, она является указанием для транслятора о сегментации программы, о структуре листинга (объект кода), о резервировании и инициализации полей данных. Квадратные скобки в формате директивы означают, что данная часть может отсутствовать в некоторых директивах. [имя ] директива [ параметры ] DSEG SEGMENT PARA; директива начала сегмента Оператор машинная команда
[метка: ] мнемокод [операнды ] Поле имя и поле операнды могут отсутствовать в некоторых командах. Оператор машинной команды порождает одну машинную команду. Длина команды от 1 + до 6 байт (зависит от вида операции, (кода команды) и от способа адресации оперативной памяти).
Директивы языка Ассемблера Директивы сегментации программы. Сегменты программы должны описываться с помощью директивы SEGMENT, указывающей имя сегмента, используемое для ссылок в программе, границу выравнивания (байт, слово, параграф, страница), тип комбинации его с другими сегментами, класс сегмента, определяющий порядок следования сегмента в памятиДиректива SEGMENT открывает сегмент. Любой код или данные, следующие за ней, будут помещаться в указанный сегмент до тех пор, пока не встретится директива ENDS, закрывающая сегмент. имя SEGMENT [ атрибуты ] Имя сегмента — обычно используется идентификатор, из которого можно сделать вывод о характере данных, содержащихся в сегменте. Атрибуты могут состоять из одного или нескольких следующих значений: Комбинации сегмента, класса сегмента, выравнивания сегмента, размера сегмента, доступа к сегменту. Во время трансляции Turbo Assembler рассматривает атрибуты, указанные в директиве SEGMENT, слева направо. Атрибут комбинации сегмента предназначен для указания компоновщику, каким образом объединять сегменты, находящиеся в разных модулях и имеющие одинаковые имена. Директива ASSUME ASSUME < сегментный регистр> двоеточие < имя сегмента> Эта директива служит для указания транслятору информации о связи между сегментным регистром и адресом в оперативной памяти. ASSUME DS: A_DATA, CS: A _COD Транслятор на основании этой директивы строит адреса операндов в памяти в виде смещения относительно регистра DS, полагая, что регистр DS содержит адрес A_DATA. В одной директиве ASSUME можно указать привязку четырех сегментных регистров через запятую. Занесение соответствующих адресов в сегментные регистры CS и SS выполняет загрузчик, а DS и ES необходимо загружать программно. MOV AX, A_DATA МOV DS, AX
Директива END [метка] - для обозначения конца файла исходного модуля; [метка] служит для указания метки первой исполняемой команды главной программы.
Директивы определения данных Эти директивы обычно размещаются в сегменте данных. С помощью них можно определить именованные константы, каждая из которых занимает соответствующее число байтов, резервировать поля под данные. Синтаксис директивы Define [ Имя] Dх выражение 1[, выражение 2 ] Где х модификатор, состоящий из одной буквы(B, W, D).
DB - определить поле длиной в byte DW – определить поле длиной в слово. DD – определить поле длиной в два слова.
Для простого резервирования памяти в поле операнда ставят знак вопроса? X DB? Y DB 100 dup (? ); выделить 100 байт памяти Ключевое слово dup обозначает знак повторителя При определении констант операнд(выражение) может представлять собой константу в двоичной, десятичной, шестнадцатеричной системе исчисления. Инициализация таблицы данных: А DB 4, -4, 7, 80, 100; ; адреса констант: 4® А+0, -4®А+1, 7® А+2, 80® A+3, 100 ® А+4 В DW 1000, -400, 7, 8; {integer} ; адреса констант 1000 ® B +0, -400 ® B+2, 7® B+2, 8 ® B+6
Выражение может быть задано адресом памяти: A DB 4, -4 AD DW A; после трансляции в двухбайтовое поле с именем АD будет записано 16- разрядное расстояние адреса А от начала сегмента данных. Выражения могут содержать следующие операции: +, -, *, / (деление нацело).MOD, Shr, Shl. логические операции: NOT, OR, XOR, AND Специальные обозначения $ Значения счётчика адреса - (текущее смещение). offset имя; смещение внутри сегмента Примеры использования X dw 5; Y DW offset x; z DW $; текущее смещение.
Способы адресации операндов В зависимости от спецификации и местоположения операндов в языке Ассемблер различают следующие способы адресации:
Команды передачи данных Команды передачи данных выполняют копирование или обмен данными. Они имеют характер подготовительно - завершающей операции, т.е. используются для начальной подготовки адресов и данных, а также для сохранения и вывода полученного результата. FКоманды передачи данных не меняют регистр флагов! В этой группе команды 1. Общая пересылка данных MOV приемник, источник 2. Обмен данных хchg приемник, источник 3. Работа со стеком o Извлечение из стека слова POP приемник o Занесение слова в стек PUSH источник o Команды пересылки флагов LAHF, SAHF, POPF, PUSHF
4. Команды пересылки адреса LEA, LDS, LES
Рассмотрим первой общую пересылку данных. Она имеет два операнда. MOV приемник, источник
Все возможные комбинации операндов команды MOV ниже представлены на схеме:
Из схемы видно, что источником команды пересылки могут быть константы, регистры и поля памяти (байт или слово). Приемником могут быть только регистры и поля памяти. Адресация операндов команды MOV · Непосредственная адресация источника. MOV AX, 5 MOV AX, -5 MOV Ah, ‘H’ При исполнении команды не тратится время на перемещение операнда, так как при трансляции команды непосредственный операнд-константа становится частью команды. Константу нельзя переслать в сегментные регистры. · Регистровая адресация, то есть используют АХ, ВХ, СХ, DХ, DI, SI, SP, BP и 8-битовые регистры AL, BH, BL (тип регистра определяет разрядность операции).
MOV BL, AL; - 8 бит. MOV BX, CX; - 16 бит · прямая адресация имеет место, когда один из операндов находится в памяти – переменная (переменная +(-) выражение const) MOV AX, A; A имеет тип WORD MOV A, BX MOV A, 120 · косвенная адресация имеет место при работе со стеком при передаче данных из одной процедуры в другую и при работе с массивами. · косвенная регистровая: [BX], [BP], [DI], [SI] MOV BX, offset A; в BХ заносится смещение переменной А, внутри сегмента. MOV AX, [BX]; в регистр AX копируется значение из поля A. Исполнительный адрес вычисляется: Ea = (DS) * 16 + (BX) = [ds]: offset A По умолчанию DS – регистр сегмента данных. Если имеется другой регистр, то его записываем явно [ES]: [DI] Нельзя одновременно в одном операнде использовать два индексных или базовых регистра. Обмен данных Команда xchg производит обмен данных между операндами: Регистр – регистр Регистр – память Память – регистр В обмене не может участвовать сегментный регистр! Команда PUSH источникc помещает содержимое источника на текущую вершину стека с предварительным уменьшением указателя регистра стека SP –2. Пример. PUSH A; содержимое источника копируется на вершину стека 1. SP: = SP - 2 2. (A)à ([SS: ] [SP + 0 ])
Команда POP приемник извлекает содержимое слова из вершины стека и пересылает его в поле приемника, после чего содержимое SP увеличивается на 2:. Пример. POP A 3. ([SS: ] [SP + 0 ]) ® приемник 4. SP: = SP + 2 Команды пересылки адреса · LEA регистр, источник · LDS регистр, источник · LES регистр, источник
LEA регистр, -память регистр - обязательно 16- разрядный. Эта команда загружает в регистр-приемник исполнительный адрес источника. LEA AX, A Ограничения: · 1-й операнд не может быть сегментным регистром · источник не может быть непосредственным операндом или регистром. LDS регистр, источник LES регистр, источник Эти команды производят загрузку адреса в виде двойного слова, причем источник должен быть объявлен с помощью директивы DD. LDS –это команда загрузки указателя с использованием регистра DS: 1-е слово загружается в регистр общего назначения 2-е слово загружается в регистр DS. LES – это команда загрузки указателя с использованием регистра ES: 1-е слово загружается в регистр общего назначения 2-е слово загружается в регистр ES. Команды пересылки флагов Они НЕ имеют операндов. · LAHF; команда пересылает содержимое регистра флагов в регистр АН · SAHF; команда пересылает содержимое регистра АН в регистр флагов · PUSHF; команда помещает регистр флагов на текущую вершину стека. · РОРF ; команда восстанавливает из вершины стека регистр флагов.
Эти команды используются при работе с сопроцессором, выполнении команд прерывания.
Сложение ADD (операнд назначения), (операнд-источник) Сумма двух операндов, которые могут быть байтами или словами, помещается в операнд назначения. Размеры операндов должны быть одинаковыми, и только один операнд может быть операндом памяти. Регистр сегмента не может быть операндом назначения. Оба операнда могут быть знаковыми или беззнаковыми числами. Команда ADD изменяет значение флагов AF, CF, OF, PF, SF и ZF. Пример. Mov BX, 1FFEh mov CX, 3 add BX, CX; ВХ=2001h
ADC (операнд назначения), (операнд-источник) Команда ADC (суммирование с учетом разряда переноса) суммирует операнды, которые могут быть байтами или словами, и добавляет 1, если установлен разряд переноса; результат помещается в операнд назначения. Оба операнда могут быть знаковыми или беззнаковыми числами. Команда ADD изменяет значение флагов AF, CF, OF, PF, SF и ZF. Так как команда ADC учитывает значение разряда переноса от предыдущей операции, это может быть использовано для организации суммирования чисел произвольной разрядности. INC (операнд назначения) Команда INC (инкремент) добавляет единицу к операнду назначения. Операнд может быть байтом или словом и трактуется как беззнаковое двоичное число. Команда INC изменяет значение флагов AF, OF, PF, SF и ZF; значение флага CF эта команда не изменяет. Не допускается использовать в качестве операнда непосредственное значение. Вычитание SUB (операнд назначения), (операнд-источник) Содержимое операнда-источника вычитается из содержимого операнда назначения, и результат помещается в операнд назначения. Операнды могут быть знаковыми или беззнаковыми, однобайтовыми или двухбайтовыми числами. Команда SUB изменяет значение флагов AF, CF, OF, PF, SF и ZF.
SBB (операнд назначения), (операнд-источник) Команда SBB (вычитание с учетом заема) вычитает содержимое операнда-источника из содержимого операнда назначения, затем вычитает из результата 1, если был установлен флаг переноса CF. Результат помещается на место операнда назначения. Операнды могут быть знаковыми или беззнаковыми, двоичными однобайтовыми или двухбайтовыми числами. Команда SBB изменяет значение флагов AF, CF, OF, PF, SF и ZF. Команда SBB может быть использована для организации вычитания многобайтовых чисел.
DEC (операнд назначения) Команда DEC (декремент) вычитает единицу из операнда назначения, который может быть одно- или двухбайтовым. Команда DEC изменяет содержимое флагов AF, OF, PF, SF и ZF. Содержимое флага CF при этом не изменяется. NEG (операнд назначения) Команда NEG (инверсия) вычитает операнд назначения, который может быть байтом или словом из 0 и помещает результат в операнд назначения. Такая форма двоичного дополнения числа пригодна для инверсии знака целых чисел. Если операнд нулевой, его знак не меняется. Попытка применить команду NEG к байтовому числу -128 или к двухбайтовому числу -32 768 не приводит к изменению значения операнда, но устанавливает флаг OF. Команда NEG воздействует на флаги AF, CF, OF, PF, SF и ZF. Флаг CF всегда установлен за исключением случая, когда операнд равен нулю, когда этот флаг сброшен. Не допускается использовать в качестве операнда непосредственное значение. CMP (операнд назначения), (операнд-источник) Команда СМР (сравнение) вычитает операнд-источник из операнда назначения, не изменяя при этом значения операндов. Операнды могут быть байтовыми или двухбайтовыми числами. Хотя значения операндов не изменяются, значения флагов обновляются, что может быть учтено в последующих командах условного перехода. Команда CMP воздействует на флаги AF, CF, OF, PF, SF и ZF. При совпадении значений операндов флаг ZF устанавливается в 1. Флаг переноса CF ZF устанавливается в 1, если операнд назначения меньше операнда-источника. Умножение MUL (операнд-источник) Команда MUL (умножение) выполняет беззнаковое умножение операнда-источника и содержимого аккумулятора. Если операнд-источник однобайтовый, осуществляется умножение на содержимое регистра AL, а двухбайтовый результат возвращается в регистры AH и AL. Если операнд-источник двухбайтовый, осуществляется умножение на содержимое регистра AX, а четырехбайтовый результат возвращается в пару регистров DX и AX. Операнды рассматриваются как беззнаковые двоичные числа. Если старшая половина результата (регистр AH при однобайтовом умножении и DX при двухбайтовом умножении) не равна нулю, взводятся флаги CF и OF, в противном случае эти флаги сбрасываются. Если после выполнения умножения установлены флаги CF и OF, это говорит о наличии значащих цифр результата в регистре AH или DX. Содержимое флагов AF, PF, SF и ZF после выполнения команды умножения не определено. Пример 1. Mov AL, 5; первый сомножитель Mov BL, 3; второй сомножитель mul BL; AX=000Fh Пример 2. Mov AX, 255; первый сомножитель mov BX, 255; второй сомножитель mul BX; DX=0001h, AX=0000h ; число 65536 IMUL (операнд-источник) Команда IMUL (целочисленное умножение) выполняет знаковое умножение содержимого аккумулятора на операнд-источник. Если операнд-источник однобайтовый, осуществляется умножение содержимого регистра AL, а двухбайтовый результат возвращается в регистрах AH и AL. Если операнд-источник двухбайтовый, осуществляется умножение содержимого регистра AX, а четырехбайтовый результат возвращается в паре регистров DX и AX. Операнды рассматриваются как беззнаковые двоичные числа. Если старшая половина результата (регистр AH при однобайтовом умножении и DX при двухбайтовом умножении) взводятся флаги CF и OF, в противном случае эти флаги сбрасываются. Если после выполнения умножения взведены флаги CF и OF, это говорит о наличии значащих цифр результата в регистре AH или DX. Содержимое флагов AF, PF, SF и ZF после выполнения команды целочисленного умножения не определено. Деление DIV (операнд-источник) Команда DIV (деление) выполняет беззнаковое деление содержимого аккумулятора (и его расширения) на операнд-источник. Если операнд-источник однобайтовый, осуществляется деление двухбайтового делимого, расположенного в регистрах AH и AL. Однобайтовое частное получается в регистре AL, а однобайтовый остаток – в регистре AH. Если операнд-источник двухбайтовый, осуществляется деление четырехбайтового делимого, расположенного в регистрах DX и AX. Двухбайтовое частное при этом получается в регистре AX, а двухбайтовый остаток – в регистре DX. Если значение частного превышает разрядность аккумулятора (0FFh для однобайтового деления и 0FFFFh – для двухбайтового) или выполняется попытка деления на нуль, генерируется прерывание типа 0, а частное и остаток остаются неопределенными. Содержимое флагов AF, CF, OF, PF, SF и ZF после выполнения команды DIV не определено. Делитель не может быть задан в виде константы!
IDIV (операнд-источник) Команда IDIV (целочисленное деление) выполняет знаковое деление содержимого аккумулятора (и его расширения) на операнд-источник. Если операнд-источник однобайтовый, осуществляется деление двухбайтового делимого, расположенного в регистрах AH и AL. Однобайтовое частное получается в регистре AL, а однобайтовый остаток - в регистре AH. Для байтового целочисленного деления положительное частное не может быть больше значения +127 (7Fh), а отрицательное не может быть меньше -127 (81h). Если операнд-источник двухбайтовый, осуществляется деление четырехбайтового делимого, расположенного в регистрах DX и AX. Двухбайтовое частное при этом получается в регистре AX, а двухбайтовый остаток - в регистре DX. Для двухбайтового целочисленного деления положительное частное не может быть больше значения +32767 (7FFFh), а отрицательное не может быть меньше значения -32767 (8001h). Если частное положительное и превышает максимум или отрицательное и меньше минимума, генерируется прерывание типа 0, а частное и остаток остаются неопределенными. Частным случаем такого события является попытка деления на нуль. Содержимое флагов AF, CF, OF, PF, SF и ZF после выполнения команды IDIV не определено. Пример. Mov AX, -506; AX=FE06h Делимое Mov BL, 50; Делитель Idiv BL; AL=F6h=-10 (частное) ; AH=FAh=-6 (остаток)
Перед операцией деления без знака старшие разряды делимого должны содержать нули: MOV CL, 3 MOV AL, 32 MOV AH, 0; 0 в старшие 8 бит делимого DIV CL Перед операцией деления со знаком старшие разряды делимого должны содержать знаковый разряд регистра AL (AX), таким образом, происходит увеличение размера числа. Для этой цели можно использовать следующие команды преобразования:
Команды преобразования данных. · CBW · CWD
CBW Команда CBW (преобразование байта в слово) расширяет знак байта в регистре AL на весь регистр АХ. Команда CBW не воздействует на флаги. Команда CBW может быть использована для получения двухбайтового делимого из однобайтового перед выполнением команды деления. CWD Команда CWD (преобразование слова в двойное слово) расширяет знак слова в регистре AХ на регистр DX. Команда CWD не воздействует на флаги. Команда CWD может быть использована для получения четырехбайтового делимого из двухбайтового перед выполнением команды деления.
Команды передачи управления
Популярное:
|
Последнее изменение этой страницы: 2016-04-11; Просмотров: 579; Нарушение авторского права страницы