Преобразование 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.

Наши рекомендации