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

1. Сложение в ascii-формате.

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

.286

TITLE   ASCADD (COM) Сложение в ASCII-формате

CODESG  SEGMENT PARA 'Code'

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

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

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

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

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

ASC2 DB '694'

ASC3 DB '0000'

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

MAIN PROC NEAR

CLC

LEA SI,ASC1+2 ;Адреса ASCII-чисел

LEA DI,ASC2+2

LEA BX,ASC3+3

MOV CX,03 ;Выполнить 3 цикла

A20: MOV AH,00 ;Очистить регистр АН

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

ADC AL,[DI] ;Слож. (с переносом)

AAA ;Коррекция для ASCII

PUSHF ;Сохранение флагов

OR AL,30H ;Запись левой тройки

POPF ;Восстановление флагов

MOV [BX],AL ;Сохранение суммы

DEC SI

DEC DI

DEC BX

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

MOV [BX],AH ;Сохранить перенос

RET

MAIN ENDP

CODESG ENDS

END BEGIN

Команда CLC устанавливает флаг CF в нулевое состояние.

В программе используется команда ADC, так как любое сложение может вызвать перенос, который должен быть прибавлен к следующему (слева) байту.

Команда MOV очищает регистр АН в каждом цикле, так как команда ААА может прибавить к нему единицу.

Когда завершается каждый цикл, происходит пересылка содержимого регистра АН (00 или 01) в левый байт суммы.

В результате выполнения программы получается сумма в виде 01020702. Программа использует команду OR после команды ААА для занесения левой тройки. При выполнении команды OR может измениться флаг CF, что изменит результат команды ADC. Для того, чтобы этого не произошло, перед командой OR все флаги запоминаются с помощью команды PUSHF, а после выполнения команды OR все флаги восстанавливаются с помощью команды POPF. Таким образом влияние

команды OR на флаг CF исключается.

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

1.3. Просмотреть сегмент кодов (D CS:100) перед выполнением команды CLC. Выполнить трассировку определяя, как изменяется содержимое регистров АН, AL, CX, SI, DI, BX. Внимательно следите за изменением флага переноса CF. Перед каждой командой LOOP проверяйте сегмент кодов. Выводы о работе программы запишите в отчет.

2. Вычитание в ascii-формате.

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

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

ASC1 DB 38H ;Элементы данных

ASC2 DB 34H

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

MAIN PROC NEAR

; Пример 1

; --------

MOV AL,ASC1

SUB AL,ASC2

AAS

; Пример 2

; --------

MOV AL,ASC2

SUB AL,ASC1

AAS

RET

MAIN ENDP

CODESG ENDS

END BEGIN

В примере 1 данные не нуждаются в коррекции по команде AAS (при выполнении команды изменений не происходит). В примере 2 после вычитания правая цифра в регистре AL равна С, команда AAS вычитает 6 из регистра AL (С-6=6) и 1 из регистра АН (00-1=FF) и устанавливает в 1 флаг CF. Число FF06 это закодированное -4.

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

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

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