Преобразование ASCII-формата в двоичный формат и наоборот
6.1. Запишите в текстовом редакторе NORTON программу exconv.asm в COM-формате:
.286
TITLE EXCONV (COM) Преобр. ASCII и дв. ф-тов
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H ;Начало в конце PSP
BEGIN: JMP SHORT MAIN ;Обход через данные
;-------------------------------------------------------
ASCVAL1 DB '1234' ;Элементы данных
ASCVAL2 DB '0000'
BINVAL DW 0
ASCLEN DW 4
MULT10 DW 1
;--------------------------------------------------------
MAIN PROC NEAR ;Основная процедура
CALL B10ASBI ;Вызвать преобразование ASCII
CALL C10BIAS ;Вызвать преобразование двоичное
RET
MAIN ENDP
; Преобразование ASCII в двоичное
; -------------------------------
B10ASBI PROC
MOV CX,10 ;Фактор умножения
LEA SI,ASCVAL1-1 ;Адрес ASCVAL
MOV BX,ASCLEN ;Длина ASCVAL
B20: 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 B20 ;Нет - продолжить
RET
B10ASBI ENDP
; Преобр. дв. в ASCII
; -------------------
C10BIAS PROC
MOV CX,0010 ;Фактор деления
LEA SI,ASCVAL2+3 ;Адрес ASCVAL
MOV AX,BINVAL ;Загрузить дв. число
C20: CMP AX,0010 ;Значение меньше 10?
JB C30 ;Да - выйти
XOR DX,DX ;Очистить часть частного
DIV CX ;Разделить на 10
OR DL,30H ;Прибавить BCD2
MOV [SI],DL ;Записать ASCII-символ
DEC SI
JMP C20
C30: OR AL,30H ;Записать посл. частное
MOV [SI],AL ;как ASCII-символ
RET
C10BIAS ENDP
CODESG ENDS
END BEGIN
В процедуре B10ASBI выполняется преобразование ASCII-числа 1234 в двоичный формат. В примере предполагается, что длина ASCII-числа равна 4 и она записана в поле ASCLEN. Для инициализации адрес ASCII-поля ASCVAL1-1 заносится в регистр SI, а длина этого поля - в регистр ВХ. Команда по метке B20 пересылает ASCII-байт в регистр AL. В этой команде используется адрес ASCVAL1-1 плюс со-
держимое регистра ВХ (4), т.е. получается адрес ASCVAL1+3 (самый правый байт поля ASCVAL1). В каждом цикле содержимое регистра ВХ уменьшается на 1, что приводит к обращению к следующему слева байту. В каждом цикле происходит также умножение поля MULT10 на 10, что дает в результате множители 1, 10, 100 и т.д.
Процедура C10BIAS преобразует 4D2H (результат вычисления в процедуре B10ASBI) в ASCII-число 1234.
6.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG для выполнения программы.
6.3. Выполните трассировку программы. Перед первой процедурой B10ASBI порверьте сегмент кодов. Проверяйте сегмент кодов после каждого цикла в каждой процедуре. Выводы о работе программы запишите в отчет.
КОНТРОЛЬНЫЕ ВОПРОСЫ:
1. Предположим, что регистр АХ содержит 9 в ASCII-коде, а регистр ВХ - 7 также в ASCII-коде. Объясните и дайте точные результаты для следующих несвязанных операций:
а) ADD AX,33H б) ADD AX,BX
AAA AAA
в) SUB AX,BX г) SUB AX,0DH
AAS AAS
2. Поле UNPAK содержит 01040705 в распакованном десятичном формате. Напишите цикл, который преобразует это содержимое в ASCII-формат, т.е. 31343735.
3. Выполнить вручную преобразование числа 46328 из ASCII-формата в двоичный формат (результат получить в шестнадцатиричном виде).
ОТВЕТЫ:
1. а) Команда ADD дает результат 6СН, а команда ААА - 0102Н. б) Команда ADD дает результат 70Н, а команда ААА - 0106Н. в) Команда SUB дает результат 02Н, а команда AAS не имеет эффекта. г) Команда SUB дает результат 2С, а команда AAS - FF06.
2.
LEA SI,UNPAK ;Инициализация адреса
MOV CX,04 ;Инициализация счетчика циклов
B20: OR [SI],30H ;Включить тройку кода ASCII
INC SI ;Перейти к следующему байту
LOOP B20 ;Циклить 4 раза
3.
Десятичные Шестнадцатиричные
8 х 1 = 8 8
2 х 10 = 20 14
3 х 100 = 300 12С
6 х 1000 = 6000 1770
4 х 10000 = 40000 9С40
Результат сложения - В4F8.