Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
64
Добавлен:
09.06.2015
Размер:
829.32 Кб
Скачать

программу по времени её выполнения. Отметим некоторые особенности выполнения этой команды:

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

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

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

пример: MOV AX, DS MOV ES, AX

Эти же действия можно выполнить, используя стек и команды

PUSH и РОР:

PUSH DS

POP ES

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

Всвязи с командой MOV отметим один момент. В некоторых случаях

виспользуемой команде не просматривается явно размерность операнда, например, команда MOV [BX],0. У транслятора появится вопрос: какую

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

MOV WORD PTR [BX], 0 ; если [BX] адресует слово в памяти Можно рекомендовать использовать оператор ptr во всех сомнительных

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

Команда XCHG применяется для двунаправленной пересылки данных. Для этой операции можно применить последовательность из нескольких команд MOV, но из-за того, что операция обмена используется довольно часто, целесообразно использовать отдельную команду обмена XCHG. Команда может быть двух форматов, в первом случае она вызывает обмен байтами или словами между регистрами или регистром и памятью(20 и 21 приложения), второй формат более короткий: пересылка между одним из регистров и аккумулятором (команда №22 прил. 1).

Примечания: при обмене нельзя использовать сегментные регистры; команду XCHG AX, AX можно применить как пустую операцию.

Примеры:

 

XCHG CX, [BP+02]

; обменять содержимое регистра СХ и

 

; и ячейки стека, адресуемой через ВР+02

XCHG AX, word ptr [SI] ; обменять содержимое регистра АХ и слова ; в памяти по адресу в [SI]

21

Пересылки с участием аккумулятора состоят из трёх команд: IN (ввод),

OUT (вывод) и XLAT.

Вся работа системы с внешними устройствами выполняется с использованием портов ввода-вывода. Команда IN служит для пересылки байта или слова из порта ввода в аккумулятор (в AL или AH). Номер порта ввода может быть задан как непосредственно, во втором байте команды, так и косвенно, в регистре DX (23 – 26). Двухбайтные команды IN port и OUT port позволяют адресоваться к 256 портам, однобайтные команды IN и OUT адресуют 65536 портов. Косвенное задание порта хотя и требует предварительной загрузки его адреса в DX, однако позволяет организовывать программные циклы, в которых используется изменяющийся адрес портов.

Команда XLAT производит замещение значения в регистре AL другим байтом из таблицы в памяти, размером не более 256 байт. Слово «таблица» весьма условно, практически это просто строка байт. Адрес байта в строке, которым будет производиться замещение содержимого регистра AL, определяется суммой (ВХ + AL), т. е. содержимое AL выполняет роль индекса в байтовом массиве. Разумеется, составляющие адресов предварительно должны быть занесены в указанные регистры.

Пересылки адреса операнда. При написании программ производится активная работа с адресами операндов, находящимися в памяти. Для поддержки таких операций в процессорах I8086 есть специальная группа команд, в которую входят следующие команды: LEA (загрузка эффективного адреса в указанный регистр), LDS (загрузка указателя в DS), LES (загрузка указателя в ЕS). В более современных процессорах имеются дополнительные команды LFS и LGS (загрузка указателя в регистр дополнительного сегмента данных FS и GS), а также команда LSS (загрузка указателя в регистр сегмента стека SS). Команда LEA производит вычисление эффективного адреса ЕА и передаёт его в 16-разрядный регистр, код которого указан в поле reg. Команды LDS и LES применяются в основном при обращении к данным, находящимся вне текущих сегментов DS и ES, так что возникает необходимость изменить базовый адрес сегмента. Два 16- разрядных адреса базовый сегментный и смещение в сегменте, называемые указателем, предварительно загружаются в память. Значение смещения содержится в двух первых байтах указателя, а базовый адрес сегмента в третьем и четвёртом байтах. По команде LDS (или LES) происходит обращение к указателю и осуществляется загрузка регистра DS (или ES) базовым адресом, а смещение пересылается в регистр, указанный полем reg постбайта команды. Аналогичные действия производят команды LFS, LGS и LSS.

Пример: допустим, в памяти находится некая константа WORDTEST, равная 124Н, с перемещаемым адресом 6200Н. Выполняется такая последовательность команд:

MOV AX, WORDTEST

22

LEA SI, WORDTEST

После выполнения команд регистры AX и SI будут содержать числа 124Н и 6200Н соответственно.

