мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
asm:lesson7 [21/10/2010 22:22] – создано arabusovasm:lesson7 [28/10/2010 16:05] (текущий) arabusov
Строка 57: Строка 57:
 теперь  в регистре  AX правильный результат:  шест.0080, или теперь  в регистре  AX правильный результат:  шест.0080, или
 +128: +128:
- 
                CBW            ;Расширение AL до AX                CBW            ;Расширение AL до AX
                ADD  AX,20H    ;Прибавить к AX                ADD  AX,20H    ;Прибавить к AX
Строка 72: Строка 71:
 операций. Первый способ - более прост, но специфичен, второй операций. Первый способ - более прост, но специфичен, второй
 - сложнее, но имеет общий характер. - сложнее, но имеет общий характер.
-  Сумма     шест.1119C  превышает  емкость  регистра  AX.+Сумма     шест.1119C  превышает  емкость  регистра  AX.
 Переполнение вызывает  установку флага переноса  в  1. Затем Переполнение вызывает  установку флага переноса  в  1. Затем
 выполняется сложение левых слов,  но в данном случае, вместо выполняется сложение левых слов,  но в данном случае, вместо
Строка 78: Строка 77:
 (ADd  with  Carry).  Эта команда складывает два  значения, и (ADd  with  Carry).  Эта команда складывает два  значения, и
 если флаг CF уже установлен, то к сумме прибавляется 1: если флаг CF уже установлен, то к сумме прибавляется 1:
- 
                     WORD1A         0123                     WORD1A         0123
                     WORD2A         0012                     WORD2A         0012
                     Плюс перенос      1                     Плюс перенос      1
                     Сумма:         0136                     Сумма:         0136
- +При   использовании   отладчика   DEBUG  для  трассировки
-   При   использовании   отладчика   DEBUG  для  трассировки+
 арифметических  команд  можно  увидеть  эту   сумму  0136  в арифметических  команд  можно  увидеть  эту   сумму  0136  в
 регистре AX, и обpатные значения 3601 в поле WORD3A и 9C11 в регистре AX, и обpатные значения 3601 в поле WORD3A и 9C11 в
 поле WORD3B. поле WORD3B.
-   На  рис.12.2  процедура  E10DWD  демонстрирует  подход  к+На  рис.12.2  процедура  E10DWD  демонстрирует  подход  к
 сложению  значений  любой  длины.   Действие  начинается  со сложению  значений  любой  длины.   Действие  начинается  со
 сложения  самых правых  слов  складываемых  полей.  В первом сложения  самых правых  слов  складываемых  полей.  В первом
Строка 100: Строка 97:
 в  данном  случае  нельзя,  т.к.  при этом будет очищен флаг в  данном  случае  нельзя,  т.к.  при этом будет очищен флаг
 переноса, что приведет к искажению результата сложения. переноса, что приведет к искажению результата сложения.
-   Ввиду  наличия цикла,  используется  только  одна команда+Ввиду  наличия цикла,  используется  только  одна команда
 сложения  ADC.  Перед  циклом  команда  CLC  (CLear  Carry - сложения  ADC.  Перед  циклом  команда  CLC  (CLear  Carry -
 очистить флаг переноса) устанавливает нулевое значение флага очистить флаг переноса) устанавливает нулевое значение флага
Строка 106: Строка 103:
 чить смежность слов,  2) выполнять обработку справа налево и чить смежность слов,  2) выполнять обработку справа налево и
 3) загрузить в регистр CX число складываемых слов. 3) загрузить в регистр CX число складываемых слов.
-   Для  многословного  вычитания  используется  команда  SBB+Для  многословного  вычитания  используется  команда  SBB
 (SuBtract with  Borrow  -  вычитание с заемом) эквивалентная (SuBtract with  Borrow  -  вычитание с заемом) эквивалентная
 команде ADC.  Заменив в процедуре  E10DWD (рис.12.2) команду команде ADC.  Заменив в процедуре  E10DWD (рис.12.2) команду
 ADC на SBB, получим процедуру для вычитания. ADC на SBB, получим процедуру для вычитания.
  
