Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
175-199.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
379.75 Кб
Скачать

Большой размерности

Если вы заметили, команды сложения и вычитания работают с операндами фик-

сированной размерности: 8, 16, 32 бита. А что делать, если нужно сложить числа

большей размерности, например 48 битов, используя 16-разрядные операнды?

К примеру, сложим два 48-разрядных числа (рис. 8.5).

Рис. 8.5. Сложение операндов большой размерности

Рисунок по шагам иллюстрирует технологию сложения длинных чисел. Вид-

но, что процесс сложения многобайтных чисел происходит так же, как и при сло-

жении двух чисел ≪в столбик≫, — с осуществлением при необходимости переноса

1 в старший разряд. Если нам удастся запрограммировать этот процесс, то мы зна-

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

операции сложения и вычитания.

Принцип вычитания чисел с диапазоном представления, превышающим стан-

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

Арифметические операции над целыми двоичными числами 177

ется флаг переноса CF. Нужно только представлять себе процесс вычитания в стол-

бик и правильно комбинировать команды процессора с командой SB В. Чтобы на-

писать достаточно интересную программу, моделирующую этот процесс, необхо-

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

Среди прилагаемых к книге файлов в каталоге данной главы находятся исходные

тексты подпрограмм, реализующих четыре основных арифметических действия

для двоичных операндов произвольной размерности1. Не поленитесь вниматель-

но изучить их, так как они являются хорошей иллюстрацией к материалу, изучае-

мому в этой и последующих главах. К этим примерам можно будет обратиться в -

полной мере после того, как будут изучены механизмы процедур и макрокоманд

(главы 14 и 15). Кроме того, в [8] обсуждаются вопросы программирования цело-

численных арифметических операций, но в расширенном контексте.

В завершение обсуждения команд сложения и вычитания отметим, что кроме

флагов CF и OF в регистре EFLAGS есть еще несколько флагов, которые можно ис-

пользовать с двоичными арифметическими командами. Речь идет о следующих

флагах:

^ ZF — флаг нуля, который устанавливается в 1, если результат операции равен О,

и в 0, если результат не равен 0;

Ш SF — флаг знака, значение которого после арифметических операций (и не толь-

ко) совпадает со значением старшего бита результата, то есть с битом 7,15 или

31 (Таким образом, этот флаг можно использовать для операций над числами

со знаком).

Команда сравнения

Команда сравнения СМР (СоМРаге) имеет интересный принцип работы. Он абсо-

лютно такой же, как у команды вычитания SUB (см. главу 8). Команда СМР так же,

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

устанавливает флаги. Единственное, чего она не делает, — не записывает резуль-

тат вычитания на место первого операнда.

Синтаксис команды СМР:

стр операнд_1,операнд_2

Флаги, устанавливаемые командой СМР, можно анализировать специальными

командами условного перехода. Прежде чем мы их рассмотрим, уделим немного

внимания мнемонике этих команд (табл. 10.1). Понимание обозначений (элемен-

тов в названии команды JCC, обозначенных нами символами ≪ее≫) при формирова-

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

практическое использование.

Таблица 10.1. Значение аббревиатур в названии команды jcc

В табл. 10.2 представлен перечень команд условного перехода для команды СМР.

Не удивляйтесь тому обстоятельству, что одинаковым значениям флагов соответ-

ствуют несколько разных мнемокодов команд условного перехода (они отделены

друг от друга косой чертой). Разница в названии обусловлена желанием разработ-

8 Зак. 256

226 Глава 10. Команды передачи управления

чиков процессора упростить использование команд условного перехода с разны-

ми группами команд. Поэтому разные названия отражают скорее разную функцио-

нальную направленность. Тем не менее, то, что эти команды реагируют на одни

и те же флаги, делает их абсолютно эквивалентными и равноправными в програм-

ме. Именно поэтому они сгруппированы не по названиям, а по значениям флагов

(условиям), на которые они реагируют.

Таблица 10.2. Перечень команд условного перехода для команды стр

В качестве примера применения команды CMP рассмотрим фрагмент програм-

мы, который обнуляет поле pole_m длиной п байт:

.data

n equ 50

pole_m db

.code

n dup (?)

xor bx.bx ;bx=0

ml: mov mem[bx],0

inc bx

cmp bx,n

jne ml

exit:

Так как команды условного перехода не изменяют флагов, то после одной ко-

манды СМР вполне могут следовать несколько команд условного перехода. Это

может быть сделано для того, например, чтобы исследовать каждую из альтерна-

тивных ветвей: больше, меньше или равно:

.data

mas db

.code

dup (?)

eql:

cmp mas[si].5

je eql

jl low

jg grt

;сравнить очередной элемент массива с

; переход, если элемент mas равен 5

•.переход, если элемент mas меньше 5

;переход, если элемент mas больше 5

Условные переходы 227

low:

grt:

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