Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Assembler 01.doc
Скачиваний:
19
Добавлен:
09.11.2019
Размер:
727.04 Кб
Скачать

4. Деление в ascii-формате.

4.1. Составьте программу ascaad.asm в текстовом редакторе NORTON в СОМ-формате:

MAIN PROC NEAR

MOV AX,3238H

MOV CL,37H

AND CL,0FH ;Преобр. CL в распак. дес.

AND AX,0F0FH ;Преобр. АХ в распак. дес.

AAD ;Преобр в двоичный

DIV CL ;Разделить на 7

RET

MAIN ENDP

Команда AAD умножает содержимое АН на 0АН (10), прибавляет результат 14Н (20) к регистру AL и очищает регистр АН. Полученное значение 001С - это шестнадцатиричное представление числа 28.

4.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG для выполнения программы.

4.3. Выполнить трассировку программы внимательно определяя изменения содержимого регистров AL и АН. Выводы о работе записать в отчет.

4.4. Запишите в текстовом редакторе NORTON программу ascdiv.asm в COM-формате:

.286

TITLE ASCDIV (COM) Деление ASCII-чисел

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG

ORG 100H ;Начало в конце PSP

BEGIN: JMP SHORT MAIN ;Обход через данные

;-------------------------------------------------------

DIVND DB '3698' ;Элементы данных

DIVSOR DB '4'

QUOTNT DB 4 DUP(0)

;--------------------------------------------------------

MAIN PROC NEAR

MOV CX,04 ;4 цикла

SUB AH,AH ;Стереть левый байт делимого

AND DIVSOR,0FH ;Стереть ASCII 3 в делителе

LEA SI,DIVND

LEA DI,QUOTNT

A20: MOV AL,[SI] ;Загрузить ASCII-байт

AND AL,0FH ;Стереть ASCII тройку

AAD ;Коррекция для деления

DIV DIVSOR ;Деление

MOV [DI],AL ;Сохранить частное

INC SI

INC DI

LOOP A20 ;Циклиться 4 раза

RET

MAIN ENDP

CODESG ENDS

END BEGIN

Программа выполняет деление четырехбайтового делимого на однобайтовый делитель. В программе организован цикл обработки делимого справа налево. Остатки от деления находятся в регистре АН и команда AAD корректирует их в регистре AL. Окончательный результат - 00090204 и в регистре АН остаток 02.

4.5. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG для выполнения программы.

4.6. Выполнить трассировку программы до первой команды AND. Просмотреть сегмент кодов. Выполнить команду AND. Просмотреть сегмент кодов. Продолжить трассировку программы проверяя сегмент кодов после каждого цикла оканчивающегося командой LOOP. Внимательно следить за изменением содержимого регистров СХ, АН, AL, SI и DI. Выводы о работе программы записать в отчет.

5. Двоично-десятичный формат (bcd).

5.1. Запишите в текстовом редакторе NORTON программу bcdadd.asm в COM-формате:

.286

TITLE BCDADD (COM) Преобр. ASCII в BCD, сложение

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG

ORG 100H ;Начало в конце PSP

BEGIN: JMP SHORT MAIN ;Обход через данные

;-------------------------------------------------------

ASC1 DB '057836' ;Элементы данных

ASC2 DB '069427'

BCD1 DB '000'

BCD2 DB '000'

BCD3 DB 4 DUP(0)

;--------------------------------------------------------

MAIN PROC NEAR ;Основная процедура

LEA SI,ASC1+4 ;Инициализировать для ASC1

LEA DI,BCD1+2

CALL B10CONV ;Вызвать преобразование

LEA SI,ASC2+4 ;Инициализировать для ASC2

LEA DI,BCD2+2

CALL B10CONV ;Вызвать преобразование

CALL C10ADD ;Вызвать сложение

RET

MAIN ENDP

; Преобразование ASCII в BCD

; --------------------------

B10CONV PROC

MOV CL,04 ;Фактор сдвига

MOV DX,03 ;Число слов

B20: MOV AX,[SI] ;Получить ASCII-пару

XCHG AH,AL

SHL AL,CL ;Удалить тройки ASCII-кода

SHL AX,CL

MOV [DI],AH ;Записать BCD-цифру

DEC SI

DEC SI

DEC DI

DEC DX

JNZ B20

RET

B10CONV ENDP

; Сложение BCD-чисел

; ------------------

C10ADD PROC

XOR AH,AH ;Очистить АН

LEA SI,BCD1+2 ;Инициализация BCD адресов

LEA DI,BCD2+2

LEA BX,BCD3+3

MOV CX,03 ;Трехбайтовые поля

CLC

C20: MOV AL,[SI] ;Получить BCD1

ADC AL,[DI] ;Прибавить BCD2

DAA ;Десятичная коррекция

MOV [BX],AL ;Запись в BCD3

DEC SI

DEC DI

DEC BX

LOOP C20 ;Циклить 3 раза

RET

C10ADD ENDP

CODESG ENDS

END BEGIN

В программе выполняется преобразование чисел из ASCII-формата в BCD-формат и сложение их. Процедура B10CONV преобразует ASCII в BCD.

Процедура C10ADD выполняет сложение чисел в BCD-формате. Окончательный результат - 127263.

Команда XCHG AH,AL переставляет два байта местами.

5.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG для выполнения программы.

5.3. Выполните трассировку программы. Перед первой процедурой B10CONV порверьте сегмент кодов. Проверяйте сегмент кодов после каждого цикла в каждой процедуре. Выводы о работе программы запишите в отчет.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]