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

11.4. Переделайте процедуру h10scas (рис.11.1) так, чтобы выполнялось

сканирование поля NAME1 на символ "er". Обратите внимание, что символы

"er" не встречаются в поле NAME1 как одно слово: /As/se/mb/le/rs/. Для

решения этой проблемы возможны два варианта:

а) использовать команду SCASW дважды, причем первая должна начинаться

по адресу NAME1, а вторая - по адресу NAME1+1;

б) использовать команду SCASB для поиска символа "е" и сравнить затем

следующий байт на символ "r".

11.5. Определите поле, содержащее шест. Значения 03, 04, 05 и b4.

Продублируйте это поле 20 раз и выдайте результат на экран.

Глава 12 Арифметические операции I: Обработка двоичных данных

__________________________________________________________________________

Ц е л ь: Дать сведения об операциях сложения, вычитания, умножения и

деления двоичных данных.

ВВЕДЕНИЕ

________________________________________________________________

Несмотря на то, что мы привыкли к десятичной арифметике (база 10),

компьютер работает только с двоичной арифметикой (база 2). Кроме того,

ввиду ограничения, накладываемого 16-битовыми регистрами, большие величины

требуют специальной обработки.

Данная глава дает сведения об операциях сложения, вычитания,

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

много примеров и предупреждений о различных ловушках для опрометчивых

исследователей мира микропроцессора. В следующей главе будут раскрыты

операции преобразования между двоичными данными и ASCII кодами.

СЛОЖЕНИЕ И ВЫЧИТАНИЕ

________________________________________________________________

Команды ADD и SUB выполняют сложение и вычитание байтов или слов,

содержащих двоичные данные. Вычитание выполняется в компьютере по методу

сложения с двоичным дополнением: для второго операнда устанавливаются

обратные значения бит и прибавляется 1, а затем происходит сложение с

первым операндом. Во всем, кроме первого шага, операции сложения и

вычитания идентичны.

На рис.12.1 представлены примеры команд ADD и SUB, обрабатывающие

байты или слова. В процедуре B10ADD используется команда ADD для сложения

байтов, а в процедуре C10SUB команда SUB вычитает слова. Примеры

показывают все пять возможных ситуаций:

сложение/вычитание регистр-регистр;

сложение/вычитание память-регистр;

сложение/вычитание регистр-память;

сложение/вычитание регистр-непоср.значение;

сложение/вычитание память-непоср.значение.

__________________________________________________________________________

page 60,132

TITLE EXADD (СОМ) Сложение и вычитание

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG

ORG 100H

BEGIN: JMP SHORT MAIN

; --------------------------------------------

BYTEA DB 64H ;Элементы данных

BYTEB DB 40H

BYTEC DB 16H

WORDA DW 4000H

WORDB DW 2000H

WORDC DW 1000H

; --------------------------------------------

MAIN PROC NEAR ;Основная процедура:

CALL B10ADD ;Вызвать сложение ADD

CALL C10SUB ;Вызвать вычитание SUB

RET

MAIN ENDP

; Пример сложения байт:

; --------------------

B10ADD PROC

MOV AL,BYTEA

MOV BL,BYTEB

ADD AL,BL ;Регистр и регистр

ADD AL,BYTEC ;Память и регистр

ADD BYTEA,BL ;Регистр и память

ADD BL,10H ;Непосредств. и регистр

ADD BYTEA,25H ;Непосредств. и память

RET

B10ADD ENDP

; Пример вычитания слов:

; ---------------------

C10SUB PROC

MOV AX,WORDA

MOV BX,WORDB

SUB AX,BX ;Регистр из регистра

SUB AX,WORDC ;Память из регистра

SUB WORDA,BX ;Регистр из памяти

SUB BX,1000H ;Непосредств. из peг.

SUB WORDA,256H ;Непосредств. из пам.

RET

C10SUB ENDP

CODESG ENDS

END BEGIN

__________________________________________________________________________

Рис.12.1. Примеры команд ADD и SUB.

Поскольку прямой операции память-память не существует, данная

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

слова WORDB прибавляется содержимое слова WORDA, описанных как DW:

MOV AX,WORDA

ADD AX,WORDB

MOV WORDB,AX

Переполнения

--------------

Опасайтесь переполнений в арифметических операциях. Один байт

