Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Питер Абель Весь текст 992.61 Kb

Ассемблер и программирование для IBM PC

Предыдущая страница Следующая страница
1 ... 26 27 28 29 30 31 32  33 34 35 36 37 38 39 ... 85
при выполнении команд CMPSW и SCASW.

     - При  обработке  справа  налево  устанавливайте  начальные адреса на
последний байт обрабатываемой области.  Если,  например,  поле NAME1 имеет
длину 10 байтов,  то для побайтовой обработки данных в этой области справа
налево начальный адрес, загружаемый командой LEA, должен быть NAME1+9. Для
обработки слов начальный адрес в этом случае - NAME1+8.


     ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
     ________________________________________________________________

     11.1. В данной главе приведены эквивалентные команды для а) MOVSB, б)
LODSB и  в)  STOSB  с  префиксом  REP.  Напишите эквивалентные команды для
обработки по словам а) MOVSW, б) LODSW и в) STOSW с префиксом REP.

     11.2.  Введите,  ассемблируйте  и  выполните  компоновку   программы,
приведенной на рис.11.1. Не забудьте о инициализации регистра ES. Замените
команды MOVSB и MOVSW для  пересылки  справа  налево.  Измените  процедуру
H10SCAS для сканирования поля NAME1  на  слово  "mb".  Используя  отладчик
DEBUG для трассировки процедур,  обратите внимание на содержимое  сегмента
данных и регистров.

     11.3. Имеются следующие определения:

               DATASG    SEGMENT   PARA
                         CONAME    DB   'SPACE EXPLORERS INC.'
                         PRLINE    DB   20 DUP(' ')

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

     а) пересылку данных из CONAME в PRLINE слева направо;
     б) пересылку данных из CONAME в PRLINE справа налево;
     в) загрузку третьего и четвертого байтов области CONAME в регистр AX;
     г) сохранение содержимого регистра AX в область по адресу PRLINE+5;
     д) сравнение данных в областях CONAME и PRLINE (они должны быть не
        равны);
     е) сканирование областей CONAME и  PRLINE,  и  поиск  в  ней  символа
        пробел. Если символ будет найден, то переслать его в регистр BH.

     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атные  значения
3601 в поле WORD3A и 9C11 в поле WORD3B.
     На рис.12.2 процедура E10DWD демонстрирует подход к сложению значений
Предыдущая страница Следующая страница
1 ... 26 27 28 29 30 31 32  33 34 35 36 37 38 39 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама