Арифметические операции над целыми числами 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Арифметические операции над целыми числами



Мнемокоды и форматы арифметических команд приведены в приложении Г [5]. Как видно из таблицы арифметических команд, сложение целых чисел осуществляется командами:

ADD операнд1, операнд2 – (операнд1=операнд1+операнд2)

ADC операнд1, операнд2 – (операнд1=операнд1+операнд2 + значение cf).

Операндами могут быть как 8-ми битовые, так и 16-ти битовые двоичные числа.

Специальных команд сложения десятичных чисел нет. Объясняется это тем, что микропроцессор все операнды интерпретирует как двоичные числа и складывает их по правилам сложения двоичных чисел. Чтобы уяснить, как происходит сложение десятичных чисел, рассмотрим такой пример: сложим числа 26 и 55 в упакованном виде: (0010 0110) + (0101 0101) = (0111 1011).

Полученный результат не является десятичным упакованным числом. Поэтому результат должен быть скорректирован для представления в десятичном виде. Для этих целей разработчики ассемблера предложили 2 операции: ААА – корректировка результата для представления в кодах ASCII и DAA – корректировка результата для представления в упакованном десятичном формате. Обе команды не имеют операндов и по умолчанию корректируют значение из регистра AL.

Поскольку микропроцессор не имеет устройства вычитания, а имеет только устройство сложения (сумматор), вычитание на таком устройстве осуществляется в 2 этапа:

а) меняется знак у вычитаемого - второго операнда (иначе говоря, вычитаемое обращается);

б) складываются уменьшаемое и обращенное вычитаемое.

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

Команды вычитания SUB и SBB аналогичны соответствующим командам сложения, только при вычитании флаг CF понимается как признак заёма:

SUB операнд1, операнд2 – (операнд1=операнд1 - операнд2)

SBB операнд1, операнд2 – (операнд1=операнд1 - операнд2 - перенос_заём).

Ограничение при вычитании – нельзя вычесть значение регистра или ячейки памяти из константы, поскольку, например, команда SUB 100, AL недопустима. Однако, если заменить недопустимую операцию двумя следующими:

NEG AL

ADD AL, 100,

то вычитание из непосредственного значения будет выполнено и результат получен в AL.

Аналогично сложению, корректируются результаты вычитания при операциях с BCD-числами. Операция AAS корректирует результат вычитания неупакованной десятичной цифры из другой неупакованной десятичной цифры. Для упакованных BCD-чисел коррекцию результата вычитания производят командой DAS. Команды не имеют операндов и работают с регистром AL.

Команды сложения и вычитания могут воздействовать на 6 флагов, которые называются арифметическими:

- флаг переноса CF – CF=1, если результат сложения не помещается в операнде-приемнике, в противном случае CF=0;

- флаг четности PF=1, если результат имеет четное число битов со значением 1, в противном случае PF=0;

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

- флаг нуля ZF=1, если результат сложения равен 0;

- флаг знака SF=1, если сумма отрицательна (старший бит числа со знаком равен 1), в противном случае SF=0;

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

В отличие от сложения и вычитания в микропроцессоре существуют по 2 команды умножения и деления: отдельно для чисел без знака и для чисел со знаком. Во всех командах присутствует только один операнд - источник. 2-ой операнд располагается в РОН. Для операции умножения правило операндов описано таблицей 4 [1].

Таблица 4.

Местоположение операндов и результата для умножения

Сомножитель_1 Сомножитель_2 Результат
Байт (в РОН или ячейке памяти) AL 16 бит в АХ: в AL – младшая часть результата, в AH - старшая
Слово (в РОН или ячейке памяти) АХ 32 бита в паре DX: AX; в AX – младшая часть результата, в DX – старшая часть результата

 

После выполнения команд флаги СF и OF показывают, какая часть произведения существенна для дальнейших операций. При умножении чисел без знака эти флаги равны 0, если старшая часть результата нулевая, в противном случае (результат превысил по значащим цифрам сомножители) флаги устанавливаются в 1. При умножении чисел со знаком флаги равны 0, если старшая половина произведения содержит расширение знакового разряда младшей половины (при положительном результате это 0, при отрицательном –1). Обратите внимание, что эти операции не позволяют иметь в качестве операнда константу (непосредственное значение).