Пересылки флагов. Эта группа включает четыре однобайтные команды: LAHF (загрузить АН флагами), SAHF (запомнить АН в регистре F), PUSH F

(занести F в стек) и POP F (извлечь из стека).

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

Система команд микропроцессора содержит пять команд, поддерживающих реализацию четырёх булевых функций:

поразрядное логическое умножение (логическое И) выполняет команда

AND;

поразрядное логическое сложение (логическое ИЛИ) – команда OR;

поразрядное логическое исключающее сложение (ИСКЛ. ИЛИ) – ко- манда XOR;

поразрядное отрицание (логическое НЕ) – команда NOT.

Кэтой же группе команд относится команда TEST (проверка), которая состоит в поразрядном логическом умножении (И) операндов без занесения результатов умножения в приёмник и служит для анализа содержимого источника по значениям флагов PF, SF и ZF.

Все двухоперандные команды AND, OR, XOR и TEST имеют одинаковые форматы, однооперандная команда NOT осуществляет

инвертирование операнда и имеет один формат.

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

Группу команд передачи управления можно разделить на четыре типа:

безусловные переходы;

условные переходы;

циклы;

прерывания.

Безусловные переходы. Команды безусловных переходов включают три

мнемокода: JMP (безусловный переход), CALL (вызов подпрограмм) и RET (возврат из подпрограммы).

По команде JMP можно осуществить переход в любую точку программы, расположенную как в текущем сегменте данных (ближний

23

переход), так и в другом сегменте (дальний переход). При переходе в пределах текущего сегмента используются первые три формата команды JMP (см. прил. 1). Первый формат позволяет перейти к любой команде внутри текущего сегмента, для чего к содержимому IP добавляется в дополнительном коде 16-разрядное смещение, старший разряд которого является знаковым. Второй, укороченный формат позволяет перейти к точке программы, отстоящей не более чем на – 128 –+127 адресов от команды JMP. Третий формат осуществляет загрузку указателя команд IP 16-разрядным числом, размещённым по исполнительному адресу ЕА, которое определяется постбайтом (косвенный переход).

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

CS.

Команда CALL используется в тех случаях, когда некоторый участок программы требует неоднократного повторения, более подробно поговорим о ней при выполнении лабораторной работы 5.

Условные переходы. Команды условных переходов позволяют принимать решения о переходе в зависимости от некоторых условий. Микропроцессор имеет 18 команд условных переходов, позволяющих проверить:

отношение между операндами со знаком большеменьше»);

отношение между операндами без знака выше ниже»);

состояние арифметических флагов ZF, SF, CF, OF, PF.

Термины «больше-меньше» и «выше-ниже» происходят от соответсвующих английских терминов «greater-less» и «above-below». Первые буквы этих терминов входят в состав мнемонических обозначений соответствующих команд условного перехода. Мнемокод команд начинается буквой J. Для того чтобы принять решение о переходе, сначала должно быть сформировано условие, на основании которого и будет принято решение о передаче управления:

это может быть любая команда, изменяющая состояние регистра фла- гов;

команда сравнения CMP, сравнивающая значения двух операндов;

состояние регистра СХ.

Все команды условных переходов имеют одинаковый формат, в первом

байте задаётся код операции, а во втором – 8- разрядное смещение, которое рассматривается как число со знаком, позволяющее осуществить изменение адреса в диапазоне от –128 до +127. При необходимости более отдалённого перехода по выполнению условия используется дополнительно команда безусловного перехода.

24

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

 

 

 

Таблица 2

 

 

 

 

Мнемоническое

Английский

Русский

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

обозначение

 

 

 

 

 

 

 

E e

Egual

Равно

Любые

 

 

 

 

N n

Not

Не

Любые

 

 

 

 

G g

Greater

Больше

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

 

 

 

 

L l

Less

Меньше

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

 

 

 

 

A a

Above

Выше, в смысле

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

 

 

«больше»

 

 

 

 

 

B b

Below

Ниже, в смысле

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

 

 

«меньше»

 

 

 

 

 

В таблице 3 приведён перечень команд условного перехода для коман- ды CMP операнд 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 or zf =1

 

 

 

 

Со знаком

jg /jnle

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

Sf = of and zf = 0

 

 

 

 

Со знаком

jge /jnl

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

Sf = of

 

 

 

 

Без знака

Jb/jnaе

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

Cf =1

 

 

 

 

Без знака

jbе /jnа

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

