Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekz._9.doc
Скачиваний:
3
Добавлен:
05.05.2019
Размер:
168.96 Кб
Скачать

Системне програмування, доц. І.І. Мітасов, 2010р. Лекція 9, 8 сторінок

Тема 2. Архітектура процесора і мова асемблера: Основи програмування на мові асемблера

ЛЕКЦІЯ 9. Група арифметичних команд і даних

Питання лекції:

  • арифметичні операції над цілими двійковими числами

1. Арифметичні операції над цілими двійковими числами

У цій лекції ми розглянемо особливості кожного з чотирьох основних арифметичних дій для двійкових чисел зі знаком і без знака:

  • додавання двійкових чисел без знака;

  • додавання двійкових чисел зі знаком;

  • віднімання двійкових чисел без знака;

  • віднімання двійкових чисел зі знаком;

  • віднімання і додавання операндів великої розмірності;

  • множення чисел без знака;

  • множення чисел зі знаком;

  • ділення чисел без знака;

  • ділення чисел зі знаком.

1.1. Додавання двійкових чисел без знака

Мікропроцесор виконує додавання операндів за правилами додавання двійкових чисел. Проблем не виникає до тих пір, поки значення результату не перевищує розмірності поля операнда (див. табл. 8.1). Наприклад, при додаванні операндів розміром в байт результат не повинен перевищувати числа 255. Якщо це відбувається, то результат виявляється невірним. Розглянемо, чому так відбувається. Приміром, виконаємо додавання: 254 + 5 = 259 в двійковому вигляді. 11111110 + 0000101 = 1 00000011. Результат вийшов за межі восьми біт і правильне його значення вкладається в 9 біт, а у 8-бітовому полі операнда залишилося значення 3, що, звичайно, неправильно. У мікропроцесорі цей результат додавання прогнозується і передбачені спеціальні засоби для фіксування подібних ситуацій і їхньої обробки. Так, для фіксування ситуації виходу за розрядну сітку результату, як в даному випадку, призначений прапор переносу cf. Він розташовується в біті 0 регістра прапорів flags. Саме установкою цього прапора фіксується факт перенесення одиниці зі старшого розряду операнда. Природно, що програміст повинен передбачати можливість такого результату операції додавання і засоби для коригування. Це передбачає включення ділянок коду після операції додавання, в яких аналізується прапор cf. Аналіз цього прапора можна провести різними способами. Найпростіший і доступний - за допомогою команди умовного переходу jc. Ця команда в якості операнда має ім'я мітки в поточному сегменті коду. Перехід на цю мітку здійснюється у разі, якщо в результаті роботи попередньої команди прапор cf встановився в 1. Якщо тепер подивитися на рис. 8.1, то видно, що в системі команд мікропроцесора є три команди двійкового додавання:

  • inc операнд — операція інкременту, тобто збільшення значення операнда на 1;

  • add операнд_1,операнд_2 — команда додавання з принципом дії: операнд_1 = операнд_1 + операнд_2

  • adc операнд_1,операнд_2 — команда додавання з урахуванням прапора переносу cf. Принцип дії команди:

операнд_1 = операнд_1 + операнд_2 + значення_cf

Лістинг 1. Вычисление суммы чисел

<1> ;prg_9_1.asm

<2> masm

<3> model small

<4> stack 256

<5> .data

<6> a db 254

<7> .code ;сегмент коду

<8> main:

<9> mov ax,@data

<10> mov ds,ax

<11> ...

<12> xor ax,ax

<13> add al,17

<14> add al,a

<15> jnc m1 ;якщо немає переносу, то

;перейти на m1

<16> adc ah,0 ;в ax сума з урахув. переносу

<17> m1: ...

<18> exit:

<19> mov ax,4c00h ;стандартний вихід

<20> int 21h

<21> end main ;кінець програми

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

Розглянемо приклад обчислення суми чисел (лістинг 1).

У лістингу 1 у рядках 13-14 створена ситуація, коли результат додавання виходить за межі операнду. Ця можливість враховується рядком 15, де команда jnc (хоча можна було обійтися і без неї) перевіряє стан прапора cf. Якщо він встановлений в 1, то це ознака того, що результат операції вийшов більше за розміром, ніж розмір операнда, і для його коректування необхідно виконати деякі дії. У даному випадку ми просто вважаємо, що межі операнда розширюються до розміру ax, для чого враховуємо перенесення в старший розряд командою adc (рядок 16). Якщо у вас залишилися питання, досліджуйте роботу команд додавання без урахування знака, для чого введіть лістинг 1, отримаєте виконуваний модуль, запустіть відлагоджувач і відкрийте в ньому вікна View\Dump и View\Registers.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]