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

Часть 5. Целочисленная арифметика

1. Команды add и sub

ADD (Сложение целых) заменяет операнд назначения на сумму операнда-источника и операнда назначения. Команда оказывает воздействие на флаги OF, SF, ZF, AF, PF и CF. ADC (Сложение целых с переносом) заменяет операнд назначения на сумму операнда-источника и операнда назначения плюс 1, если флаг CF установлен. Если флаг CF сброшен, команда ADC выполняет те же действия, что и команда ADD. Команда ADC используется для поддержки переноса, когда сложение выполняется на одном из этапов, например, когда используется 32-разрядная команда ADD для сложения двух учетверенных слов-операндов. Команда оказывает воздействие на флаги OF, SF, ZF, AF, PF, и CF.

SUB (Вычитание целых) вычитает операнд-источник из операнда назначения и заменяет значение операнда назначения на полученный результат. Если возникает заем единицы, устанавливается значение флага CF. Операндами могут быть байты, слова и двойные слова со знаком и без него. Команда оказывает воздействие на флаги OF, SF, ZF, AF, PF и CF. SBB (Вычитание целых с заемом) вычитает операнд-источник из операнда назначения, заменяя значение приемника на результат вычитания минус 1, если установлен флаг CF. Если флаг CF очищен, команда SBB выполняет ту же операцию, что и команда SUB. Команда SUB используется для поддержки заема разряда, когда выполняется вычитание чисел как один из этапов, например, когда используется 32-разрядная команда SUB для вычитания одного учетверенного слова из другого. Команда оказывает воздействие на флаги OF, SF, ZF, AF, PF и CF.

Микропроцессор может выполнять целочисленные операции и операции с плавающей точкой. Для этого в его архитектуре есть два отдельных блока:

•устройство для выполнения целочисленных операций;

•устройство с плавающей точкой.

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

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

 

Сложение беззнаковых чисел

Микропроцессор выполняет сложение операндов по правилам сложения двоичных чисел.

 

add операнд1,операнд2 — команда сложения с принципом действия:

операнд1 = операнд1 + операнд2

 

·       xadd назначение,источник — обмен местами и сложение.

Команда позволяет выполнить последовательно два действия:

•обменять значения назначение и источник;

•поместить на место операнда назначение сумму:

назначение = назначение + источник.

 

!!! В операции сложения должны участвовать операнды одного формата (b-b, w-w)

!!! Возможны сочетания регистр - регистр

память - регистр

регистр - память

регистр - непосредственный операнд

неп. Операнд - регистр

!!! Операция память - память выполняется через промежуточный регистр

Пример1 Вычисление суммы двух чисел

. . .

slag1 dw 250

slag2 dw 125

rez dw ?

. . .

mov ax,slag1

add ax,slag2

mov rez,ax

. . .

inc операнд — операция инкремента, то есть увеличения значения операнда на 1;

операнд = операнд +1

!!! Операнд м.б. регистром или адресом памяти и !!! не м.б. непоср.операндом

 

Пример2. Увеличение числа на 1

Mov ax,slag1

inc ax

mov rez,ax

Особые ситуации, которые могут возникать при сложении:

1) значение результата превышает размерности поля операнда

для фиксирования ситуации выхода за разрядную сетку результата в микропроцессоре предусмотрено специальное средство: флаг переноса CF (curry flag). Он располагается в бите 0 регистра флагов eflags/flags. Именно установкой этого флага фиксируется факт переноса единицы из старшего разряда операнда. (CF=1)

 

Например, при сложении операндов размером в байт результат не должен превышать число 255. Если это происходит, то результат оказывается неверным.

Например, выполним сложение: 254 + 5 = 259 в двоичном виде. 11111110 + 0000101 = 1 00000011. Результат вышел за пределы восьми бит и правильное его значение укладывается в 9 бит, а в 8-битовом поле операнда осталось значение 3, что, конечно, неверно.

Т.е. если при сложении двух 8-битовых чисел результат занимает 9 битов, то значение старшего 9 бита запоминается во флажке CF.

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

Анализ этого флага можно провести различными способами.

Например, использовать команду условного перехода

jc <метка> ; Переход на метку если cf = 1

jnc <метка> ; Переход на метку если cf = 0

 

• adc операнд_1,операнд_2 — команда сложения с учетом флага переноса cf.

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

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

Пример 3. Вычисление суммы чисел

     masm

     model   small

     stack   256

     .data

     a       db      254

     .code   

     main:

     mov     ax,@data

    mov     ds,ax

    ...

    xor     ax,ax

    add     al,17

    add     al,a ; результат сложения выходит за границы операнда.

    jnc     m1      ; проверяет состояние флага cf - если нет переноса, то перейти на m1

    adc     ah,0    ;в ax сумма с учетом переноса в старший разряд

    m1:     ...

    exit:

    mov     ax,4c00h        ;стандартный выход

    int     21h

    end     main   

 

 

При сложении чисел со знаком может произойти особая ситуация

2) результат выходит из диапазона допустимых значений

Переполнение регистрируется с помощью флага переполнения of.

Дополнительно к флагу of при переносе из старшего разряда устанавливается в 1 и флаг переноса cf.

Проанализировать флаг of можно командами условного перехода jo \ jno .

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

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