рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Арифметичні дії з негативними числами

Арифметичні дії з негативними числами - раздел Образование, СИСТЕМА КОМАНД ТА ПРОГРАМУВАННЯ МІКРОКОНТРОЛЕРА КМ1816ВЕ51   Команди Множення І Ділення Дають Правильні Результати Тільки ...

 

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

Знак результату множення чи ділення двох чисел буде негативним тоді, коли тільки одне з чисел негативне. Нехай знак першого числа записаний у старшому біті регістра R0, а знак другого числа — у старшому біті регістра R1. Тоді знак результату можна записати в біт F0 за допомогою чотирьох команд:

MOV A, R0 ; знака в старший біт нагромаджувача

XRL A, R1 ; обчислення знака результату

RLC A ; старший біт нагромаджувача в прапорці

; переносу

MOV F0, С ; знака результату в біті F0

Зазначений біт зручний для запам'ятовування знака результату тому, що на нього не впливають результати команд, які виконують арифметичні операції.

В і8051 відсутня операція зміни знака числа, однак вона може бути виконана відніманням цього числа з 0. Припустимо, що нам потрібно змінити знак однобайтового числа, записаного в регістр R0. Для цього потрібно очистити біт переносу і нагромаджувач., відняти з нього вміст регістра і переслати результат з нагромаджувача в регістр:

CLR С ; очищення біта переносу

CLR А ; очищення нагромаджувача

SUBB A, R0 ; віднімання

MOV R0, А ; запам'ятовування результату

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

+ 0 00000000 - 0 00000000 – 11111111 + 1

+ 1 00000001 - 1 11111111 = 11111110 + 1

+ 2 00000010 - 2 11111110 = 11111101 + 1

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

CPL A ; обчислення зворотного коду

INC А ; додавання 1

Для зміни знака двобайтового числа необхідно спочатку одержати зворотні коди молодшого і старшого байтів, а потім додати 1 до молодшого байта. Нехай молодший байт числа записаний у нагромаджувачі, а старший — у регістрі В. Число зі зворотним знаком виходить у тім же місці, що і вихідне.

CPL A ; обчислення зворотного коду мол. байта

XRL В, #FFh ; обчислення зворотного коду ст. байта

ADD A, #01h ; додавання 1

JNC nс ; перехід за відсутністю переносу

INC В ; корекція ст. байта

nc: NOP ; для запису мітки

Зверніть увагу на те, як у випадку переносу з молодшого байта старший байт збільшується на 1. Для одержання переносу з молодшого байта потрібно використовувати в програмі не INC, a ADD. Код операції NOP записаний для того, щоб не залишати порожній рядок з міткою. У реальній програмі в цьому рядку повинна бути записана перша команда наступного блока.

Як приклад наведемо програму перемножування однобайтових чисел з довільним знаком. Вихідні числа знаходяться в регістрах R0, R1, а добуток обчислюється в регістрі В (старший байт) і нагромаджувачі (молодший байт).

MOV A, R0 ; множене

MOV С, А.7 ; знак першого числа в біті С

JNC mls1 ; перехід по позитивному множеному

CPL A ; обчислення зворотного коду множеного

INC A ; обчислення модуля множеного

mlsl: MOV В, R1 ; множник

JNB В.7 mls2 ; перехід по позитивному множеному

CPL С ; обчислення знака добутку

XRL В, #FFh ; обчислення зворотного коду множника

INC В ; обчислення модуля множника

mis2: MOV F0, С ; запам'ятовування знака добутку

MUL АВ ; обчислення добутку модулів

JNB F0, mls3 ; перехід по позитивному добутку

CPL А ; обчислення зворотного коду мол. байта XRL В #FFh ; обчислення зворотного коду ст. байта

ADD A, #01h ; додавання 1

JNC mls3 ; перехід за відсутністю переносу

INC В ; корекція ст. байта

mls3: NOP ; для запису мітки

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

Множення негативного числа на цілу ступінь двійки за допомогою зсуву нічим не відрізняється від множення позитивного числа. При діленні негативного числа потрібно при кожнім зсуві записувати в старший біт старшого байта 1. Для цього після запису старшого байта числа в нагромаджувач перед командою зсуву вліво потрібно скопіювати сьомий біт нагромаджувача в біт переносу.

 

– Конец работы –

Эта тема принадлежит разделу:

СИСТЕМА КОМАНД ТА ПРОГРАМУВАННЯ МІКРОКОНТРОЛЕРА КМ1816ВЕ51

СИСТЕМА КОМАНД ТА ПРОГРАМУВАННЯ МІКРОКОНТРОЛЕРА КМ ВЕ... Формати і способи адресації команд...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Арифметичні дії з негативними числами

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Формати і способи адресації команд
Команди можуть займати від одного до трьох байтів. Розмір команди визначається кодом операції, записаним у першому байті. Додаткові байти можуть містити адреси і/або дані. У символічному записі ком

Команди передачі даних
Незважаючи на передачу даних у незмінному вигляді, ці команди здійснюють один із способів обробки інформації. Як приклад такої обробки можна привести сортування. У командах пересилання використовую

Команди порозрядної обробки інформації
Команди порозрядної обробки інформації відрізняються від команд арифметичних операцій тим, що працюють з окремими бітами незалежно від умісту байта в цілому. Такі команди є для байтового і бітового

Команди арифметичних операцій
У раніше розглянутих командах обробки інформації кодування вмісту окремих бітів байта не мало значення. В арифметичних операціях потрібно дотримуватись строго визначених правил запису даних відпові

Команди передачі управління
Опис керуючих команд почнемо з команд умовного переходу. Ці команди використовують тільки відносний спосіб адресації, тому для них будемо використовувати умовну позначку адреси переходу rel. Для ко

Арифметичні дії з великими числами
У мікроконтролерах сімейства і8051 відсутній набір команд для здійснення арифметичних дій у тих випадках, коли для представлення чисел потрібно використовувати більш одного байта. Тому розглянемо,

Контроль точності при програмуванні арифметичних операцій
Абсолютна точність виходить тільки у випадку програмування обчислень з цілими числами обмеженої величини. У загальному випадку при неправильному програмуванні результат обчислень може мати неприпус

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги