- •"Снимки" сеанса командной строки с результатами выполнения программ.
- •Тема 2: изучение электронного справочника и отладчика программ.
- •Глава 2. Выполнение программ.
- •Тема 2. Работа с экраном и клавиатурой.
- •В качестве необходимых для самостоятельного изучения разделов предлагается [4]:
- •В качестве необходимых для самостоятельного изучения разделов предлагается [4]:
- •Дополнительная.
- •Приложение а
- •1.Текст программы
- •2.Файл протокол компиляции данной программы
- •Приложение б.
В качестве необходимых для самостоятельного изучения разделов предлагается [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, S = 0, L = количество символов в строке, Р – указатель на последний символ в строке
Взять последний символ в строке.
Вычесть из кода символа 48(30h).
Полученное значение умножить на К
S = S + полученное в п. 4 значение
К = К * основание системы исчисления, в которой ведены данные
L = L – 1
если L равно 0, то п. 11
Р = Р -1
перейти на п. 2
конец алгоритма
Это лишь один из вариантов преобразования строки в число, поэтому не является обязательным для реализации. В рамках данной работы важен результат, а то как он получен.
В результате работы алгоритма из строки введенных данных мы получаем десятичное число, не зависимо от того, в какой системе исчисления оно было введено.
Таким образом, выполняется подготовительный этап данной работы.
Далее изложен алгоритм перевода десятичных чисел в другие системы исчисления с получением результата в символьном виде.
Пусть в А хранится 10-е число, в К – основание соответствующей системы исчисления, в В – остаток от деления.(см. команду div), в М мы будем собирать строку (символьную запись получаемого результата перевода), Р – указатель на конец строки (адрес последнего символа).
Алгоритм (**)
Поместить в Р адрес М + длина строки
Разделить А на К
в А – частное, в В – остаток
если А = 0, то п. 9
Преобразовать цифру из В в символ.
записать символ в по адресу Р
Р = Р – 1
переход к п.2
конец алгоритма
Таким образом, программа по данной работе может быть реализована с использование процедур ввода и вывода данных, процедуры (*) и процедуры (**), т.е. всего 4-е процедуры!
Литература.