Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Assembler (Уч_пос_Лаб_Ч1).doc
Скачиваний:
0
Добавлен:
03.01.2020
Размер:
1.43 Mб
Скачать

9.2.1. Представление знаковых и беззнаковых чисел в 16-разрядном компьютере

В вычислительной технике принято считать отрицательными все числа, у которых старший (знаковый) бит равен 1, т. е. в 16-разрядном компьютере это соответствует числам в диапазоне 8000h...0FFFFh. При этом отрицательные числа записываются в дополнительном коде. Положительные числа 0000h ... 7FFFh имеют нулевой старший бит. В табл. 4.1 представлены числа из отмеченных выше диапазонов, которые могут быть определены в сегменте данных программы с помощью директивы DW.

Таблица 4.1

Представление чисел в 16- разрядном компьютере

Десятичное число

8-ричные и 16-ричные числа

Представление чисел в памяти, (hex)

Примечание

65535

...

32768

177777q=FFFFh

...

100000q=8000h

FFFF

...

8000

1

32767

...

127

...

1

0

77777q=7FFFh

...

177q=7Fh

...

1q=1h

0

7FFF

...

007F

...

0001

0000

2

-1

...

-128

...

-32768

-1q=-1h

...

-200q=-80h

...

-100000q=-8000h

FFFF

...

0080

...

8000

3

-32769

...

-65535

-65536

-100001q=-8001h

...

-177777q=-FFFFh

-200000q=-10000h

7FFF

...

0001

0000

4

Определим основные области представления чисел в табл. 4.1: 1 – область старших беззнаковых чисел, 2 – область младших беззнаковых чисел или положительных знаковых чисел, 3 – область отрицательных знаковых чисел, 4 – "квази-область" положительных чисел. Пользоваться этой формой задания чисел, допускаемой ассемблером, не рекомендуется.

В заключение отметим, что знак числа условен. Одно и то же число 0FFFFh может рассматриваться как максимальное число, а в другом – как отрицательное число –1, представленное в дополнительном коде. Таким образом, знак числа является характеристикой не самого числа, а способа его обработки.

9.2.2. Преобразование ascii-кодов чисел с произвольным основанием в двоичное число

Задания к лабораторной работе предусматривают использование чисел с различным основанием (2, 8, 10 и 16), поэтому здесь рассматривается способ, не зависящий от основания системы счисления. Преобразование числовых ASCII-строк в двоичное число обычно реализуется в два этапа. На первом этапе каждая ASCII-цифра (байт) преобразуется в неупакованный формат со старшей нулевой тетрадой, а затем, на втором этапе, цепочка неупакованных байтов преобразуется в число по правилу Горнера.

Наиболее просто реализуется первый этап для чисел с основанием P, равным 2, 8, и 10, и несколько усложняется для основания P = 16.

Из табл. 4.2 следует, что в последнем случае при переходе от ASCII-кода цифры к двоичному коду цифры (младшая тетрада) необходимо предварительно выполнить операцию сравнения на принадлежность ASCII-кода к цифре или прописной букве (A, B, ...F). В первом случае выполняется операция вычитания с числом 30h, а во втором – с числом 37h.

Таблица 4.2

Таблица ASCII- кодов цифр

Цифра (символ)

0

1

9

A

F

16-теричное значение

ASCII- кода символа

30

31

39

41

46

Неупакованный

формат (младшая тетрада)

0000

0001

1001

1010

1111

Реализацию схемы Горнера на втором этапе для n-разрядного числа А = anan-1...a1 с основанием Р можно представить в следующем виде:

anan-1...a2a1=((...(0 * P + an)P + an-1)P +...+a2)P + a1.

П

Неупакованный формат Схема Горнера Двоичное число

02 03 07 (((0*10) + 02)*10 + 03)*10 + 07 11101101

реобразование начинается с самой старшей цифры числа и состоит из n циклов, каждый из которых использует две операции: умножение на основание системы счисления P промежуточного результата (первый промежуточный результат равен 0) с последующим прибавлением к нему двоичного кода (байта) следующей младшей цифры преобразуемого числа.

Пример преобразования десятичного числа: 237(10) = 11101101(2).

Рассмотренный алгоритм преобразования десятичного ASCII-числа в двоичное число реализован в программе, представленной в листинге 4.1.

Листинг 4.1. Преобразовать знаковое десятичное ASCII-число из буфера (6 байт = знак + 5 цифровых разрядов) по адресу в bx в 16-разрядное двоичный код в регистре ax.

Comment /*

Вход: Знаковое десятичное ASCII-число в буфере байтового типа с начальным адресом в BX,

CX -количество ASCII-символов числа, включая знак '-'.

Расположение числа в буфере: в первом байте буфера располагается старший цифровой разряд положительного числа или знак "минус" отрицательного.

Выход: ax -16-разрядное двоичный код в регистре ax,

Флаг cf=1, если преобразуемое число больше 32767 или меньше -32768, иначе cf=0. */

proc #dec_bin

cmp [byte bx],'-' ;Отрицательное число?

jne positive

inc bx ;Продвинем указатель и

dec cx ;уменьшим счётчик цикла

call conv ;Преобразуем модуль отрицательного десятичного числа.

;На выходе: ax – двоичный код,

;сf=1, если преобразуемое число превышает значение 65535 (т.е. регистр ax переполнится в процессе преобразования)

jc overflow ;Число > 65535?

cmp ax,32768

ja overflow ;Число >32768

neg ax ;Сформируем дополнительный код

js good ;Закончим преобразование

positive: call conv ;Преобразуем модуль положительного десятичного числа.

jc overflow ; Число > 65535?

cmp ax,32767

jbe good ;Число< 32767

overflow: stc ;cf=1

jmp n_good ;Выйдем из преобразования

good: clc ;cf=0

n_good: ret

endp #dec_bin

proc conv ;

push dx di

xor ax,ax ;Очистим регистр двоичного числа

mov di,10 ;10- основание системы счисления

cycl: mul di ;dx:ax = ax*10

jc over_flow ;Переход, если CF=1

mov dl,[bx] ;Выберем очередную ASCII-цифру

sub dl,30h ;Образуем двоичное число

add ax,dx ;Промежуточная сумма

jc over_flow ;Переход, если CF=1

inc bx

loop cycl ;Продолжим, если cx>0

clc ;Нет, сбросим флаг CF=1

over_flow: pop di dx

ret

endp conv

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