Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скляров И. Изучаем Assembler за 7 дней (2010).pdf
Скачиваний:
1335
Добавлен:
23.02.2015
Размер:
2.11 Mб
Скачать

http://www.sklyaroff.ru

90

двойное слово: от -2 147 483 648 до +2 147 483 647.

5.2.2. BCD-числа

В BCD-формате каждая десятичная цифра числа кодируется группой из четырех бит.

Существует две разновидности BCD-формата: упакованный и неупакованный форматы.

В неупакованном формате в одном байте (в младших четырех битах) размещается одна десятичная цифра, значение старшей половины байта в этом случае не определено. Пример представления беззнакового десятичного числа в неупакованном BCD-формате:

5096 xxxx0101

xxxx0000

xxxx1001

xxxx0110

 

 

 

 

1байт

2байт

3байт

4байт

В упакованном формате в каждом байте хранится две цифры числа (в старшей и младшей половине). Пример представления беззнакового десятичного числа в упакованном BCD-формате:

5096 01010000

10010110

 

 

1байт

2байт

BCD-числа со знаком образуются почти также как обычные двоичные числа со знаком. Положительные BCD-числа записываются как беззнаковые, но знак хранится и обрабатывается в отдельном байте, который заполнен нулями. Отрицательные BCD-числа представляются в дополнительном коде по следующему алгоритму:

все цифры десятичного числа, кроме младшей (самой правой), заменяются на их дополнение до 9 (т. е. 9 – {цифра});

последняя (младшая) цифра заменяется дополнением до 10 (т. е. 10 – {цифра});

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

Например, получим дополнительный код из числа 152 (т. е. отрицательное число - 152) в упакованном BCD-формате:

0152 = 0000 0001 0101 0010 дополнительный код (-0152) = 1000 0000 1001 1000 0100 1000

Способ определения и обработки BCD-чисел в программе целиком зависит от предпочтения программиста. Обычно неупакованные BCD-числа определяются в программе с помощью директивы db (на каждое число отводится один байт), например:

bcd_unpack db 5,9,0,1,4 ; неупакованное BCD-число 59014

Часто программисты для удобства обработки определяют неупакованные BCD-числа в обратном порядке (в этом случае в памяти компьютера число будет представлено в прямом порядке), пример:

bcd_unpack db 4,1,0,9,5 ; неупакованное BCD-число 59014

Кроме того, часто используются ASCII-коды для представления цифр неупакованного BCD-числа для удобства вывода на экран:

bcd_unpack db '59014' ; неупакованное BCD-число '5','9','0','1','4'

или в обратном порядке:

bcd_unpack db '41095' ; неупакованное BCD-число '5','9','0','1','4'

Упакованные BCD-числа обычно определяются с помощью директивы dt, например: bcd_pack dt 325417 ; упакованное BCD-число 325417

5.2.3. Команды, работающие с целыми двоичными числами

5.2.3.1. Сложение и вычитание

Основной инструкцией для сложения целых двоичных чисел является ADD, а для вычитания SUB.

http://www.sklyaroff.ru

91

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

ADD приемник,источник

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

SUB приемник,источник

Пример: mov ax,10

add ax,6 ; ax=ax+6 sub ax,9 ; ax=ax-9

В результате выполнения этих инструкций в регистре AX окажется число 7.

5.2.3.2. Инкремент и декремент

В ассемблере, как и в языках Си/Си++, имеются операторы инкремента и декремента: inc операнд

dec операнд

Инкремент увеличивает значение операнда на 1, а декремент уменьшает значение операнда на 1, т.е. команда INC аналогична команде ADD приемник,1, а команда DEC аналогична команде SUB приемник,1. Единственное отличие: команды INC и DEC не меняют флаг переноса CF.

Преимущество команд INC и DEC в том, что они занимают меньше места в памяти и выполняются быстрее, чем соответствующие команды ADD и SUB.

Примеры:

mov al,15

; al=15

inc al

; al=16

dec al

; al=15

5.2.3.3. Умножение и деление

Для умножения чисел без знака используется инструкция MUL, а для умножения чисел со знаком инструкция — IMUL:

MUL операнд-источник

IMUL операнд-источник

Обратите внимание, что данные команды требуют указывать только один операнд. В качестве второго операнда команды MUL и IMUL используют либо содержимое регистра AL при операциях над байтами, либо AX при операциях над словами, либо EAX при операциях над двойными словами. Результат умножения соответственно помещается в AX, в DX:AX или в EDX:EAX.

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

Деление чисел без знака выполняет команда DIV, а чисел со знаком — команда IDIV:

DIV операнд-источник

IDIV операнд-источник

Также как инструкции умножения, инструкции деления требуют указывать только один операнд. Операнд-источник является делителем, а в качестве делимого используется либо содержимое регистра AL при операциях над байтами, либо AX при операциях над словами, либо EAX при операциях над двойными словами. Результат деления помещается в AL, AX или EAX, а остаток – в AH, DX или EDX соответственно.

Также как в случае команд умножения выбор подходящей команды деления и контроль за форматом обрабатываемых чисел лежит на самом программисте.

5.2.3.4. Изменение знака числа

Команда NEG изменяет знак числа на противоположный:

NEG операнд