Cf =1 or Zf =1

 

 

 

 

Без знака

ja /jnbе

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

Cf = 0 and Zf = 0

 

 

 

 

Без знака

jae /jnb

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

Cf = 0

 

 

 

 

Мнемоническое обозначение части команд условного перехода отража- ет название флага, с которым они работают. В табл. 4 приведены названия флагов и соответствующие команды условного перехода.

25

 

 

 

Таблица 4

 

 

 

 

Название флага

Номер бита в

Команда

Значение флага для

 

регистре флагов

условного

осуществления

 

 

перехода

перехода

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

1

JC

CF=1

Флаг чётности PF

2

JP

PF=1

Флаг нуля ZF

6

JZ

ZF=1

Флаг знака SF

7

JS

SF=1

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

11

JO

OF-1

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

1

JNC

CF=0

Флаг чётности PF

2

JNP

PF=0

Флаг нуля ZF

6

JNZ

ZF=0

Флаг знака SF

7

JNS

SF=0

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

11

JNO

OF=0

Регистр CX, кроме того, что он является регистром общего назначения, имеет определённое функциональное назначение он выполняет роль счётчика в командах управления циклами и при работе с цепочками символов.В связи с этим существуют две команды условного перехода:

JCXZ – переход, если СХ нуль ( для I8086);

JECXZ переход, если ЕСХ нуль.

Варианты заданий к лабораторной работе 2

1.Сформировать массив их десяти однобайтных чисел. Переписать во второй массив все нечётные числа. Их количество поместить в регистр

BL.

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

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

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

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

6.Сформировать массив из 10 однобайтных чисел, все положительные числа переписать на место первого массива.

7.Найти все ненулевые числа из массива, состоящего из десяти однобай- товых чисел, посчитать их количество и поместить это число на место первого элемента исходного массива.

26

8.Найти в массиве, состоящем из десяти чисел, все нечётные и в то же время отрицательные, переписать их в другой массив.

9.Создать массив из десяти чисел, найти в нём нулевое число, все числа, стоящие после него, проверить на чётность и переписать в другой мас- сив.

10.Создать массив из десяти однобайтовых чисел, найти в нём нулевое и все числа, стоящие до него переписать в другой массив.

3. ЛАБОРАТОРНАЯ РАБОТА 3

Изучение арифметических команд для выполнения операций двоичной арифметики

Команды пересылок и условных переходов были описаны выше в лабораторной работе 2. В этой лабораторной работе мы продолжим их изучение в сочетании с арифметическими командами.

Группа арифметических целочисленных команд работает с двумя типами чисел:

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

целыми десятичными числами.

Целые двоичные числа с фиксированной точкой это числа, закодированные в двоичной системе счисления. Размерность целого двоичного числа может составлять 8,16 или 32 бита. Знак двоичного числа определяется тем, как интерпретируется старший бит в представлении числа. Среди арифметических команд есть всего две команды, которые действительно учитывают этот старший разряд как знаковый, – это команды целочисленного умножения и деления IMUL и IDIV. В остальных случаях ответственность за действия со знаковыми числами и, соответственно, со знаковым разрядом ложится на программиста. Числа с фиксированной точкой в программе описываются с помощью директив определения данных DB, DW

и DD.

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

ADD операнд 1,операнд 2 команда сложения двух операндов, ре- зультат помещается на место 1 операнда;

ADC операнд 1, операнд 2 команда сложения с учётом флага перено-

са CF;

INC операнд операция увеличения значения операнда на 1;

27

Команда ADC является средством микропроцессора для сложения

длинных двоичных чисел.

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

(т. е. установка флага OF в 1) происходит при переносе:

из 14-го разряда (для положительных чисел со знаком);

из 15-го разряда (для отрицательных чисел).

Переполнения не происходит (т. е. флаг OF сбрасывается в 0), если есть перенос из обоих разрядов или перенос отсутствует в обоих разрядах, в

этом случае результат вычислений правильный.

Команды вычитания. Операции вычитания включают пять мнемокодов: SUB (беззнаковое вычитание), SBB (вычесть со знаком), DEC (уменьшить на единицу) NEG (изменить знак) и CMP (сравнить).

Вычитание двоичных чисел без знака. По команде SUB вычитается операнд источника из операнда приёмника. Операнды могут находиться в регистрах и памяти, вычитаемым может также служить константа, заданная непосредственно в команде.

