- •3.11.1 Команды пересылки данных
- •Команды пересылки общего назначения
- •Xchg приемник, источник
- •Команды загрузки адресных значений
- •Команды обращения к стеку
- •Команды пересылки флагов
- •Команды ввода/вывода
- •In аккумулятор, порт
- •In аккумулятор, dx.
- •3.11.2. Арифметические команды
- •Типы арифметических данных
- •Команды инкрементирования и декрементирования
- •Inc приемник
- •Команды сложения и вычитания
- •Команды расширения знака
- •Команды умножения и деления
- •Imul источник.
- •Команды десятичной коррекции
- •Сложение в bdc-формате
- •Вычитание в bcd-формате
- •Сложение в ascii-формате
- •Вычитание в ascii-формате
- •Умножение в ascii-формате
- •Деление в ascii-формате
- •3.11.3 Логические команды
- •Команды логических операций
- •Команды сравнения
- •Команды сдвигов
- •Команды логических сдвигов
- •Команды арифметических сдвигов
- •Команды циклических сдвигов
- •3.11.4. Команды передачи управления
- •Команды безусловных переходов
- •Команды условных переходов
- •Команды перехода по состоянию арифметических флагов
- •Команды перехода по соотношению между числами
- •Команды перехода по состоянию регистра cx
- •Команды управления циклами
- •Команды для организации подпрограмм
- •Команды прерываний
- •3.11.5. Команды обработки строк
- •Строковые примитивы
Сложение в ascii-формате
Сложение в ASCII-формате также выполняется в два этапа: сначала байты операндов суммируются как двоичные числа с помощью команд ADD или ADC, а затем осуществляется коррекция результата командой AAA. Коррекция реализуется в соответствии с алгоритмом, приведенным на рис. 3.4,а.
Если младшая тетрада регистра AL содержит число, большее 9, или флаг AF=1, то выполняется корректирующее сложение и увеличивается на 1 содержимое регистра AH. Далее обнуляется старшая тетрада регистра AL и флагу основного переноса CF присваивается значение флага AF. Таким образом, перенос, возникающий при сложении, учитывается дважды: в регистре AH и флаге CF. Значение CF используется при сложении длинных чисел, а инкрементирование AH при сложении не имеет смысла и используется при реализации некоторых алгоритмов умножения в ASCII-формате. Однако необходимо помнить, что команда AAA изменяет содержимое регистра AH, и, если оно существенно, то его необходимо сохранять.
Пример 3.74:
Вычислить Z=X+Y, где X, Y – десятичные ASCII-слова в памяти.
MOV AL, X ; Сложение младших
ADD AL, Y ; байтов
AAA ; Коррекция (внимание – (AH))
MOV Z, AL
MOV AL, X+1 ; Сложение старших
ADC AL, Y+1 ; байтов
AAA ; Коррекция (внимание – (AH))
MOV Z+1, AL
Рис. 3.4. Алгоритмы коррекции ASCII-сложения и ASCII-вычитания:
а) коррекция сложения командой AAA;
б) коррекция вычитания командой AAS
Команда AAA правильно формирует флаг CF. Все остальные арифметические флаги после ее выполнения неопределены.
Вычитание в ascii-формате
Вычитание в ASCII-формате также выполняется в два этапа: сначала байты операндов вычитаются как двоичные числа с помощью команд SUB и SBB, а затем осуществляется коррекция результата командой AAS. Коррекция реализуется в соответствии с алгоритмом, приведенным на рис. 3.4,б.
Если младшая тетрада регистра AL содержит число большее 9 или флаг AF=1, то выполняется корректирующее вычитание и уменьшается на 1 содержимое регистра AH. Далее обнуляется старшая тетрада регистра AL и флагу основного переноса CF присваивается значение флага AF. Таким образом, заем, возникающий при вычитании, учитывается дважды: в регистре AH и флаге CF. Значение CF используется при вычитании длинных чисел, а декрементирование регистра AH при вычитании не имеет смысла и используется при реализации некоторых алгоритмов деления в ASCII-формате. Однако, необходимо помнить, что команда AAS изменяет содержимое регистра AH, и, если оно существенно, то его необходимо сохранять.
Пример 3.75:
Вычислить Z=X–Y, где X,Y – десятичные ASCII-слова в памяти.
MOV AL, X ; Вычитание младших
SUB AL, Y ; байтов
AAS ; Коррекция (внимание – (AH))
MOV Z, AL
MOV AL, X+1 ; Вычитание старших
SBB AL, Y+1 ; байтов
AAS ; Коррекция (внимание – (AH))
MOV Z+1, AL
Команда AAS правильно формирует флаг CF. Все остальные арифметические флаги после ее выполнения не определены.
При получении отрицательной разности флаг CF=1, и результат представлен в дополнительном десятичном коде.