Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОС_ответы.doc
Скачиваний:
36
Добавлен:
27.10.2018
Размер:
21.59 Mб
Скачать

32 Асемблер. Команди умовного передавання керування. (операція cmp; операції умовного передавання керування jcxz, jc, jo, jz, jc, je, jl, jg, ja, jb)

CMP Сравнение

Команда СМР выполняет вычитание второго операнда из первого. В соответствии с результатом вычитания устанавливаются состояния флагов CF,PF,AF,ZF,SF и ОF. Сами операнды не изменяются. Пример

cmp AX, 562Dh

je equal ; Переход на метку equal, если АХ= 562Dh

ja above ;Переход на метку above, если содержимое АХ,

; рассматриваемое как "число без знака”, превышает беззнаковое число 562Dh

Jxx Команды условных переходов

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

Команда

Перейти, если

Условие перехода

JA

Выше

CF=0 и ZF=0

JAE

выше или равно

CF=0

JB

Ниже

CF=1

JC

перенос

CF=1

JE

равно

ZF=1

JG

больше

ZF=0 и SF=0

JGE

больше или равно

SF=OF

JL

меньше

SF != OF

JLE

меньше или равно

ZF=1 или SF != OF

JNE

не равно

ZF=0

JNG

не больше

ZF=1 или SF != OF

JNL

не меньше

SF=OF

JNLE

не меньше и не равно

ZF=0 и SF=OF

JNZ

не нуль

ZF=0

JZ

нуль

ZF=1

Пример 1

cmp AX, 0 ;AX=0?

je equal ;Еcли дa, перейти на метку equal

Пример 2

Int 21h ;Вызов системной функции

jc error ;Если СF=1 (ошибка), перейти на метку error

33 Асемблер. Макроси (опис, розташування, використання)

Фрагмент программы, оформленный специальным образом для дальнейшей подстановки, называют макросом. Такое оформление или описание называют макроопределением, ссылку на макрос — макрокомандой, процесс замены макрокоманды на макрос - макроподстановкой, а результат макроподстановки — макрорасширением.

Программа, написанная с помощью макросредств, транслируется в два этапа. На первом этапе (макрогенерации) в программе выполняются все макроподстановки, т.е. выполняется замена макрокоманд на ассемблерный код согласно макроопределениям. Макрогенерацию выполняет специальный транслятор - макрогенератор. На втором этапе осуществляется обычное ассемблирование.

Макроопределение выполняется с помощью директив MACRO и ENDM:

имя_макрокоманды macro список_формалных_параметров тело

макроопределения endm

Макроопределения обычно размещают в начале программы или в отдельном модуле (файле). В последнем случае они подключаются к программе с помощью директивы include. Ниже приведен пример определения простейшего макроса завершения работы программы:

exit macro ;определение макроса завершения программы

mov ax,4c00h

int 21h

endm

model small

stack 256

.data

…………

. code

start: mov ax,@data

mov ds,ax

………..

exit ;макрокоманда end start

Пример макроса с параметром. Параметр str является формальным параметром. В макросе используется сохранение в стеке содержимого регистра ах. Такой прием делает макрос надежнее, поскольку он сам использует этот регистр. Рекомендуется сохранять в макросах содержимое используемых регистров, чтобы не возникали конфликты с основной программой.

out_str macro str

push ax

mov ah,09h

lea dx,str

int 21h

pop ax

endm

Если этот код сохранить в виде отдельного модуля с именем, например, out. inc, то использовать его можно во многих программах, например:

title programm with macro

model small

include out.inc

.stack 100h

.data

lang db 'ASSEBLER',10,13,'$'

. code

out_str lang

Макросы могут иметь свои внутренние метки и при вызове макроса более одного раза возникнет ошибка двойного определения макроса, например, если определен макрос поиска вхождения символа в строку:

find macro symb

mov al,symb m1: inc si

cmp al, str1[si]

loopne m1

endm

то при использовании его двух раз макрогенератором сгенерируется такая программа:

;исходный код ; код после макрогенератора

…………… …………

mov bl,'а'

find bl mov al,bl

………. m1: inc si

mov bl,'c' cmp al,str1[si]

find bl loopne ml

……….

mov al,bl m1: inc si

cmp al, strl[si]

loopne m1

Компилятор в этом случае, конечно, сообщит об ошибке. Чтобы избежать этого используется специальная директива макроязыка LOCAL N1,N2,...,Nk, где N1,N2,...,Nk имена, использующиеся в макроопределении. Макрогенератор выполняет специальные замены этих имен на имена вида ??0000, ??0001 и так далее до 77FFFF. Пример:

find macro symb

local ml

mov al,symb

ml: inc si

cmp al, strl[si]

loopne ml

……………

xor si,si

mov ex,len

mov bl,'a'

findbl

xor si,si

mov ex,len

mov bl,'с'

findbl

Макрогенератор сгенерирует текст:

mov al,bl

??0000: inc si

cmp al,strl[si]

loopne ??0000

mov al,bl

??0001: inc si

cmp al,strl[si]

loopne ??0001