Результат перемножения правильных неупакованных BCD-чисел может быть представлен в неупакованном формате BCD-чисел с помощью команды ААМ. Команда работает с регистрами AL и AH и выполняет следующее: делит значение регистра AL на 10 и запоминает частное в регистре АН (старшая неупакованная цифра результата) и остаток – регистре AL (младшая неупакованная цифра результата). Операции, аналогичной ААМ для упакованных BCD-чисел в микропроцессоре не существует.

В операции деления так же, как и при умножении учитывается знак, а правило расположения операндов отражается в таблице 5 [1].

Таблица 5

Местоположение операндов и результата для деления

Делимое Делитель Частное Остаток
Слово 16 бит в регистре АХ Байт (в РОН или ячейке памяти) Байт в регистре AL Байт в регистре AH
32 бита в DX –старшая часть, в АХ- младшая Слово 16 бит (в РОН или ячейке памяти) Слово 16 бит в регистре АХ Слово 16 бит в регистре DX

 

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

1) при умножении чисел без знака для ситуации первой строки таблицы делимое более чем в 256 раз больше делителя,

2) при умножении чисел без знака для ситуации второй строки таблицы делимое более чем в 65636 раз больше делителя,

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

4) при делении чисел со знаком для ситуации второй строки таблицы делимое более чем в 32768 раз больше значения делителя.

Процесс выполнения деления двух неупакованных BCD-чисел может быть представлен в формате неупакованных BCD-чисел. Для этого перед операцией деления в регистре АХ получают две неупакованные цифры делимого (выполняет эту операцию программист удобным для него способом). Далее командой AAD преобразуется число в двоичное, которое затем является делимым в операции DIV. Причем в дальнейшей операции DIV двоичное число делится на неупакованную BCD-цифру, находящуюся в байтовом регистре или в байтовой ячейке памяти. Результат операции получается так, как описано первой строкой таблицы.

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

СBW – преобразует байт в регистре AL в слово в регистре АХ путем распространения старшего бита AL на все биты регистра AH;

CWD –преобразует слово в регистре АХ в двойное слово в регистрах AX и DX, путем распространения старшего 15-ого бита регистра АХ на все биты регистра DX.

Эти команды позволяют приводить разноформатные операнды к одному формату (большему), а также приводить к большему формату делимое при делении, например, байта на байт.

 

Организация циклов

При организации циклов широко используются команды INC (инкремент) и DEC (декремент), что означает добавление или вычитание единицы из целого числа, помещенного в ячейку памяти, РОН или индексный регистр. Команды имеют формат:

INC операнд,

DEC операнд.

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

LOOP метка_перехода.

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

- вычитании 1 из регистра СХ;

- сравнении регистра СХ с нулем;

- если СХ=0, то управление передается на следующую после LOOP команду, иначе осуществляется передача управления на метку_перехода.

Другими командами цикла являются команды:

LOOPE/LOOPZ метка_перехода,

которые означают “повторить цикл, пока СХ<>0 или ZF=0”. Обе команды совершенно идентичны, поэтому использовать можно любую из них. Отличаются эти команды от предыдущей команды анализом окончания цикла:

- если СХ>0 и ZF=1, управление передается на метку_перехода, иначе если СХ=0 или ZF=0, то выполняется следующая после команды LOOPE/LOOPZ команда.

Еще одной модификацией являются команды цикла

LOOPNE/LOOPNZ метка_перехода,

которые означают, “повторить цикл, пока СХ<>0 или ZF=1”. Как и в предыдущем случае обе команды совершенно идентичны. В них анализ окончания цикла выполняется по следующему правилу:

- если СХ>0 и ZF=0, управление передается на метку перехода, иначе если СХ=0 или ZF=1, то выполняется следующая после команды LOOPNE/LOOPNZ операция.

Общая особенность команд цикла в том, что они используют регистр общего назначения СХ как счетчик числа повторений цикла, поэтому при их использовании не забудьте до метки_перехода послать в этот регистр нужное число – количество повторений цикла!

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

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

 

МЕТОДИКА ВЫПОЛНЕНИЯ РАБОТЫ

 

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

Элементы массива обозначены через MAS. Согласно условию задачи, суммы элементов строки будут представлять собой вектор (одномерный массив), для которого применен идентификатор SUM. В этом случае сегмент данных будет представлять в программе следующую последовательность операторов:

DSEG SEGMENT PARA PUBLIC ‘DATA’

MAS DB 0, 1, -1, 6, 89;заданный массив чисел

DB 7,-19, 25, 8,10

DB 0, 0, 8, 56, -79

DB 13,-9, -2, 81,-100

STR DB 30, -40, 11, 6, -7

Len_mas=$-mas;определяем длину массива

