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

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




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

Решение проблемы ввода числовых данных.

(слайд №32-33)

 

Пример:

< 1> ; ------------------------------Pr_char_to_bin. asm-----------------------------------

< 2> ; Программа преобразования двузначного шестнадцатиричного числа

< 3> ; в символьном виде в двоичное представление.

< 4> ; Вход: исходное шестнадцатиричное число из двух цифр

< 5> ; вводится с клавиатуры.

< 6> ; Выход: результат преобразования помещается в регистр dl.

< 7> ; -----------------------------------------------------------------------------------------

< 8> ; -----------------------------------------------------------------------------------------

< 9> data segment para public “data” ; сегментданных

< 10> message     db   “Введите две шестандцатиричные цифры, $”

< 11> data ends

< 12> stk segment stack

< 13>           db 256 dup (“? ”)              ; сегмент стека

< 14> stk ends

< 15> code segment para public “code”; начало сегмента кода

< 16> main proc                                  ; начало процедуры main

< 17>        assume cs: code, ds: data, ss: stk

< 18>           mov ax, data                 ; адрес сегмента данных в регистр ax

< 19>           mov ds, ax                    ; ax в ds

< 20>           mov ah, 9

< 21>           mov dx, offset message

< 22>           int   21h

< 23>           xor  ax, ax                    ; очистить регистр ax

< 24>           mov ah, 1                      ; 1h в регистр ah

< 25>           int   21h                       ; генерация прерывания с номером 21h

< 26>           mov dl, al                     ; содержимое регистра al в регистр dl

< 27>           sub dl, 30h                  ; вычитание: (dl) = (dl) – 30h

< 28>           cmp dl, 9h                    ; сравнить dl с 9h

< 29>           jle   M1                        ; перейти на метку M1, если dl< 9h или dl=9h

< 30>           sub dl, 7h                    ; вычитание: (dl) = (dl) – 7h

< 31> M1:                                               ; определение метки M1

< 32>           mov cl, 4h                        ; пересылка 4h в регистр cl

< 33>           shl  dl, cl                     ; сдвиг содержимого dl на 4 разряда влево

< 34>           int   21h                       ; вызов прерывания с номером 21h

< 35>           sub al, 30h                   ; вычитание: (dl) = (dl) – 30h

< 36>           cmp al, 9h                     ; сравнить (al) с 9h           28

< 37>           jle   M2                        ; перейти на метку M2, если al< 9h или al=9h

< 38>           sub al, 7h                     ; вычитание: (al) = (al) – 7h

< 39> M2:                                               ; определение метки M2

< 40>           add dl, al                     ; сложение: (dl) = (dl) + (al)

< 41>           mov ax, 4c00h              ; пересылка 4c00h в регистр ax

< 42>           int   21h                       ; вызов прерывания с номером 21h

< 43> main endp                                 ; конец процедуры main

< 44> code ends                                    ; конец сегмента кода

< 45> end main                                      ; конец программы с точки входа main

 


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

                   « 7. 1. Разбор примера по преобразованию данных»

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

       Данная проблема возникает из-за того, что ввод информации с клавиатуры и вывод ее на экран осуществляется в символьном виде. Кодирование этой информации производится согласно таблице ASCII. В таблице ASCII каждый символ кодируется одним байтом. Если работа происходит с числами, то при попытке их обработать сразу возникает проблема: команд для арифметической обработки чисел в символьном виде нет. Поэтому необходимо преобразовывать символьную информацию к формату, поддерживаемому машинными командами. После такого преобразования нужно выполнять необходимые вычисления и преобразовывать результат обратно к символьному виду. Затем следует отобразить информацию на мониторе.

 

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

 

(слайд №34)

       В основу ее алгоритма положена особенность, связанная с ASCII -кодами символов соответствующих шестнадцатеричных цифр. Отметим, что шестнадцатеричные цифры формируются из символов 0, 1, …, 9, A, B, C, D, E, F, a, b, c, d, e, f.

Например:

12Af, 34aE

 

Для примера рассмотрим двоичную последовательность:

 

Оперативная память состоит из ячеек – байтов – по 8 бит. Приведенная выше цепочка битов при разбиении ее на байты будет выглядеть следующим образом:

01010001     01010111 10101101   11010101   01010001   01001010

 

Далее каждый байт разобьем на 2-е части по 4 бита – тетрады:

0101 0001 0101 0111 1010 1101 1101 0101 0101 0001 0100 1010

Теперь каждой тетраде можно поставить в соответствие одну шестнадцатеричную цифру:

(слайд №35)

Символ шестнадцатеричной цифры ASCII-код (двоичное представление) Двоичная тетрада
30h (0011     0000)
31h (0011     0001)
32h (0011     0010)
33h (0011     0011)
34h (0011     0100)
35h (0011     0101)
36h (0011     0110)
37h (0011     0111)
38h (0011     1000)
39h (0011     1001)
A, a 41h (0100     0001), 61h (0110 0001)
B, b 42h (0100     0010), 62h (0110 0010)
C, c 43h (0100     0011), 63h (0110 0011)
D, d 44h (0100     0100), 64h (0110 0100)
E, e 45h (0100     0101), 65h (0110 0101)
F, f 46h (0100     0110), 66h (0110 0110)

(слайд №36)

Если заменить в последней полученной ранее строке тетрады на соответствующие шестнадцатеричные цифры, то получается:

51   57     ad d5   51   8a

т. е.

0101 0001 0101 0111 1010 1101 1101 0101 0101 0001 0100 1010

5     1       5  7     a     d     d     5     5     1     8     a

 

       После рассмотрения таблицы ASCII -кодов для символов шестнадцатеричной системы счисления можно заметить, что для шестнадцатеричных чисел 0 … 9 код ASCII отличается от соответствующего двоичного представления на 0011       0000 или 30h. Поэтому для этих цифр есть 2-а пути преобразования:

1. выполнить двоичное вычитание: (код ASCII )h – 30h;

2. обнулить старшую тетраду байта с символом шестнадцатеричной цифры в коде ASCII.

 

       Таким образом, с шестнадцатеричными цифрами от 0 до 9 все просто. А вот с шестнадцатеричными цифрами a, b, c, d, e, f все сложнее, т. к. в их случае алгоритм должен распознавать эти символы и производить дополнительные действия при их преобразовании в соответствующее двоичное число. При этом, для их преобразования уже будет недостаточно простого вычитания или обнуления старшой тетрады. Это связано с тем, что символы прописных букв шестнадцатеричных цифр отличаются от своего двоичного эквивалента на величину 37h, а соответствующие строчные буквы – на 67h.

       Поэтому алгоритм преобразования должен различать прописные и строчные буквенные символы шестнадцатеричных цифр и корректировать значение кода ASCII на величину 37h или 67h.

 


Поделиться:





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



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