-БЕЗЗНАКОВЫЕ И ЗНАКОВЫЕ ДАННЫЕ+===== Беззнаковые данные =====
 Многие числовые  поля  не  имеют  знака,  например, номер Многие числовые  поля  не  имеют  знака,  например, номер
 абонента, aдрес памяти. Некоторые числовые поля предлагаются абонента, aдрес памяти. Некоторые числовые поля предлагаются
Строка 316: Строка 313:
 цифры) в шестнадцатеричном формате. цифры) в шестнадцатеричном формате.
  
- Умножение двойного слова на  слово.  Процедура E10XMUL на+Умножение двойного слова на  слово.  Процедура E10XMUL на
 рис.12.4 умножает двойное слово на слово. Множимое, MULTCND, рис.12.4 умножает двойное слово на слово. Множимое, MULTCND,
 состоит из двух слов, содержащих соответственно шест. 3206 и состоит из двух слов, содержащих соответственно шест. 3206 и
Строка 342: Строка 339:
 Программа   предполагает,  что   первое   слово   в  области Программа   предполагает,  что   первое   слово   в  области
 PRODUCT имеет начальное значение 0000. PRODUCT имеет начальное значение 0000.
- +Умножение  "двойного слова на  двойное  слово". Умножение
------------------------------------------------------------- +
------------------------------------------------------------- +
-          Рис.12.4. Многословное умножение. +
- +
-   Умножение  "двойного слова на  двойное  слово". Умножение+
 двух  двойных   слов  включает  следующие   четыре  операции двух  двойных   слов  включает  следующие   четыре  операции
 умножения: умножения:
- 
                Множимое       Множитель                Множимое       Множитель
- 
                слово 2   х    слово 2                слово 2   х    слово 2
                слово 2   х    слово 1                слово 2   х    слово 1
                слово 1   х    слово 2                слово 1   х    слово 2
                слово 1   х    слово 1                слово 1   х    слово 1
- 
 Каждое  произведение  в регистрах  DX  и  AX  складывается с Каждое  произведение  в регистрах  DX  и  AX  складывается с
 соответствующим  словом  в окончательном  результате. Пример соответствующим  словом  в окончательном  результате. Пример
 такого умножения приведен в процедуре F10XMUL на  рис. 12.4. такого умножения приведен в процедуре F10XMUL на  рис. 12.4.
- 
- 
- 
- 
-Ассемблер для IBM PC. Глава 12                           270 
- 
- 
 Множимое MULTCND содержит шест. 3206 2521, множитель MULTPLR Множимое MULTCND содержит шест. 3206 2521, множитель MULTPLR
- шест.  6400  0A26. Результат заносится в область PRODUCT,+- шест.  6400  0A26. Результат заносится в область PRODUCT,
 состоящую из четырех слов. состоящую из четырех слов.
-   Хотя логика  умножения двойных слов  аналогична умножению+Хотя логика  умножения двойных слов  аналогична умножению
 двойного слова на  слово,  имеется  одна  особенность, после двойного слова на  слово,  имеется  одна  особенность, после
 пары команд сложения  ADD/ADC используется  еще одна команда пары команд сложения  ADD/ADC используется  еще одна команда
Строка 382: Строка 364:
 PRODUCT  достаточно  велика  для   генерации  окончательного PRODUCT  достаточно  велика  для   генерации  окончательного
 результата и переноса на последнем этапе не будет. результата и переноса на последнем этапе не будет.
-   Окончательный результат  138A 687C 8E5C  CCE6 получится в+Окончательный результат  138A 687C 8E5C  CCE6 получится в
 поле  PRODUCT   в обратной  записи байт в  словах. Выполните поле  PRODUCT   в обратной  записи байт в  словах. Выполните
 трассировку этого примера с помощью отладчика DEBUG. трассировку этого примера с помощью отладчика DEBUG.
  
