Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
экзамен информатика.doc
Скачиваний:
27
Добавлен:
25.04.2019
Размер:
464.38 Кб
Скачать

29. Команды умножения и деления на Ассемблере.

Имеется несколько команды умножения и деления:

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

MUL источник — умножение целых без знака

IMUL источник - умножение целых со знаком.

Действует она так:

а) при умножении байтов: содержимое регистра AL умножается на источник и результат помещается в AX (AH- старший байт результата, AL-младший байт результата)

б) при умножении слов: содержимое регистра AX умножается на источник и результат помещается в DX (старшое слово результата) и в AX (младшее слово)

в) при умножении двухбайтовых слов: содержимое регистра EAX умножается на источник и результат помещается в EAX(младшая часть результата) и EDX(старшая часть)

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

DIV источник - деление целых без знака

IDIV источник - деление целых со знаком

а) при делении на байт: Делимое берется из AX и частное возвращается в регистре AL,а остаток — в регистре AH

б) при делении на слово: Делимое берется из DX и AX и частное возвращается в регистре AX.а остаток — в регистре DX

в) при делении на двухбайтовых слов: Делимое берется из EAX(младшая часть) и EDX(старшая часть) и частное возвращается в регистре EAX, а остаток — в EDX

30. Директивы определения данных.

Обычно в программе используются переменные и константы. Нужно указать их имена и значения. Это делается с помощью директив.

Общий вид директивы:

[имя] название директивы [операнды]

имя- это и есть название константы или переменной, название директивы- служебное слово, оперенды — значения для переменных и констант.

Директивы определения данных (числа в байт размером)

DB (Define Byte – определить байт) — определяет данные размером в байт. (в 32-разрядном ассемблере — BYTE)

Например:

X DB ? - задание переменной Х неопределенного значения

Y DB 254 - задание переменной Y со значением 254.

По первой директиве просто отводится один байт памяти, в который ничего не записывается. Как правило, это первый свободный байт в памяти. При этом запоминается адрес этого байта, поэтому когда при выполнении программы процессор в тексте программы встретит имя этой переменной, то он заменит его на данный адрес.

Размер байтовой переменной со знаком от -128 до 128.

Директивы определения данных(символы)

В качестве начального значения можно указывать и символ. Причем можно указывать либо символ в кавычках, либо его ASCII код. Например, директива

Q DB 2Ah

и директива

Q DB “*”

эквивалентны.

Директивы определения массивов

M DB 2, -2 , “*”

описывает массив из трех элементов.

Имя, указанное в начале директивы, имеет только первый из этих байтов. Остальные байты остаются безымянными. Для ссылок на них в ассемблере используются выражения вида

M+k , где k – целое число, задающее номер следущего байта.

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

Повторение значений в директиве

R DB 8 DUP(0) эквивалентен R DB 0,0,0,0,0,0,0,0

т.е. вначале указывается коэффицент повторения, затем служебное слово DUP, а затем в круглых скобках — повторяемая величина.

Допустима и вложенность конструкций DUP. Это потребуется, например, при описании двухмерных массивов (матриц). Скажем, матрицу А размером 20х30 (20 строк по 30 элементов в каждой) можно описать :

A DB 20 DUP (30 DUP(?))

31. Безусловный переход, команда сравнения и условного перехода на Ассемблере.

Для нарушения порядка в котором следуют команды машинной программы применяются переходы. Для организации перехода в программе на Ассемблере, во-первых, в программе размещаются метки в виде символьно-цифровых имен (первй символ-буква), во-вторых, размещают команды сравнения и перехода. Если переход делается, когда выполнено некоторое условие, то такой переход называется условным, а если он делается независимо от условий, то это безусловный переход.

Команда сравнения имеет вид:

CMP op1, op2

Работает она так: тупо сравнивает значения op1 и op2, и в зависимости от результата работает следущая за ним команда перехода.

Команд перехода имеется довольно много. Отметим некоторые:

Для чисел без знака:

JA Label – переход на метку Label, если op1 > op2; Тут главное запомнить буквы:

JB Label – переход на метку Label, если op1 < op2; A – above -выше, т.е. если op1 > op2

JE Label – переход на метку Label, если op1 = op2; B – below – ниже, т.е. если op1<op2

JNE Label – переход на метку Label, если op1 <> op2; E – equal – равно, т.е. eсли op1=op2

JBE Label – переход на метку Label, если op1 <= op2; N – not – отрицание чего-то

JAE Label – переход на метку Label, если op1 >= op2; применяется различное сочетание

Для чисел зо знаком: NE( <> ),AE( >=),NA( <= ) и т.д.

JG Label – переход на метку Label, если op1 > op2; G – greater – больше, так же как

JL Label – переход на метку Label, если op1 < op2; A,только для знаковых

JE Label – переход на метку Label, если op1 = op2; L – less – меньше — аналог B

JNE Label – переход на метку Label, если op1 <> op2;

JLE Label – переход на метку Label, если op1 <= op2;

JBE Label – переход на метку Label, если op1 >= op2;

Cуществует вторая группа команд условного перехода — те, которые реагируют на то или иное значение какого-либо флага. В команде указывается первая буква проверяемого флага, если переход должен быть выполнен при значении флага 1, либо если эта буква указывается с буквой N=not, то при значении флага = 0.

Команда

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

Команда

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

JZ

ZF = 1

JNZ

ZF = 0

JS

SZ = 1

JNS

SZ = 0

JC

CZ = 1

JNC

CZ = 0

JO

OZ = 1

JNO

OZ = 0

JP

PZ = 1

JNP

PZ = 0

Команды перехода не меняют флаги.

Кроме того, имеется безусловный переход

JMP Label

Он выполняется без команды сравнения

32. Команда управления циклом на Ассемблере.

Цикл, как известно, представляет собой важную алгоритмическую структуру, без использования которой не обходится, наверное, ни одна программа. Организовать циклическое выполнение некоторого участка программы можно, к примеру, используя команды условного перехода. НО также имеются специальные команды.

Управление циклом по счетчику: LOOP метка

Действие этой команды можно описать так:

ECX := ECX-1 ;

if ECX <> 0 then goto метка

с помощью команды LOOP цикл, в котором некоторую группу команд (тело цикла) надо повторить N раз, запишется так:

mov ECX, N N>0

L: бла-бла-бла

бла-бла-бла ;тело цикла

бла-бла-бла

LOOP L

Особенностт команды цикла:

1) в качестве счетчика цикла обязательно используется ECX

2) начальное значение для ECX должно быть присвоено до цикла

3) команда LOOP ставится в конце цикла и поэтому тело цикла выполнится хотя бы 1 раз

Чтобы избежать такой ситуации, когда ECX изначально = 0 и,значит цикл не должен выполниться ни разу, используют специальную команду условного перехода JCXZ (переход в случак ECX=0)

mov ECX, N N>0

JCXZ L1

L: бла-бла-бла

бла-бла-бла ;тело цикла

бла-бла-бла

LOOP L

L1: оставшаяся бла-бла-бла