Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод_з_1.doc
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
2.57 Mб
Скачать

Тема 4. Ввод чисел. Перевод чисел в различные системы счисления.

Цель работы: Научиться вводить в ассемблерную программу числовую информацию. Разработка алгоритмов для перевода чисел в различные системы счисления.

Задание: Разработать программу перевода чисел из десятичной системы счисления в двоичную и шестнадцатеричную. Числа должны вводиться в десятичной системе счисления, а выводятся - в двоичной и шестнадцатеричной.

Ввод числовой информации. Ввод числовой информации в ассемблерную программу обычно осуществляется в два этапа:

- ввод строки содержащей число;

- перевод строки в число.

Ввод строк рассматривался в предыдущих практических работах.

Для разработки алгоритма перевода введенной строки в число проанализируем структуру числа в позиционной системе счисления (в такой системе счисления вес цифры определяется ее местоположением в числе): 2398=2*1000+3*100+9*10+8=2*103+3*102+9*101+8*10с

Таким образом, для перевода строки в число из введенной строки «2398» необходимо последовательно выделять цифры и производить суммирование произведений этих цифр и множителей соответствующих позиции цифры в числе. Если буфер для ввода строки был организован, например, следующим образом: BUF 05,00,05 DUP (?)

то после ввода строки «2398» он будет выглядеть (в шестнадцатеричной системе счисления) так: 05,04,32,33,39,38,0d

где первый байт - размер буфера, второй - количество введенных символов (без завершающего символа CR), третий, четвертый, пятый, шестой и седьмой – шестнадцатеричные коды символов «2», «3», «9», «8» и «CR» соответственно. Легко заметить, что для того чтобы из кода символа цифры получить саму цифру необходимо из соответствующего кода вычесть 30h (шестнадцатеричный код нуля). Затем, последовательно в цикле (второй байт - количество введенных символов) выбирая цифры, формировать соответствующий множитель, вычислять произведение и производить суммирование. Нижеследующий фрагмент программы иллюстрирует описанный алгоритм: - введённые символы рассматриваются справа налево.

;Ввод числа в виде строки

MOV АН, 0АН ;в АН номер функции

LEA DX, BUF ;DS:DX адрес буфера для ввода, переменная BUF объявлена в

INT 21H ; сегменте данных

;Перевод строки в число, результат в DI

MOV DI, 0

LEA BX, BUF+1 ; в BX адрес второго элемента буфера

MOV CX,[BX] ;в CX количество введенных символов

XOR CH,CH

MOV SI,1 ;в SI множитель

M1: 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 M1 ;переходим к предыдущему символу

9.4. Перевод чисел в различные системы счисления

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

Перевод из десятичной системы счисления в двоичную осуществляется последовательными сдвигами на один бит вправо. Таким образом, значение очередного бита можно вычислить, проанализировав флаг переноса CF (если CF=1 то анализируемый бит был равен 1, и если CF=0, то анализируемый бит - 0).

Перевод из десятичной системы счисления в шестнадцатеричную осуществляется последовательными сдвигами на четыре бита вправо. После обнуления всех битов кроме четырех младших в регистре получается десятичный эквивалент шестнадцатеричной цифры (число от 0 до 15). Для его представления в шестнадцатеричной символьной форме необходимо организовать таблицу соответствия, которая в простейшем случае представляет собой следующую строку «0123456789ABCDEF». При перекодировании значение десятичного эквивалента используется как смещение в таблице относительно ее начала (перекодировка может осуществляться при помощи команды XLAT).