-СДВИГ РЕГИСТРОВОЙ ПАРЫ DX:AX +=== Сдвиг регистровой пары DX:AX 
------------------------------------------------------------- +Следующая  подпрограмма  может  быть  полезна  для сдвига
- +
-   Следующая  подпрограмма  может  быть  полезна  для сдвига+
 содержимого pегистровой пары  DX:AX вправо  или влево. Можно содержимого pегистровой пары  DX:AX вправо  или влево. Можно
 придумать   более   эффективный  метод,   но  данный  пример придумать   более   эффективный  метод,   но  данный  пример
Строка 411: Строка 391:
           D30: LOOP D20       ;Повторить           D30: LOOP D20       ;Повторить
  
-   Ниже приведен более эффективный способ для  сдвига влево,+Ниже приведен более эффективный способ для  сдвига влево,
 не требующий организации цикла. В этом примере фактор сдвига не требующий организации цикла. В этом примере фактор сдвига
 записывается  в регистр CL.  Пример написан для сдвига  на 4 записывается  в регистр CL.  Пример написан для сдвига  на 4
Строка 421: Строка 401:
                SHL  AX,CL     ;Сдвинуть AX влево на 4 бита                SHL  AX,CL     ;Сдвинуть AX влево на 4 бита
                SHL  BL,CL     ;Сдвинуть BL вправо на 4 бита                SHL  BL,CL     ;Сдвинуть BL вправо на 4 бита
- 
- 
- 
-Ассемблер для IBM PC. Глава 12                           271 
- 
- 
                OR   DL,BL     ;Записать 4 бита из BL в DL                OR   DL,BL     ;Записать 4 бита из BL в DL
  
-ДЕЛЕНИЕ +==== Деление ==== 
------------------------------------------------------------- +Операция  деления  для   беззнаковых  данных  выполняется
- +
-   Операция  деления  для   беззнаковых  данных  выполняется+
 командой  DIV,  a для знаковых  -  IDIV.  Ответственность за командой  DIV,  a для знаковых  -  IDIV.  Ответственность за
 подбор подходящей команды лежит  на программисте. Существуют подбор подходящей команды лежит  на программисте. Существуют
 две основные операции деления: две основные операции деления:
- +Деление "слова на байт". Делимое находится в регистре AX,
-   Деление "слова на байт". Делимое находится в регистре AX,+
 а делитель  -  в  байте памяти или  а однобайтовом регистре. а делитель  -  в  байте памяти или  а однобайтовом регистре.
 После деления остаток получается в регистре AH,  а частное - После деления остаток получается в регистре AH,  а частное -
Строка 448: Строка 419:
    До деления:  | Делимое|    После:    |Остаток|Частное|    До деления:  | Делимое|    После:    |Остаток|Частное|
  
-   Деление  "двойного слова на  слово" Делимое находится в+Деление  "двойного слова на  слово" Делимое находится в
 регистровой паре DX:AX,  а делитель  -  в слове памяти или а регистровой паре DX:AX,  а делитель  -  в слове памяти или а
 регистре.  После деления остаток получается в регистре DX, а регистре.  После деления остаток получается в регистре DX, а
Строка 464: Строка 435:
                          DIV  DIVISOR                          DIV  DIVISOR
  
-   Если поле DIVISOR определено  как байт  (DB), то операция+Если поле DIVISOR определено  как байт  (DB), то операция
 предполагает  деление  слова  на  байт.  Если  поле  DIVISOR предполагает  деление  слова  на  байт.  Если  поле  DIVISOR
 определено как слово (DW),  то операция предполагает деление определено как слово (DW),  то операция предполагает деление
 двойного слова на слово. двойного слова на слово.
-   При  делении,  например,  13 на 3, получается разельтат 4+При  делении,  например,  13 на 3, получается разельтат 4
 1/3.  Частное  есть  4,  а остаток -  1. Заметим, что ручной 1/3.  Частное  есть  4,  а остаток -  1. Заметим, что ручной
 калькулятор (или  программа на  языке BASIC)  выдает  в этом калькулятор (или  программа на  языке BASIC)  выдает  в этом
Строка 475: Строка 446:
 части, в то время как 1 есть остаток от деления. части, в то время как 1 есть остаток от деления.
  