Команда SBB используется при вычитании многобайтных чисел и учитывает флаг CF, который теперь выполняет роль индикатора заёма 1 из старшего разряда при вычитании чисел.

После выполнения команды вычитания чисел без знака нужно анализировать состояние флага CF. Если он установлен в 1, то это говорит о том, что произошёл заём из старшего разряда и результат получился отрицательным, т. е. в дополнительном коде.

Команда DEC вызывает уменьшение на единицу (декрементирование) содержимого регистра или памяти и имеет два формата , как и команда INC.

Команда NEG изменяет знак операнда, причём используется представление операнда в дополнительном коде. Например, если есть операнд

–2 (11111110), то команда NEG изменит его на +2 (00000010).

Команда CMP служит для сравнения двух операндов путём вычитания значения операнда приёмника из операнда источника, при этом полученная разница никуда не заносится, а результатом операции сравнения являются

28

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

Вычитание двоичных чисел со знаком. При вычитании чисел со знаком,

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

корректировке результата.

Команды умножения. В арифметических командах есть две команды умножения: MUL умножить и IMUL умножение со знаком. По команде MUL умножается без знака содержимое аккумулятора (AL или AX) на операнд источника, а результат двойной длины возвращается в аккумулятор и регистр, используемый для его расширения (в AL и АН в случае 8-разрядных операндов или в АХ и DX в случае 16-разрядных операндов). По результату устанавливаются только два флага: CF и OF, которые покажут 1, если

старшая половина результата отлична от нуля.

Команды деления. Для деления двоичных чисел без знака имеется команда DIV делитель, который может находиться в памяти или в регистре и иметь размер 8, 16, или 32 бита (начиная с процессора I286). Местонахождение делимого так же, как в команде умножения, зависит от размера операндов (табл. 5).

 

 

 

Таблица 5

 

 

 

 

Делимое

Делитель

Частное

Остаток

16 бит в

Байт в

Байт в

Байт в

рег.АХ

регистре или ячейке

регистре AL

регистре AH

 

памяти 16 бит

 

 

32 бита

16 бит в

Слово 16 бит

Слово 16 бит

DX - старшая

регистре или ячейке

в регистре

в регистре

часть, AX-младшая

памяти

AX

DX

часть

 

 

 

64 бита

Двойное

Двойное

Двойное

EDX-старшая

слово 32 бита в

слово 32 бита в

слово 32 бита в

часть, EAX-младшая

регистре или ячейке

регистре EAX

регистре EDX

часть

памяти

 

 

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

делитель равен нулю;

частное не входит в отведённую под него разрядную сетку.

29

Для деления чисел со знаком предназначена команда IDIV. Особенностью команды деления IDIV является то, что частное и остаток всегда имеют одинаковые знаки. Прерывание типа 0 возникает в следующих случаях:

делитель равен нулю;

при делении на делитель величиной в байт со знаком частное находится вне диапазона от –128 до +127;

при делении на делитель величиной в слово со знаком частное находит- ся вне диапазона от – 32768 до = 32768;

при делении на делитель величиной в двойное слово со знаком частное находится вне диапазона от –2 147 483 648 до + 2 147 483 647.

Варианты заданий к лабораторной работе 3

1.Сложить два пятибайтных шестнадцатеричных числа. Результат по- местить в отдельный шестибайтный массив. Проверить результат на чётность и, если он чётный, записать в регистр ВН единицу.

2.Сделать вычитание двух четырёхбайтных шестнадцатеричных чисел. Результат поместить в отдельный массив. Проверить результат на знак и, если результат отрицательный, произвести его инвертирование.

3.Сформировать массив из десяти двухбайтных чисел. Переписать во второй массив все положительные числа, просуммировать их и резуль- тат переписать на место первого массива.

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

5.Сформировать массив из десяти двухбайтных чисел. Найти номер мак- симального числа, умножить его на это число и поместить результат в регистр ВХ.

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

7.Сформировать массив из десяти однобайтных чисел, каждое из чисел умножить на 2, найти их сумму и поместить её в регистр ДХ.

8.Сформировать массив из десяти чисел, найти разницу между макси- мальным и минимальным числами, умножить её на 12 и поместить в память.

9.Сформировать массив из десяти чисел, найти в нём отрицательные чис- ла, сложить их и найти абсолютное значение результата.

10.Написать программу сложения двух десятибайтных чисел с учётом знака.

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

30

Соседние файлы в папке Радиоавтоматика и МП