Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методические указания для выполнения лабораторных работ / 3-цепочны команды, используемых для обработки символьных данных.DOC
Скачиваний:
51
Добавлен:
11.02.2014
Размер:
135.68 Кб
Скачать

Лабораторная работа № 3

Цель работы: ознакомление и изучение цепочных команд, используемых для обработки символьных данных.

ОСНОВНЫЕ ПОНЯТИЯ

Флаговый регистр

Этот pегистр содержит 16 бит флагов, которые управляются различными командами для индикации состояния операции. Во всех случаях флаги сохраняют свое значение до тех пор, пока другая команда не изменит его. Флаговый регистр содержит следующие девять используемых бит (звездочками отмечены неиспользуемые биты):

Номер бита: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Флаг: * * * * O D I T S Z * A* P* C

Рассмотрим эти флаги в последовательности справа налево.

CF (Carry Flag) - флаг переноса. Содержит значение "переносов" (0 или 1) из старшего разряда при арифметических операциях и некоторых операциях сдвига и циклического сдвига.

PF (Parity Flag) - флаг четности. Проверяет младшие восемь бит pезультатов операций над данными. Нечетное число бит приводит к установке этого флага в 0, а четное - в 1. Не следует путать флаг четности с битом контроля на четность.

AF (Auxiliary Carry Flag) - дополнительный флаг переноса. Устанавливается в 1, если арифметическая операция приводит к переносу четвертого справа бита (бит номер 3) в регистровой однобайтовой команде. Данный флаг имеет отношение к арифметическим операциям над символами кода ASCII и к десятичным упакованным полям.

ZF (Zero Flag) - флаг нуля. Устанавливается в качестве результата aрифметических команд и команд сравнения. Как это ни странно, ненулевой результат приводит к установке нулевого значения этого флага, а нулевой - к установке единичного значения. Кажущееся несоответствие является, однако, логически правильным, так как 0 обозначает "нет" (т.е. результат не равен нулю), а единица обозначаeт "да"(т.е. результат равен нулю). Команды условного перехода JE и JZ проверяют этот флаг.

SF (SIgn Flag) - знаковый флаг. Устанавливается в соответствии со знаком результата (старшего бита) после арифметических опеpаций: положительный результат устанавливает 0, а отрицательный - 1. Команды условного перехода JG и JL проверяют этот флаг.

TF (Trap Flag) - флаг пошагового выполнения. Этот флаг уже приходилось устанавливать, когда использовалась команда Т в отладчике DEBUG. Если этот флаг установлен в единичное состояние, то процессор переходит в режим пошагового выполнения команд, т.е. в каждый момент выполняется одна команда под пользовательским управлением.

If (Interrupt Flag) - флаг прерывания. При нулевом состоянии этого флага прерывания запрещены, при единичном - разрешены.

DF (DIrection Flag) - флаг направления. Используется в строковых операциях для определения направления передачи данных. При нулевом состоянии команда увеличивает содержимое регистров SI и DI, вызывая передачу данных слева направо, при нулевом - уменьшает содержимое этих регистров, вызывая передачу данных справа налево.

OF (Overflow Flag) - флаг переполнения. Фиксирует арифметическое переполнение, т.е. перенос в/из старшего (знакового) бита при знаковых арифметических операциях.

В качестве примера: команда CMP сравнивает два операнда и воздействуте на флаги AF, CF, OF, PF, SF, ZF. Однако, нет необходимости проверять все эти флаги по отдельности. В следующем примере проверяется содержит ли регистр BX нулевое значение:

CMP BX,00 ;Сравнение BX с нулем

JZ B50 ;Переход на B50 если нуль

. (действия при ненуле)

.

B50: ... ;Точка перехода при BX=0

Если BX содержит нулевое значение, команда CMP устанавливает флаг нуля ZF в единичное состояние, и возможно изменяет (или нет) другие флаги. Команда JZ (перехлд если нуль) проверяет только флаг ZF. При единичном значении ZF, обозначающий нулевой признак, команда передает управление на адрес, указанный в ее операнде, т.е. на метку B50.

Процедуры и операция call.

Предыдущие лабораторные примеры содержали в кодовом сегмент только oдну процедуру, оформленную следующим образом:

BEGIN PROC FAR

.

.

BEGIN ENDP

