Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sistemnoe_programmirovanie / 06 Мр по лаб_раб_Асс_инф.doc
Скачиваний:
135
Добавлен:
18.02.2016
Размер:
1.18 Mб
Скачать

Лабораторная работа №2 преобразование форматов числовых данных в операциях ввода-вывода

2.1 Целевые установки

  • Программирование операций преобразования чисел с произвольным основанием из ASCII-формата в двоичный код и наоборот.

  • Освоение принципов многомодульного программирования.

2.2 Методические рекомендации

Для обеспечения высокой производительности процессора при выполнении им арифметико-логических операций над числовыми данными используется их двоичное представление, однако, все данные, поступающие в машину с клавиатуры или выводимые с процессора на принтер или экран дисплея, представляются в кодах ASCII. Следовательно, одной из основных функций процессора является преобразование внешнего формата данных во внутренний двоичный формат и наоборот – из двоичного формата в кодыASCII.

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

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

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

Таблица2.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, представленное в дополнительном коде. Таким образом, знак числа является характеристикой не самого числа, а способа его обработки.

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

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

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

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

Таблица2.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.

Листинг 2.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

jaoverflow;Число >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 ;

pushdxdi

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

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

cycl:muldi;dx:ax=ax*10

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

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

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

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

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

incbx

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

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

over_flow: pop di dx

ret

endpconv