-   Беззнаковое деление: Команда DIV+==== Беззнаковое деление: Команда DIV ====
  
-   Команда  DIV  делит  беззнаковые  числа.  На  рис.12.5  в+Команда  DIV  делит  беззнаковые  числа.  На  рис.12.5  в
 процедуре D10DIV дано четыре примера деления: слово на байт, процедуре D10DIV дано четыре примера деления: слово на байт,
 байт на  байт,  двойное  слово на  слово и  слово  на слово. байт на  байт,  двойное  слово на  слово и  слово  на слово.
- 
- 
- 
-Ассемблер для IBM PC. Глава 12                           272 
- 
- 
 Первый пример команды DIV делит шест.2000  (8092) на шест.80 Первый пример команды DIV делит шест.2000  (8092) на шест.80
 (128).  В результате остаток 00  получается в регистре AH, а (128).  В результате остаток 00  получается в регистре AH, а
 частное шест.40 (64) - в регистре AL. частное шест.40 (64) - в регистре AL.
-   Второй пример  команды  DIV  выполняет  прежде расширение+Второй пример  команды  DIV  выполняет  прежде расширение
 байта BYTE1  до размеров слова. Так как здесь предполагается байта BYTE1  до размеров слова. Так как здесь предполагается
 беззнаковая величина,  то в примере  левый  бит  регистра AH беззнаковая величина,  то в примере  левый  бит  регистра AH
 равен нулю. В результате деления остаток - шест. 12 получает равен нулю. В результате деления остаток - шест. 12 получает
 ся в регистре AH, а частное шест.05 - в регистре AL. ся в регистре AH, а частное шест.05 - в регистре AL.
-   Третий пример команды DIV генерирует остаток шест. 1000 в+Третий пример команды DIV генерирует остаток шест. 1000 в
 регистре DX и частное шест. 0080 в регистре AX. регистре DX и частное шест. 0080 в регистре AX.
-   В  четвертом  примере  команды  DIV  сначала  выполняется+В  четвертом  примере  команды  DIV  сначала  выполняется
 расширение слова WORD1  до  двойного  слова  в  регистре DX. расширение слова WORD1  до  двойного  слова  в  регистре DX.
 После деления остаток шест.0000  получится в  регистре DX, а После деления остаток шест.0000  получится в  регистре DX, а
 частное шест. 0002 - в регистре AX. частное шест. 0002 - в регистре AX.
- +==== Знаковое деление: Команда IDIV ==== 
------------------------------------------------------------- +Команда IDIV (Integer DIVide)  выполняет деление знаковых
------------------------------------------------------------- +
-          Рис.15.5. Беззнаковое и знаковое деление. +
- +
-   Знаковое деление: Команда IDIV +
- +
-   Команда IDIV (Integer DIVide)  выполняет деление знаковых+
 чисел.  На рис.12.5  в процедуре E10IDIV используются  те же чисел.  На рис.12.5  в процедуре E10IDIV используются  те же
 четыре примера деления,  что и в процедуре D10DIV, но вместо четыре примера деления,  что и в процедуре D10DIV, но вместо
Строка 515: Строка 474:
 регистре AH ,  а частное -  шест.  C0 (-64) - в регистре AL. регистре AH ,  а частное -  шест.  C0 (-64) - в регистре AL.
 Команда DIV, используя те же числа, генерирует частное +64. Команда DIV, используя те же числа, генерирует частное +64.
-   Шестнадцатиричные  результаты   трех  остальных  примеров+Шестнадцатиричные  результаты   трех  остальных  примеров
 деления приведены ниже: деления приведены ниже:
- 
    Пример команды IDIV        Остаток        Частное    Пример команды IDIV        Остаток        Частное
  
Строка 532: Строка 490:
 Можно  обнаружить  это,  используя отладчик DEBUG для трасси Можно  обнаружить  это,  используя отладчик DEBUG для трасси
 ровки этих примеров. ровки этих примеров.
