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

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




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

                   «7. 2. Еще один пример на преобразование данных»

Рассмотрим пример программы преобразования двузначного шестнадцатеричного числа в символьном виде в двоичное представление более подробно.

       В данной программе описываются три сегмента, заключенные между директивами segment и ends. Это:

1. сегмент данных – 9 – 11 строки программы;

2. сегмент стека – 12 – 14 строки программы: под него выделяется память 256 байт, инициализированная символами ««? »»; данный сегмент желательно определять всегда;

3. сегмент кода – 15 – 44 строки программы: здесь определена одна процедура main – строки 16 – 43.

 

Строка 17 – это директива ассемблера, связывает сегментные регистры с именами сегментов.

 

Строки 18 – 19 выполняют инициализацию сегментного регистра ds.

 

Строки 20 – 22 выводят на экран сообщение message:

mov ah, 9

mov dx, offset message

int   21h

Функция 09h прерывания INT 21h осуществляет вывод строки символов на экран.

 

Строка 23 подготавливает регистр ax к работе – обнуляет его.

 

Команда XOR:

XOR операнд1, операнд2

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

       Команда воздействует на флаги CF, OF, PF, SF и ZF.

 

Строки 24 – 25 обеспечивают ввод символа с клавиатуры:

Функция 01h прерывания INT 21h осуществляет ввод символа с клавиатуры с эхом на экран.

Введенный символ помещается в регистр al.

 

Строка 26 пересылает содержимое al в регистр dl для того, чтобы освободить al для ввода второй цифры.

 

Строка 27 преобразует символ, введенный с клавиатуры, в его двоичный эквивалент путем вычитания 30h, в результате чего в dl будет реальное число, а не символ.

 

Команда SUB:

SUB операнд1, операнд2

       Вычитает байт или слово в регистре, памяти или непосредственное значение из регистра; или вычитает байт или слово в регистре или непосредственное значение из памяти.

       Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.

 

Строки 28 – 29 выясняют, нужно ли корректировать двоичное значение в dl. Если оно в диапазоне от 0 до 9, то в dl - правильный двоичный эквивалент введенного символа шестнадцатеричной цифры. Если значение в dl больше 9, то введенная цифра является одним из символов A, B, C, D, E, F (строчные буквы для экономии места обрабатывать не будем). В первом случае строка 29 передаст управление на метку М1.

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

                   «7. 3. Продолжение рассмотрения примера»

Команда JLE:

JLE имя_метки

       Осуществляет переход по «меньше или равно». Если флаг ZF равен единице (нулевое состояние) и флаги SF и OF различны, то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход.

 

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

mov cl, 4h

shl  dl, cl

В данном случае в cl заносится количество сдвигов – 4. а команда SHL осуществляет сдвиг регистра dl cl раз.

 

Команда SHL:

SHL операнд1, операнд2

       Выполняет логический сдвиг битов влево, рассматривая знаковый бит как обычный бит данных. Данная операция может выполняться в байте или в слове, в регистре или в памяти. Сдвиг на один бит кодируется в команде значением 1; сдвиг более чем на 1 бит требует указания регистра cl, который содержит счетчик сдвига. При сдвиге правый освобождающийся бит заполняют нулевым значением. Значения битов, выдвигаемых за разрядную сетку, теряются.

       Команда воздействует на флаги CF, OF, PF, SF и ZF.

 

Строка 34 вводит вторую шестнадцатеричную цифру.

Ввод снова осуществляется функцией 01h прерывания INT 21h, но занесения в регистр ah значения 01h на этот раз не требуется, т. к. он все еще храниться ah с прошлого вызова этого прерывания (регистр ah не участвовал в командах, и его содержимое не могло быть затерто другими значениями). Результат ввода снова в регистре al. Таким образом, на данном этапе выполнения программы в dl содержится первая введенная цифра шестнадцатеричного числа, а в al – вторая.

 

Строки 35-37 выясняют, попадает ли двоичный эквивалент второго введенного символа шестнадцатеричной цифры в диапазон от 0 до 9, т. е. выполняет действия, аналогичные действиям из строк 28 – 29, но для второго введенного символа, за одним лишь изменением – переход осуществляется по метке М2.

 

В случае непопадания значения из регистров dl в первом случае (при работе с первым введенным символом) и al – во втором (при работе со вторым введенным символом) в диапазон от 0 до 9 осуществляется переход на строки 30 и 38 соответственно.

В данных строчках осуществляется корректировка значений введенных цифр в регистрах dl и al согласно таблице ASCII -кодов, согласно которой значение реальной шестнадцатеричной цифры от кода символа отличается на значение 37h для прописных символов A, B, C, D, E, F. В связи с эти нам нужно отнять от содержимого регистров dl и al еще 07h, т. к. значение 30h уже было вычтено из них ранее. Таким образом, после выполнения этих строк в dl и al будут содержаться реальные шестнадцатеричные цифры.

Строка 40 производит сложение сдвинутого значения в dl с числом в al. В результате выполнения данной операции в регистре dl будет содержаться реальный двоичный эквивалент двух введенных символов, изображающих двузначное шестнадцатеричное число.

 

Строки 41-42 предназначены для завершения программы и возврата управления операционной системе.

Реализуется функцией 4C00h прерывания INT 21h - завершение подпроцесса с возвратом управления.

 

Строки 43-45 реализуют завершение процедуры main, сегмента кода и самой программы.

 


Поделиться:





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



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