Операнд FAR информирует систему о том, что данный адрес является точкой входа для выполнения, а директива ENDP определяет конец процедуры. Кодовый сегмент, однако, может содержать любое количество процедур, которые разделяются директивами PROC и ENDP. Типичная организация многопроцедурной программы приведена ниже.

Обратите внимание на следующие особенности:

¦ директивы PROC по меткам B10 и C10 имеют операнд NEAR для указания того, что эти процедуры находятся в текущем кодовом сегменте. Во многих последующих примерах этот операнд опущен, так как по умолчанию ассемблер принимает тип NEAR.

¦ Каждая процедура имеет уникальное имя и содержит собственную директиву ENDP для указания конца процедуры.

¦ Для передачи управления в процедуре BEGIN имеются две команды: CALL B10 и CALL C10. В результате первой команды CALL управление передается процедуре B10 и начинается ее выполнение. Достигнув команды RET, управление возвращается на команду непосредственно следующую за CALL B10. Команда CALL действует аналогично - передает управление в процедуру C10, выполняет ее команды и возвращает управление по команде RET.

CODESG

SEGMENT

PARA

BEGIN

BEGIN

PROC

CALL

CALL

RET

ENDP

FAR

B10

C10

B10

B10

PROC

RET

ENDP

NEAR

C10

C10

PROC

RET

ENDP

NEAR

CODESG

ENDS

END

BEGIN

Команда RET выполняет возврат в вызывающую программу. Программа BEGIN вызывает процедуры B10 и C10, которые возвращают управление обратно в BEGIN. Для выполнения самой программы BEGIN операционная система DOS вызывает ее и в конце выполнения команда RET возвращает управление в DOS. Если процедура B10 не содержит завершающей команды RET, то выполнение команд продолжится из B10 непосредственно в процедуре C10. Если процедура C10 не содержит команды RET, то будут выполняться команды, оказавшиеся за процедурой C10 с непредсказуемым результатом.

Использование процедур дает хорошую возможность организовать логическую структуру программы. Кроме того, операнды для команды CALL могут иметь значения, выходящие за границу от -128 до +127 байт.

Технически управление в процедуру типа NEAR может быть передано с помощью команд перехода или даже обычным построчным кодированием. Но в большинстве случаев рекомендуется использовать команду CALL для передачи управления в процедуру и команду RET для возврата.

В предыдущих программах были показаны команды пересылки непосредственных данных в регистр, пересылки данных из памяти в регистр, пересылки содержимого регистра в память и пересылки содержимого oдного регистра в другой. Во всех случаях длина данных была огpаничена одним или двумя байтами и не предусмотрена пересылка данных из одной области памяти непосредственно другую область. В данном примере объясняется процесс пересылки данных, которые имеют длину более двух байт.

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

page 65,132

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

SUB AX,AX

PUSH AX

MOV AX,DATASG

MOV DS,AX

MOV ES,AX

CALL B10MOVE ;Вызвать JUMP подпрограмму

CALL C10MOVE ;Вызвать CALL подпрограмму

RET ;Завершить программу

BEGIN ENDP

; Расширенная пересылка (JUMP-подпрограмма),

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

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

B10MOVE PROC

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

LEA DI,NAME2 ; NAME1 и NAME2

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

B20:

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

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

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

INC DI ;Следующая позиция в NAME2

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

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

RET ;Если счетчик = 0, то

B10MOVE ENDP ; вернуться

; Расширенная пересылка (LOOP-подпрограмма),

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

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

C10MOVE PROC

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

LEA DI,NAME3 ; NAME2 и NAME3

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

C20:

MOV AL,[SI] ;Переслать из NAME 2

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

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

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

LOOP C20 ; Цикл

RET

C10MOVE ENDP

CODESG ENDS

END BEGIN

Программа содержит несколько новых особенностей. Процедура BEGIN инициализирует сегментные регистры и затем вызывает процедуры B10MOVE и C10MOVE. Процедура B10MOVE пересылает содержимое поля NAME1 в поле NAME2. Так как каждый раз пересылается только один байт, то процедура начинает с самого левого байта в поле NAME1 и в цикле пересы- лает затем второй байт, третий и т.д. следующим образом:

NAME1: A B C D E F G H I

¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

NAME2: J K L M N O P Q R

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

LEA SI,NAME1 ;Загр;узка относительных адресов

LEA DI,NAME2 ; NAME1 и NAME2

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

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

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

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

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

Соседние файлы в папке методические указания для выполнения лабораторных работ