Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
001.doc
Скачиваний:
1
Добавлен:
12.11.2019
Размер:
275.97 Кб
Скачать

В качестве необходимых для самостоятельного изучения разделов предлагается [4]:

ГЛАВА 6 Программы в COM-файлах.

ГЛАВА 7 Логика и Организация Программы

ГЛАВА 8. Работа с экраном I: Основные возможности.

ГЛАВА 22 Программный загрузчик.

ТЕМА 3. НАПИСАТЬ ПРОГРАММУ ПЕРЕВОДА ЧИСЕЛ В 10-Ю, 16-Ю, 2-Ю СИСТЕМЫ ИСЧИСЛЕНИЯ.

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

Например,

Введите число:

abcdh

В двоичной: 1010101111001101b

В десятичной: 43981d

В рамках данной темы продолжается работа со строковыми данными и функциями ввода/вывода. Так как при вводе с клавиатуры данные попадают в программу в символьном либо специальном (скан-коды) виде, то необходимо при вводе чисел преобразовать их из символьного в числовое представление. В первой работе мы выводили на экран содержимое ASCII-таблицы, и могли заметить, что код символа ‘0’ равен 48 десятичному или 30h шестнадцатеричному. Т.е. для получения из символа ‘0’ числа 0 нужно вычесть 48 или 30h:

Пусть в al символ ‘9’, код которого - 57

sub al, 48 ; теперь в al цифра 9

Ввод данных

Ниже дан пример, в котором определен список параметров для области ввода. LABEL представляет собой директиву с атрибутом BYTE. Первый байт содержит максимальную длину вводимых данных. Так как это однобайтовое поле, то его максимальное возможное значение - шест. FFh или 255d. Другой байт необходим DOS для занесения в него реального числа введенных символов. Третьим байтом начинается поле, которое будет содержать введенные символы.

NAMEPAR LABEL BYTE ;Список параметров:

MAXLEN DB 20 ; Максимальна количество байтов

ACTLEN DB ? ; Реальное количество байтов

NAMEFLD DB 20 DUP (' ') ; Введенные символы

Так как в списке параметров директива LABEL не занимает места, то NAMEPAR и MAXLEN указывают на один и тот же адрес памяти.

Для запроса на ввод необходимо поместить в регистр AH номер функции -10 (шест. 0AH), загрузить адрес списка параметров (NAMEPAR в нашем примере) в регистр DX и выполнить INT 21H:

MOV AH,0AH ;Запрос функции ввода

LEA DX,NAMEPAR ;Загрузить адреса списка параметров

INT 21H ;Вызвать DOS

Функция 0AH 21го прерывания ожидает пока пользователь не введет с клавиатуры текст, проверяя при этом, чтобы число введенных символов не превышало максимального значения, указанного в списке параметров (20 в нашем примере). Для указания конца ввода пользователь нажимает клавишу Return.

Код этой клавиши (шест. 0D) также заносится в поле ввода (NAMEFLD в нашем примере). Если, например, пользователь ввел имя BROWN (Return), то список параметров будет содержать информацию:

дес.: |20| 5| В| R| O| W| N| #| | | | | ...

шест.: |14|05|42|52|4F|57|4E|0D|20|20|20|20| ...

Во второй байт списка параметров (ACTLEN в нашем примере) команда заносит длину введенного имени - 05. Код Return находится по адресу NAMEFLD +5. Символ # использован здесь для индикации конца данных, так как шест. 0D не имеет отображаемого символа. Поскольку максимальная длина в 20 символов включает шест.0D, то действительная длина вводимого текста может быть только 19 символов.

Далее введенные в строковом виде данные не обходимо преобразовать в численные. Т.е.:

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

Алгоритм преобразования строки в число (*)

  1. К = 1, S = 0, L = количество символов в строке, Р – указатель на последний символ в строке

  2. Взять последний символ в строке.

  3. Вычесть из кода символа 48(30h).

  4. Полученное значение умножить на К

  5. S = S + полученное в п. 4 значение

  6. К = К * основание системы исчисления, в которой ведены данные

  7. L = L – 1

  8. если L равно 0, то п. 11

  9. Р = Р -1

  10. перейти на п. 2

  11. конец алгоритма

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

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

Таким образом, выполняется подготовительный этап данной работы.

Далее изложен алгоритм перевода десятичных чисел в другие системы исчисления с получением результата в символьном виде.

Пусть в А хранится 10-е число, в К – основание соответствующей системы исчисления, в В – остаток от деления.(см. команду div), в М мы будем собирать строку (символьную запись получаемого результата перевода), Р – указатель на конец строки (адрес последнего символа).

Алгоритм (**)

  1. Поместить в Р адрес М + длина строки

  2. Разделить А на К

  3. в А – частное, в В – остаток

  4. если А = 0, то п. 9

  5. Преобразовать цифру из В в символ.

  6. записать символ в по адресу Р

  7. Р = Р – 1

  8. переход к п.2

  9. конец алгоритма

Таким образом, программа по данной работе может быть реализована с использование процедур ввода и вывода данных, процедуры (*) и процедуры (**), т.е. всего 4-е процедуры!

Литература.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]