Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Страница 16 «7 Проблема ввода числовых данных.»




Страница 16 «7 Проблема ввода числовых данных. »

«7. 4. Пример преобразования на основе ASCII-формата в двоичный формат».

Пример преобразования из ASCII-формата в двоичный формат и наоборот.

(слайд №38)

 

       Рассматриваемый в данном примере метод преобразования будет основан на том, что ASCII-формат имеет основание 10, а компьютер выполняет арифметические операции только над числами с основанием 2. Процедура преобразования заключается в следующем:

1. Начинают с самого первого байта числа в ASCII-формате и обрабатывают справа налево.

2. Удаляют тройки из левых шестнадцатеричных цифр каждого ASCII-байта.

3. Умножают ASCII цифры на 1, 10, 100 (01h, 0Ah, 64h) и т. д. и складывают результаты.

 

Пример:

Преобразование числа 1234 из ASCII-формата в двоичный формат:

 

  Десятичное Шестнадцатеричное
4 х 1 =
3 х 10 = 1e
2 х 100 = c8
1 х 1000 = 3e8
Результат:   04d2

 

В примере в процедуре b10asbi выполняется преобразование ASCII-числа 1234 в двоичный формат. В примере предполагается, что длина ASCII-числа равна 4 и она записана в поле asclen. Для инициализации адрес ASCII-поля ascval-1 заносится в регистр si, а длина - в регистр bx.

 

Команда по метке b20 пересылает ascii-байт в регистр al:

mov al, [si+bx]

 

(слайд №39)

Здесь используется адрес ascval-1 плюс содержимое регистра bx (4), т. е. получается адрес ascval+3 (самый правый байт поля ascval). В каждом цикле содержимое регистра bx уменьшается на 1, что приводит к обращению к следующему слева байту. Для данной адресации можно использовать регистр bx, но не cx, и, следовательно, нельзя применять команду loop. В каждом цикле происходит также умножение поля mult10 на 10, что дает в результате множители 1, 10, 100 и т. д. Такой прием применен для большей ясности, однако, для большей производительности множитель можно хранить в регистре si или di.

 

Для того, чтобы напечатать или отобразить на экране арифметический pезультат, необходимо преобразовать его в ASCII-формат. Данная операция включает в себя процесс обратный предыдущему. Вместо умножения используется деление двоичного числа на 10 (0Ah) пока результат не будет меньше 10. Остатки, которые лежат в границах от 0 до 9, образуют число в ASCII-формате.

В качестве примера рассмотрим преобразование шестнадцатеричного числа 4d2 обратно в десятичный формат:

 

  Частное Остаток
4d2: a 7b
7b: a c
c: a

 

Так как последнее частное 1 меньше, чем шестнадцатеричное 0Ah, то операция завершена.

Остатки вместе с последним частным образуют результат в ASCII-формате, записываемый справа налево 1234. Все остатки и последнее частное должны записываться в память с тройками, т. е. 31323334.

 

В примере процедура c10bias преобразует шестнадцатеричное 4d2 (результат вычисления в процедуре b10asbi) в ASCII-число 1234.

 

Текст программы:

(слайд №40)

 

codesg segment para 'code'

assume       cs: codesg, ds: codesg, ss: codesg

org  100h

begin: jmp short main

; -------------------------------------------

ascval db   '1234'        ; Элементы данных

binval db   0

asclen db   4

mult10 db   1

; -------------------------------------------

main proc near            ; Основная процедура:

call b10asbi     ; Вызвать преобразование ascii

call c10bias      ; Вызвать преобразование двоичное

ret

main endp

;           -------------------------------

;           Преобразование ascii в двоичное:

;           -------------------------------

b10asbi proc

mov cx, 10         ; Фактор умножения

lea  si, ascval-1 ; Адрес ascval

mov bx, asclen   ; Длина ascval

В20:

mov al, [si+bx]   ; Выбрать ascii-символ

and ax, 000fh   ; Очистить зону тройки

mul mult10      ; Умножить на фактор 10

add binval, ax   ; Прибавить к двоичному

mov ax, mult10  ; Вычислить следующий

mul cx              ; фактор умножения

mov mult10, ax

dec bx              ; Последн. ascii-символ?

jnz  В20           ; Нет - продолжить

ret

b10asbi endp

;           -------------------

;           Преобр. дв. в ascii:

;           -------------------

c10bias proc

mov cx, 0010     ; Фактор деления

lea  si, ascval+3; Адрес ascval

mov ax, binval   ; Загрузить дв. число

С20:

cmp aХ, 0010    ; Значение меньше 10?

jb    С30           ; Да - выйти

xor  dx, dx        ; Очистить часть частного

div  cx              ; Разделить на 10

or    dl, 30h

mov [si], dl        ; Записать ascii-символ

dec si

jmp С20

c30:

or    al, 30h        ; 3аписать поcл. частное

mov [si], al         ; как ascii-символ

ret

c10bias endp

codesg ends

end begin

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...