- +Повышение  производительности.  При  делении  на  степень
-   Повышение  производительности.  При  делении  на  степень+
 числа 2  (2,  4,  и т.д.)  более  эффективным является сдвиг числа 2  (2,  4,  и т.д.)  более  эффективным является сдвиг
 вправо  на  требуемое  число  битов.  В  следующих  примерах вправо  на  требуемое  число  битов.  В  следующих  примерах
Строка 539: Строка 496:
  
           Деление на 2:       SHR  AX,1           Деление на 2:       SHR  AX,1
- 
- 
- 
-Ассемблер для IBM PC. Глава 12                           273 
- 
- 
           Деление на 8:       MOV  CL,3           Деление на 8:       MOV  CL,3
                               SHR  AX,CL                               SHR  AX,CL
- +==== Переполнения и прерывания ==== 
-   Переполнения и прерывания +Используя  команды  DIV  и  особенно  IDIV,  очень просто
- +
-   Используя  команды  DIV  и  особенно  IDIV,  очень просто+
 вызвать пеpеполнение.  Прерывания  приводят (по крайней мара вызвать пеpеполнение.  Прерывания  приводят (по крайней мара
 в  системе,  используемой при тестировании этих  программ) к в  системе,  используемой при тестировании этих  программ) к
Строка 558: Строка 507:
 генерирует частное,  которое равно делимому, что может также генерирует частное,  которое равно делимому, что может также
 легко вызвать прерывание. легко вызвать прерывание.
-   Рекомендуется   использовать   следующее   правило:  если+Рекомендуется   использовать   следующее   правило:  если
 делитель  -  байт,  то его значение должно  быть меньше, чем делитель  -  байт,  то его значение должно  быть меньше, чем
 левый  байт  (AH)  делителя:  если делитель -  слово, то его левый  байт  (AH)  делителя:  если делитель -  слово, то его
Строка 582: Строка 531:
           DIV  DIVBYTE             DIV  DIVWORD           DIV  DIVBYTE             DIV  DIVWORD
  
-   Для команды IDIV данная логика должна учитывать тот факт,+Для команды IDIV данная логика должна учитывать тот факт,
 что либо делимое, либо делитель могут быть отрицательными, а что либо делимое, либо делитель могут быть отрицательными, а
 так  как  сравниваются  абсолютные  значения,  то необходимо так  как  сравниваются  абсолютные  значения,  то необходимо
Строка 588: Строка 537:
 отрицательного значения в положительное. отрицательного значения в положительное.
  
-   Деление вычитанием+==== Деление вычитанием ====
  
-   Если частное слишком велико, то деление можно выполнить с+Если частное слишком велико, то деление можно выполнить с
 помощью циклического вычитания. Метод заключается в том, что помощью циклического вычитания. Метод заключается в том, что
 делитель вычитается  из делимого и в этом  же  цикле частное делитель вычитается  из делимого и в этом  же  цикле частное
Строка 597: Строка 546:
 находится  в  регистре  AX,   а  делимое  -  в  BX,  частное находится  в  регистре  AX,   а  делимое  -  в  BX,  частное
 вырабатывается в CX: вырабатывается в CX:
- 
- 
- 
- 
-Ассемблер для IBM PC. Глава 12                           274 
- 
- 
           SUB  CX,CX     ;Очистка частного           SUB  CX,CX     ;Очистка частного
      C20: CMP  AX,BX     ;Если делимое < делителя,      C20: CMP  AX,BX     ;Если делимое < делителя,
Строка 611: Строка 553:
           JMP  C20       ;Повторить цикл           JMP  C20       ;Повторить цикл
      С30: RET            ;Частное в CX, остаток в AX      С30: RET            ;Частное в CX, остаток в AX
- +В конце подпрограммы регистр CX будет  содержать частное,
-   В конце подпрограммы регистр CX будет  содержать частное,+
 а AX - oстаток. Пример умышленно примитивен для демонстрации а AX - oстаток. Пример умышленно примитивен для демонстрации
 данной техники  деления.  Если частное получается в регистро данной техники  деления.  Если частное получается в регистро
 вой паре DX:AX, то необходимо сделать два дополнения: вой паре DX:AX, то необходимо сделать два дополнения:
