Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
arkhitektura.docx
Скачиваний:
50
Добавлен:
12.01.2020
Размер:
216.72 Кб
Скачать

16. Ассемблер. Команды пересылки данных. Арифметические команды

Основные команды

Команды пересылки данных

MOV dist, src – переслать (скопировать) данные из src в dist

Флаги не меняет.

PUSH src – занести в вершину стека слово из src (из регистра или 2-х ячеек памяти)

POP dst – извлечь из вершины стека слово и поместить его в dst (в регистр или 2 ячейки памяти)

Арифметические команды

ADD dst, src – сложение двоичных чисел. dst = dst + src

dst = r,m

src = r,m,i но нельзя использовать сегментные регистры и одновременно m

Влияет на флаги AF, CF, OF, PF, SF, ZF

SUB dst, src – вычитание двоичных чисел

dst = dst - src

dst = r,m

src = r,m,i но нельзя использовать сегментные регистры и одновременно m

Влияет на флаги AF, CF, OF, PF, SF, ZF

CMP dst, src – сравнить dst с src. Аналогично SUB, но содержимое dst не изменяется.

Флаги CF ZF используются для сравнения чисел без знака, CF, OF, SF, ZF – со знаком.

Команды приращения

INC dst – прибавить 1 к содержимому dst = dst +1

dst = r или m

Влияет на флаги PF, AF, ZF, SF, OF

DEC dst – вычесть 1 из содержимоого dst = dst +1

dst = r или m

Влияет на флаги PF, AF, ZF, SF, OF

Команды умножения

MUL src – умножение беззнаковых чисел.

src = r или m

Если src – байт, то второй множитель будет в AL а результат в AX. Если src – слово, то второй множитель будет в AX, а произведение в DX:AX

Формирует флаги CF, OF

IMUL src – умножение знаковых чисел.

src = r или m

Если src – байт, то второй множитель будет в AL а результат в AX. Если src – слово, то второй множитель будет в AX, а произведение в DX:AX

Формирует флаги CF, OF

Команды деления

DIV src – деление беззнаковых чисел.

src = r или m

Если src – байт, то делимое (слово) будет в AX, частное в AL, а остаток в AH Если src – слово, то делимое (двойное слово) будет в DX:AX, частное в AX, а остаток в DL.

Формирует флаг IF

IDIV src – деление знаковых чисел.

src = r или m

Если src – байт, то делимое (слово) будет в AX, частное в AL, а остаток в AH Если src – слово, то второй множитель (двойное слово) будет в DX:AX, частное в AX, а остаток в DL.

Формирует флаг IF

17. Ассемблер. Команды переходов. Процедуры.

Команды безусловного перехода

JMP opr – перейти на opr

opr может быть: меткой, регистром, содержимым ячейки памяти.

Если метка в том же сегменте памяти, то переход считается внутренним, если в другом сегменте – внешним.

В зависимости от дальности команд с которой и на которую надо перейти, команда JMP имеет различный размер. Команда внутреннего перехода занимает три байта (один байт – код команды и два байта – под смещение относительно сегмента кода той команды, куда нужно перейти). Однако команду JMP можно сократить до двух байт – отведя лишь один байт для информации о том, куда можно прейти. Осуществляется это с помощью префикса SHORT

В адресном байте команды в этом случае хранится число от -128 до +127 – оно указывает на относительное смещение той команды, куда нужно осуществить переход относительно текущей команды. То есть с помощью этой конструкции можно «прыгнуть» всего на 35-40 команд вперед-назад. Но зато и размер команды на один байт меньше.

То есть

JMP SHORT метка

Однако, если осуществляется переход назад и длина перехода укладывается в 128 байт, то транслятор автоматически уменьшает размер команды JMP, даже без префикса SHORT.

Команда внешнего, межсегментного перехода занимает 5 байтов (два байта под сегмент и два под смещение относительно этого сегмента).

Процедуры

Процедуры обрамляются следующими операторами:

Имя процедуры PROC [расстояние]

; тело процедуры

RET [число байтов]

Имя процедуры ENDP

Расстояние: NEAR – процедура находится в том же сегменте кода, FAR – в другом сегменте кода. Если расстояние опущено, то предполагается near.

RET – возврат управления вызвавшей процедуру программе. Она считывает адрес возврата из стека и загружает его в регистры CS и IP (если процедура NEAR, то только IP). Число байт указывает, сколько байтов нужно освободить в стеке после возврата.

Как обратиться к процедуре? В принципе, можно любой командой перехода, включая и JMP. Однако в случае использования процедур важно запомнить то место в основном программе, откуда была вызвана процедура, с тем, чтобы потом к нему вернутся после завершения процедуры (команды RET в процедуре). Для этих целей используется команда

CALL [модификатор] oprnd

oprnd может быть:

именем процедуры

именем регистра, в котором содержится смещение адреса процедуры

переменной, в которой содержится адрес процедуры.

Процедура может размещаться в любом месте программы, но так, чтобы на нее случайным образом не попало управление. Если процедуру просто вставить в общий поток сегмента кода, то процессор будет выполнять команды процедуры непосредственно при выполнении основной программы. Чтобы этого не произошло можно размещать процедуру следующим образом:

- в начале программы (до первой исполняемой команды);

- в конце программы (после команды, возвращающей управление операционной системе);

- внутри основной программы, предусмотрев обход процедуры с помощью команды безусловного перехода JMP.

Команды условной передачи управления

Условная передача управления может быть только внутрисегментной (NEAR) и короткой (SHORT), то есть в пределах ±128 байт от текущей команды условного перехода.

Алгоритм действия такой:

Сначала выполняется команда, которая соответствующим образом меняет регистр флагов, например команда CMP

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

J* имя метка

Которая при определенной комбинации флагов переводит управление на метку, имя которой указано в ней, либо передает управление на следующую за командой условного перехода команду.

Есть 31 команда, но разных всего 17 (так как некоторые попарно совпадают, например «если больше» все равно, что «если не меньше и не равно» ).

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

Для беззнаковых:

JA/JNBE – переход если выше – если флаги ZF = CF = 0

JAE/JNB – переход если выше или равно CF=0

JB/JNAE – переход если ниже CF=1

JBE/JNA – переход если ниже или равно – если флаги ZF = CF = 1

Для знаковых:

JG/JNLE – переход если больше – если флаги ZF = 0 SF = OF

JGE/JNL – переход если выше или равно SF=OF

JL/JNGE – переход если ниже SF<>OF

JLE/JNG – переход если ниже или равно – если флаги ZF = 1 или SF<>OF

Для прочих проверок:

JE/JZ – переход если равно (или если нуль) ZF=1

JNE/JNZ – переход если не равно (или не нуль) ZF=0

JS – переход, если есть знак (отрицательно) SF=1

JNS – переход, если нет знака (положительно) SF=0

JC – переход, если есть перенос (CF=1)

JNC – переход, если нет переноса (CF=0)

JO – переход, если есть переполнение (OF=1)

JNO – переход, если нет переполнения (OF=0)

JP/JPE – переход, если есть четность PF=1

JNP/JPO – переход, если нет четности PF=0

JCXZ – переход, если содержимое регистра CX равно 0

Соседние файлы в предмете Архитектура информационных систем