- •Лабораторная работа №1 Архитектура процессора Intel 8086.
- •Структура exe- и com- программы. Вывод на экран
- •Теоретические сведения Структура программы
- •Вывод на экран
- •Прерывание 21h.
- •Прерывание 10h.
- •Лабораторная работа №2 Циклы. Ввод с клавиатуры
- •Теоретические сведения Циклы в ассемблерных программах
- •Ввод с клавиатуры
- •Ввод чисел, перевод чисел в различные системы счисления
- •Теоретические сведения Ввод числовой информации
- •Перевод чисел в различные системы счисления
- •Лабораторная работа №3 Подпрограммы, работа с файлами через описатели.
- •Теоретические сведения Подпрограммы
- •Работа с файлами
- •Работа с файлами, используя dta. Psp. Окружение
- •Теоретические сведения Структура dta
- •Структура psp
- •Окружение dos
- •Лабораторная работа №4 Работа с прерываниями: перехват и восстановление.
- •Теоретические сведения Прерывания и их переопределение
- •Видеопамять
- •Порты ввода-вывода. Обмен данными с внешним устройством.
- •Теоретические сведения Команды ввода и вывода
Ввод чисел, перевод чисел в различные системы счисления
Цель. Научиться вводить в ассемблерную программу числовую информацию. Разработка алгоритмов для перевода чисел в различные системы счисления.
Задание. Разработать программу перевода ввода и вывода чисел в различных системах счисления, а также работы с числами в ассемблерных программах.
Таблица. Варианты заданий
Вариант |
Задание |
1 |
Ввести два числа в двоичной и восьмеричной системах счисления, произвести их сложение и вывод результата на экран в десятичной форме. Предусмотреть возможность ввода отрицательных чисел. |
2 |
Ввести два числа в шестнадцатеричной и восьмеричной системах счисления, произвести их умножение и вывод результата на экран в десятичной форме. Предусмотреть возможность ввода отрицательных чисел. |
3 |
Ввести число в двоичной форме и вывести его на экран в троичной, четверичной, пятеричной, шестеричной, семеричной и восьмеричной форме. |
4 |
Проанализировать четность введенного с клавиатуры числа, число может быть введено в двоичной, восьмеричной, шестнадцатеричной или десятичной форме. Основание системы счисления определяется литерой, завершающей число B, O, H и D соответственно. |
5 |
Вывести на экран длину введенной с клавиатуры строки, систему счисления результата выбирает пользователь (двоичная, восьмеричная, десятичная, шестнадцатеричная). |
6 |
Вывести на экран количество слов в строке, введенной пользователем. Результат представить в десятичной и шестнадцатеричной форме. |
7 |
Вычислить частное двух чисел. Делимое ввести в двоичной, делитель – в десятичной, а результат вывести в шестнадцатеричной формах. |
8 |
Вычислить сумму чисел от 0 до N. N вводит пользователь в шестнадцатеричной форме, а результат вывести в десятичной форме. |
9 |
Выполнить операцию поразрядного логического умножения двух чисел введенных в шестнадцатеричной форме. Результат представить в двоичной форме. |
10 |
Ввести число в десятичной форме и вывести на экран его десятичное представление, а также инверсное значение (поразрядное отрицание) в десятичной и двоичной форме. |
Теоретические сведения Ввод числовой информации
Ввод числовой информации в ассемблерную программу обычно осуществляется в два этапа:
ввод строки содержащей число;
перевод строки в число.
Ввод строк рассматривался в предыдущих практических работах.
Для разработки алгоритма перевода введенной строки в число проанализируем структуру числа в позиционной системе счисления (в такой системе счисления вес цифры определяется ее местоположением в числе):
2398=2*1000+3*100+9*10+8=2*103+3*102+9*101+8*100
Таким образом, для перевода строки в число из введенной строки «2398» необходимо последовательно выделять цифры и производить суммирование произведений этих цифр и множителей соответствующих позиции цифры в числе. Если буфер для ввода строки был организован, например, следующим образом:
BUF 05,00,05 DUP (?)
то после ввода строки «2398» он будет выглядеть (в шестнадцатеричной системе счисления) так:
05,04,32,33,39,38,0d
где первый байт – размер буфера, второй – количество введенных символов (без завершающего символа CR), третий, четвертый, пятый, шестой и седьмой – коды символов «2», «3», «9», «8» и «CR» соответственно. Легко заметить, что для того, чтобы из кода цифры получить саму цифру необходимо из соответствующего кода вычесть 30h (шестнадцатеричный код нуля). Затем, последовательно в цикле (второй байт – количество введенных символов) выбирая цифры, формировать соответствующий множитель, вычислять произведение и производить суммирование. Нижеследующий фрагмент программы иллюстрирует описанный алгоритм (символы рассматриваются справа налево).
;Ввод числа в виде строки
MOV AH,0AH ;в AH номер функции
LEA DX,BUF ;DS:DX адрес буфера для ввода
INT 21H
;Перевод строки в число, результат в DI
MOV DI,0
LEA BX,BUF+1 ;в BX адрес второго элемента буфера
MOV CX,[BX] ;в CX количество введенных символов
XOR CH,CH
MOV SI,1 ;в SI множитель
MET: PUSH SI ;сохраняем SI (множитель) в стеке
MOV SI,CX ;в SI помещаем номер текущего символа
MOV AX,[BX+SI];в AX помещаем текущий символ
XOR AH,AH
POP SI ;извлекаем множитель (SI)из стека
SUB AX,30H ;получаем из символа (AX) цифру
MUL SI ;умножаем цифру (AX)на множитель (SI)
ADD DI,AX ;складываем с результирующим числом
MOV AX,SI ;помещаем множитель (SI) в AX
MOV DX,10
MUL DX ;увеличиваем множитель (AX) в 10 раз
MOV SI,AX ;перемещаем множитель (AX) назад в SI
LOOP MET ;переходим к предыдущему символу