- +   В метке C20 сравнивать AX и BX  только при нулевом DX. 
-   1. В метке C20 сравнивать AX и BX  только при нулевом DX. +   После команды SUB вставить команду SBB DX,00. 
-   2. После команды SUB вставить команду SBB DX,00. +Примечание: очень большое  частное и малый делитель могут
- +
-   Примечание: очень большое  частное и малый делитель могут+
 вызвать тысячи циклов. вызвать тысячи циклов.
  
-ПРЕОБРАЗОВАНИЕ ЗНАКА +==== Преобразование знака ==== 
------------------------------------------------------------- +Команда NEG  обеспечивает  преобразование  знака двоичных
- +
-   Команда NEG  обеспечивает  преобразование  знака двоичных+
 чисел  из  положительного   в   отрицательное   и  наоборот. чисел  из  положительного   в   отрицательное   и  наоборот.
 Практически   команда   NEG   устанавливает  противоположные Практически   команда   NEG   устанавливает  противоположные
 значения битов и прибавляет 1. Примеры: значения битов и прибавляет 1. Примеры:
- 
                NEG  AX                NEG  AX
                NEG  BL                NEG  BL
                NEG  BINAMT    (байт или слово в памяти)                NEG  BINAMT    (байт или слово в памяти)
- +Преобразование знака для 35-битового (или большего) числа
-   Преобразование знака для 35-битового (или большего) числа+
 включает больше  шагов.  Предположим,  что  регистровая пара включает больше  шагов.  Предположим,  что  регистровая пара
 DX:AX содержит  32-битовое  двоичное число.  Так как команда DX:AX содержит  32-битовое  двоичное число.  Так как команда
Строка 646: Строка 581:
                ADD  AX,1 ;Прибавление 1 к AX                ADD  AX,1 ;Прибавление 1 к AX
                ADC  DX,0 ;Прибавление переноса к DX                ADC  DX,0 ;Прибавление переноса к DX
- +Остается  одна  незначительная   проблема:  над  числами,
-   Остается  одна  незначительная   проблема:  над  числами,+
 представленными в двоичном формате,  удобно выполнять арифме представленными в двоичном формате,  удобно выполнять арифме
 тические операции,  если сами числа определены  в программе. тические операции,  если сами числа определены  в программе.
Строка 656: Строка 590:
 в двоичный формат для арифметических вычислений.  Но это уже в двоичный формат для арифметических вычислений.  Но это уже
 тема следующей главы. тема следующей главы.
 +===== Математические сопроцессоры (описание) =====
  
- +Системная   плата  компьютера   содержит  пустое  гнездо,
- +
- +
-Ассемблер для IBM PC. Глава 12                           275 +
- +
- +
-ПРОЦЕССОРЫ INTEL 8087 И 80287 ДЛЯ ОБРАБОТКИ ЧИСЛОВЫХ ДАННЫХ +
------------------------------------------------------------- +
- +
-   Системная   плата  компьютера   содержит  пустое  гнездо,+
 зарезервированное  для числового процессора  Intel 8087 (или зарезервированное  для числового процессора  Intel 8087 (или
 80287). Сопроцессор 8087 действует совместно с 8088, а сопро 80287). Сопроцессор 8087 действует совместно с 8088, а сопро
Строка 677: Строка 603:
 пени.  Математические вычисления в  сопроцессоре выполняются пени.  Математические вычисления в  сопроцессоре выполняются
 примерно в 100 раз быстрее, чем в основном процессоре. примерно в 100 раз быстрее, чем в основном процессоре.
-   Основной  процессор  выполняет  специальные   операции  и+Основной  процессор  выполняет  специальные   операции  и
 передает числовые  данные  в сопроцессор,  который выполняет передает числовые  данные  в сопроцессор,  который выполняет
 необходимые вычисления и возвращает результат.  Для ассембли необходимые вычисления и возвращает результат.  Для ассембли
 рования с  помощью  транслятора  MASM,  необходимо добавлять рования с  помощью  транслятора  MASM,  необходимо добавлять
 параметр /E или /R, например, MASM /R. параметр /E или /R, например, MASM /R.