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

4. Программа: расширение операции пересылки.

4.1. В данном разделе изучим пересылку данных, которые имеют длину более двух байт.

В текстовом редакторе NORTON запишите следующую программу в ЕХЕ-формате:

.286

TITLE EXMOVE (EXE) Расширенная пересылка

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

STACKSG SEGMENT PARA STACK 'Stack'

DW 32 DUP(?)

STACKSG ENDS

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

DATASG SEGMENT PARA 'Data'

NAME1 DB 'ABCDEFGHI'

NAME2 DB 'JKLMNOPQR'

NAME3 DB 'STUVWXYZ*'

DATASG ENDS

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

CODESG SEGMENT PARA 'Code'

BEGIN PROC FAR

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

PUSH DS ;Записать DS в стек

SUB AX,AX ;Записать в стек

PUSH AX ;нулевой адрес

MOV AX,DATASG ;Поместить адрес DATASG

MOV DS,AX ;в регистр DS

MOV ES,AX

CALL B1OMOVE ;Вызвать п/п

CALL C1OMOVE ;Вызвать п/п

RET ;Вернуться в DOS

BEGIN ENDP

; Расширенная пересылка,

; использующая переход по условию:

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

B1OMOVE PROC

LEA SI,NAME1 ;Инициализация адресов

LEA DI,NAME2 ;NAME1 и NAME2

MOV CX,09 ;Переслать 9 символов

B20: MOV AL,[SI] ;Переслать из NAME1

MOV [DI],AL ;Переслать в NAME2

INC SI ;Следующ.симв.в NAME1

INC DI ;Следующ.поз. в NAME2

DEC CX ;Уменьшить сч. цикла

JNZ B20 ;Счетчик > 0? Да-цикл

RET ;Если счетчик = 0, то вернуться

B1OMOVE ENDP

; Расширенная пересылка,

; использующая команду LOOP

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

C1OMOVE PROC

LEA SI,NAME2 ;Инициализация адресов

LEA DI,NAME3 ;NAME2 и NAME3

MOV CX,09 ;Переслать 9 символов

C20: MOV AL,[SI] ;Переслать из NAME2

MOV [DI],AL ;Переслать в NAME3

INC SI ;Следующ.симв.в NAME2

INC DI ;Следующ.поз. в NAME3

LOOP C20 ;Уменьшить счетчик,

;если не 0, то цикл

RET ;Если счетчик = 0, то вернуться

C1OMOVE ENDP

CODESG ENDS

END BEGIN

Сегмент данных содержит три девятибайтовых поля: NAME1, NAME2, NAME3. Цель программы - переслать данные из поля NAME1 в поле NAME2 и переслать данные из поля NAME2 в поле NAME3. Так как эти поля имеют длину девять байт каждое, то для пересылки данных кроме простой команды MOV требуются еще другие команды.

Процедура BEGIN инициализирует сегментные регистры и затем вызывает процедуры B1OMOVE и C1OMOVE. Процедура B1OMOVE пересылает содержимое поля NAME1 в поле NAME2. Так как каждый раз пересылается только один байт, то процедура начинает с самого левого байта в поле NAME1 и в цикле пересылает затем второй байт, третий и т.д.

Для продвижения в полях NAME1 и NAME2 в регистр СХ заносится значение 9, а регистры SI и DI используются в качестве индексных. Две команды LEA загружают относительные адреса полей NAME1 и NAME2 в регистры SI и DI.

Для пересылки содержимого первого байта из поля NAME1 в первый байт поля NAME2 используются адреса в регистрах SI и DI. Квадратные скобки в командах MOV означают, что для доступа к памяти используется адрес в регистре, указанном в квадратных скобках. Таким образом, команда MOV AL,[SI] означает: использовать адрес в регистре SI (т.е.NAME1) для пересылки соответствующего

байта в регистр АL. И команда MOV [DI],AL означает: переслать содержимое регистра AL по адресу, лежащему в регистре DI (т.е.NAME2).

Следующие команды увеличивают значения регистров SI и DI и уменьшают значение в регистре СХ. Если в регистре СХ не нулевое значение, управление передается на следующий цикл (на метку В20). Так как содержимое регистров SI и DI было увеличено на 1, то следующие команды MOV будут иметь дело с адресами NAME1+1 и NAME2+1. Цикл продолжается таким образом, пока не будет передано содержимое NAME1+8 и NAME2+8.

Команда JNZ выполняет переход на метку В20, если в результате выполнения команды DEC CX получится результат, отличный от нуля. Команда DEC CX уменьшает содержимое регистра СХ на 1.

Процедура С1OMOVE аналогична процедуре B1OMOVE с двумя исключениями: она пересылает данные из поля NAME2 в поле NAME3 и использует команду LOOP вместо DEC и JNZ.

4.2. Выполните ассемблирование и компоновку программы. Листинг программы запишите в отчет.

4.3. Вызовите отладчик DEBUG на выполнение программы exmove.exe.

4.4. Проведите пошаговое выполнение команд до первой команды CALL. При этом, в регистр DS загрузится начальный адрес сегмента данных. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.

4.5. Продолжите пошаговое выполнение команд до метки В20. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.

4.6. Продолжите пошаговое выполнение команд до первой команды INC. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.

4.7. Продолжите пошаговое выполнение команд до команды JNZ. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.

4.8. Выполните команду JNZ. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.

4.9. Выполните полный цикл до команды JNZ, продолжая пошаговое выполнение команд. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.

4.10. Продолжите пошаговое выполнение команд, выполните все оставшиеся циклы, до выполнения команды RET. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.

4.11. Выполните команду RET. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.

4.12. Выполните команду CALL. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.

4.13. Выполните полный цикл до команды LOOP, продолжая пошаговое выполнение команд. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.

4.14. Выполните команду LOOP. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.

4.15. Выполните программу до конца. Последнюю команду RET не выполнять. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.

4.16. Выйдите из отладчика, введя команду Q.

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