Len_str=$-str;определяем длину строки

SUM DB Len_mas / Len_str DUP(0);одномерный массив результата, количество элементов равно количеству строк

DSEG ENDS

В приложении В приводится схема и исходный текст программы. Аналогично рис.3 в основном все команды программы записаны напротив соответствующих символов схемы. Исключения составляют команды и символы, соединенные стрелкой. Ожидаемый результат обработки: в области SUM следующие значения 5F 1F F1 EF 00. Можете убедиться в правильном функционировании программы, набрав ее текст и просмотрев результаты в отладчике.

 

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

 

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

2. Изучить приведенный пример схемы и программы. Если остаются какие-то неясности в программе, рекомендуется ввести пример-программу в компьютер и отладить ее.

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

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

5. Оттранслировать и скомпоновать программу в исполнимый код.

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

 

Требования к содержанию и оформлению отчета

 

Отчет должен включать:

а) титульный лист;

б) формулировку задачи работы;

в) описание результатов выполнения пунктов 3-6:

• листинги программ;

• результаты выполнения программ;

г) вывод, согласованный с задачей работы.

 

Критерии результативности выполнения работы

 

Лабораторная работа считается успешно выполненной, если:

· ожидаемые результаты обработки совпадают с фактическими результатами работы программы;

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

· студент дает аргументированные пояснения по всем приведенным в отчете пунктам задания;

· студент отвечает на контрольные вопросы преподавателя.

 

Контрольные вопросы

1. Как отличаются механизмы выполнения команд LOOP и LOOPE?

2. Какой РОН используется командами цикла?

3. Какие особенности реализации вложенных циклов существуют в Ассемблере? Чем обусловлены эти особенности?

4. Какие РОН используются по умолчанию командами умножения и деления?

5. В каких регистрах получается результат умножения байта на байт и слова на слово?

6. В каких регистрах получаются результаты целочисленного деления?

7. Как разделить целое число размером в одно слово на другое целое число размером в слово?

Варианты заданий

 

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

а) задать однобатовые элементы массива;

б) задать двухбайтовые элементы массива.

2. В заданном одномерном массиве целых знакопеременных чисел подсчитать количество положительных значений, отличных от 0. Определить смещения (SM1, SM2) и значение первого (FIRST) и последнего (LAST) положительного значения:

а) задать однобатовые элементы массива;

б) задать двухбайтовые элементы массива.

3. В заданном одномерном массиве целых знакопеременных чисел найти числа, кратные 4, подсчитать их количество и определить смещение (SM) первого такого числа. Определить, сколько положительных значений содержится в массиве до первого элемента, кратного 4. Предусмотреть обработку ситуаций, когда в исходном массиве нет значений, кратных 4, и когда элемент, кратный 4, является первым в исходном массиве:

а) задать однобатовые элементы массива;

б) задать двухбайтовые элементы массива.

4. В заданном одномерном массиве целых знакопеременных чисел определить смещение (SM) первого отрицательного элемента. Все отрицательные значения из исходного массива запомнить в области DEST. Количество элементов в этой области подсчитать:

а) задать однобатовые элементы массива;

б) задать двухбайтовые элементы массива.

5. В заданном одномерном массиве целых знакопеременных чисел определить количество значений, кратных 4. Все отрицательные значения из исходного массива после последнего элемента, кратного 4, запомнить в области DEST. Предусмотреть обработку ситуаций, когда в исходном массиве нет значений, кратных 4, и когда элемент, кратный 4, является последним в исходном массиве:

а) задать однобатовые элементы массива;

б) задать двухбайтовые элементы массива.

 

6. В одномерном массиве целых знакопеременных чисел подсчитать количество четных и нечетных значений, исключая 0 (нуль не считать ни четным, ни нечетным). Найти номер первого четного элемента и последнего нечетного. Запомнить номера в переменных N_CHET и N_NECHET:

а) задать однобатовые элементы массива;

б) задать двухбайтовые элементы массива.

7. В одномерном массиве целых знакопеременных чисел найти значение первого отрицательного элемента и запомнить его в переменной FIRST. Все значения из исходного массива до первого отрицательного элемента запомнить в области DEST. Количество элементов в этой области подсчитать:

а) задать однобатовые элементы массива;

б) задать двухбайтовые элементы массива.

 

ЛАБОРАТОРНАЯ РАБОТА № 5



Поделиться:


Последнее изменение этой страницы: 2017-02-17; просмотров: 189; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.6.75 (0.071 с.)