Страница 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)
(слайд №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 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|