содержит знаковый бит и семь бит данных, т.е. значения от -128 до +127.

Результат арифметической операции может легко превзойти емкость

однобайтового регистра. Например, результат сложения в регистре AL,

превышающий его емкость, автоматически не переходит в регистр AH.

Предположим, что регистр AL содержит шест.60, тогда результат команды

ADD AL,20H

генерирует в AL сумму - шест.80. Но операция также устанавливает флаг

переполнения и знаковый флаг в состояние "отрицательно". Причина

заключается в том, что шест.80 или двоичное 1000 0000 является

отрицательным числом. Т.е. в результате, вместо +128, мы получим -128. Так

как регистр AL слишком мал для такой операции и следует воспользоваться

регистром AX. В следующем примере команда CBW (Convert Byte to Word -

преобразовать байт в слово) преобразует шест.60 в регистре AL в шест.0060

в регистре AX, передавая при этом знаковый бит (0) через регистр AH.

Команда ADD генерирует теперь в регистре AX правильный результат:

шест.0080, или +128:

CBW ;Расширение AL до AX

ADD AX,20H ;Прибавить к AX

Но полное слово имеет также ограничение: один знаковый бит и 15 бит

данных, что соответствует значениям от -32768 до +32767. Рассмотрим далее

как можно обрабатывать числа, превышающие эти пределы.

Многословное сложение

-----------------------

Максимальное возможное значение в регистре +32767 ограничивает

возможность компьютера для выполнения арифметических операций. Рассмотрим

два способа выполнения арифметических операций. Первый способ - более

прост, но специфичен, второй - сложнее, но имеет общий характер.

__________________________________________________________________________

page 60,132

TITLE EXDBADD (COM) Пример сложения двойных слов

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG

ORG 100H

BEGIN: JMP SHORT MAIN

; -------------------------------------------

WORD1A DW 0123H ;Элементы данных

WORD1B DW 0BC62H

WORD2A DW 0012H

WORD2B DW 553AH

WORD3A DW ?

WORD3B DW ?

; -------------------------------------------

MAIN PROC NEAR ;0сновная процедура:

CALL D10DWD ;Вызвать сложение 1

CALL E10DWD ;Вызвать сложение 2

RET

MAIN ENDP

; Пример сложения двойных слов:

; ----------------------------

D10DWD PROC

MOV AX,WORD1B ;Сложить правые слова

ADD AX,WORD2B

MOV WORD3B,AX

MOV AX,WORD1A ;Сложить левые слова

ADC AX,WORD2A ; с переносом

MOV WORD3A,AX

RET

D10DWD ENDP

; Сложение чисел любой длины:

; --------------------------

E10DWD PROC

CLC ;Очистить флаг переноса

MOV CX,2 ;Установить счетчик

LEA SI,WORD1B ;Левое слово DWORD1

LEA DI,WORD2B ;Левое слово DWORD2

LEA BX,WORD3B ;Левое слово суммы

Е20:

MOV AX,[SI] ;Поместить слово в AX

ADC AX,[DI] ;Сложить с переносом

MOV [BX],AX ;Сохранить слово

DEC SI

DEC SI

DEC DI

DEC DI

DEC BX

DEC BX

LOOP Е20 ;Повторить цикл

RET

E10DWD ENDP

CODESG ENDS

END BEGIN

__________________________________________________________________________

Рис.12.2. Сложение двойных слов.

На рис.12.2 процедура D10DWD демонстрирует простой способ сложения

содержимого одной пары слов (WORD1A и WORD1B) с содержимым второй пары

слов (WORD2A и WORD2B) и сохранения суммы в третьей паре слов (WORD3A и

WORD3B). Сначала выполняется сложение правых слов:

WORD1B BC62

WORD2B 553A

-----

Сумма: 1119C

Сумма - шест.1119C превышает емкость регистра AX. Переполнение

вызывает установку флага переноса в 1. Затем выполняется сложение левых

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

с переносом ADC (ADd with Carry). Эта команда складывает два значения, и

если флаг CF уже установлен, то к сумме прибавляется 1:

WORD1A 0123

WORD2A 0012

Плюс перенос 1

----

Сумма: 0136

При использовании отладчика DEBUG для трассировки арифметических

команд можно увидеть эту сумму 0136 в регистре AX, и обpатные значения