Страница 16 «7 Проблема ввода числовых данных.»
⇐ ПредыдущаяСтр 7 из 7 Страница 16 «7 Проблема ввода числовых данных. » «7. 4. Пример преобразования на основе ASCII-формата в двоичный формат». Пример преобразования из ASCII-формата в двоичный формат и наоборот. (слайд №38)
Рассматриваемый в данном примере метод преобразования будет основан на том, что ASCII-формат имеет основание 10, а компьютер выполняет арифметические операции только над числами с основанием 2. Процедура преобразования заключается в следующем: 1. Начинают с самого первого байта числа в ASCII-формате и обрабатывают справа налево. 2. Удаляют тройки из левых шестнадцатеричных цифр каждого ASCII-байта. 3. Умножают ASCII цифры на 1, 10, 100 (01h, 0Ah, 64h) и т. д. и складывают результаты.
Пример: Преобразование числа 1234 из ASCII-формата в двоичный формат:
В примере в процедуре b10asbi выполняется преобразование ASCII-числа 1234 в двоичный формат. В примере предполагается, что длина ASCII-числа равна 4 и она записана в поле asclen. Для инициализации адрес ASCII-поля ascval-1 заносится в регистр si, а длина - в регистр bx.
Команда по метке b20 пересылает ascii-байт в регистр al: mov al, [si+bx]
(слайд №39) Здесь используется адрес ascval-1 плюс содержимое регистра bx (4), т. е. получается адрес ascval+3 (самый правый байт поля ascval). В каждом цикле содержимое регистра bx уменьшается на 1, что приводит к обращению к следующему слева байту. Для данной адресации можно использовать регистр bx, но не cx, и, следовательно, нельзя применять команду loop. В каждом цикле происходит также умножение поля mult10 на 10, что дает в результате множители 1, 10, 100 и т. д. Такой прием применен для большей ясности, однако, для большей производительности множитель можно хранить в регистре si или di.
Для того, чтобы напечатать или отобразить на экране арифметический pезультат, необходимо преобразовать его в ASCII-формат. Данная операция включает в себя процесс обратный предыдущему. Вместо умножения используется деление двоичного числа на 10 (0Ah) пока результат не будет меньше 10. Остатки, которые лежат в границах от 0 до 9, образуют число в ASCII-формате. В качестве примера рассмотрим преобразование шестнадцатеричного числа 4d2 обратно в десятичный формат:
Так как последнее частное 1 меньше, чем шестнадцатеричное 0Ah, то операция завершена. Остатки вместе с последним частным образуют результат в ASCII-формате, записываемый справа налево 1234. Все остатки и последнее частное должны записываться в память с тройками, т. е. 31323334.
В примере процедура c10bias преобразует шестнадцатеричное 4d2 (результат вычисления в процедуре b10asbi) в ASCII-число 1234.
Текст программы: (слайд №40)
codesg segment para 'code' assume cs: codesg, ds: codesg, ss: codesg org 100h begin: jmp short main ; ------------------------------------------- ascval db '1234' ; Элементы данных binval db 0 asclen db 4 mult10 db 1 ; ------------------------------------------- main proc near ; Основная процедура: call b10asbi ; Вызвать преобразование ascii call c10bias ; Вызвать преобразование двоичное ret main endp ; ------------------------------- ; Преобразование ascii в двоичное: ; ------------------------------- b10asbi proc mov cx, 10 ; Фактор умножения lea si, ascval-1 ; Адрес ascval mov bx, asclen ; Длина ascval В20: mov al, [si+bx] ; Выбрать ascii-символ and ax, 000fh ; Очистить зону тройки mul mult10 ; Умножить на фактор 10 add binval, ax ; Прибавить к двоичному mov ax, mult10 ; Вычислить следующий mul cx ; фактор умножения
mov mult10, ax dec bx ; Последн. ascii-символ? jnz В20 ; Нет - продолжить ret b10asbi endp ; ------------------- ; Преобр. дв. в ascii: ; ------------------- c10bias proc mov cx, 0010 ; Фактор деления lea si, ascval+3; Адрес ascval mov ax, binval ; Загрузить дв. число С20: cmp aХ, 0010 ; Значение меньше 10? jb С30 ; Да - выйти xor dx, dx ; Очистить часть частного div cx ; Разделить на 10 or dl, 30h mov [si], dl ; Записать ascii-символ dec si jmp С20 c30: or al, 30h ; 3аписать поcл. частное mov [si], al ; как ascii-символ ret c10bias endp codesg ends end begin
Воспользуйтесь поиском по сайту: ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|