Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ас(1).docx
Скачиваний:
39
Добавлен:
11.02.2015
Размер:
897.48 Кб
Скачать

24. Три вида команд безусловного перехода jmp ***. Особенности их использования

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

jmp [модификатор] адрес_перехода

Существует несколько кодов машинных команд, соответствующих JMP. Они отличаются дальностью перехода и способом задания целевого адреса. Операнд адрес_перехода может находиться в текущем сегменте(близкий переход) кода или в другом (дальний переход). Адресом перехода может являться имя метки:

jmp m

m:

mov eax,1

Есть еще такой вариант (указывается не адрес перехода, а место, где он хранится):

lea eax,m

jmp eax

m:

mov eax,1

25

CMPSСравнение строк

Команда CMPS сравнивает содержимое одной области памяти (адресуемой регистрами DS:SI) с содержимыми другой области (адресуемой как ES:DI). В зависимости от флага DF команда CMPS также увеличивает или уменьшает адреса в регистрах SI и DI на 1 для байта или на 2 для слова. Команда CMPS устанавливает флаги AF, CF, OF, PF, SF и ZF. При использовании префикса REP в регистре CX должна находиться длина сравниваемых полей. Команда CMPS может сравнивать любое число байт или слов.

Рассмотрим процесс сравнения двух строк, содержащих имена JEAN и JOAN. Сравнение побайтно слева направо приводит к следующему:

J : J Равно

E : O Не равно (E меньше O)

A : A Равно

N : N Равно

Сравнение всех четырех байт заканчивается сравнением N:N - pавно/нуль. Так как имена "не равны", операция должна пре кратиться, как только будет обнаружено условие "не равно". Для этих целей команда REP имеет модификацию REPE, которая повторяет сравнение до тех пор, пока сравниваемые элементы равны, или регистр CX не pавен нулю.

MOVS Пересылка данных из строки в строку

Команда предназначена для операций над строками (строкой называется последовательность байтов или слов памяти с любым содержимым). Она пересылает по одному элементу строки, который может быть байтом или словом. Первый операнд (приемник) адресуется через ES:DI, второй (источник) - через DS:SI. Операцию пересылки можно условно изобразить следующим образом:

(DS:SI) -> (ES:DI)

После каждой операции пересылки регистры SI и DI получают положительное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величина приращения составляет 1 или 2 в зависимости от размера пересылаемых элементов. Вариант команды movs имеет формат: movs строка_1, строка_2

В этом случае байты или слова из строки строка_2 пересылаются на место строки строка_1. Размер пересылаемых элементов определяется описанием строк (с помощью директив db или dw). Это не избавляет от необходимости инициализировать регистры ES:DI и DS:SI адресами строк строка _1 и строка_2. В этом формате возможна замена сегмента второй строки (источника): movs строка_1, ES:строка_2

Рассматриваемая команда может предваряться префиксом повторения rep (повторять СХ раз). После выполнения рассматриваемых команд регистры SI и DI указывают на ячейки памяти, находящиеся за теми (если DF=0) или перед теми (если DF=1) элементами строк, на которых закончились операции пересылки. Если флаг DF сброшен, то пары регистров DS:SI и ES:DI следует инициализировать начальными адресами строк-операндов; строка-источник будет пересылаться от се начала, в порядке возрастания номеров ее байтов. Если флаг DF установлен, то пары регистров DS:SI и ES:DI следует инициализировать конечными адресами строк-операндов; строка-источник будет пересылаться от ее конца, в порядке уменьшения номеров ее байтов. Команды не воздействует на флаги процессора.

26Две команды умножения mul (multiplication,умножение) для умножения беззнаковых чисел и imul (integer multiplication, целочисленное умножение) для работы со знаковыми числами. Результаты их выполнения при одних и тех же операндах могут радикально различаться. Обе команды могут работать как со словами, так и с байтами. Они выполняют умножение числа, находящегося в регистрах АХ (в случае умножения на слово) или AL (в случае умножения на байт), на операнд, который может находиться в каком-либо регистре или в ячейке памяти. Не допускается умножение на непосредственное значение, а также на содержимое сегментного регистра. Размер произведения, т. е. число байтов в нем, всегда в два раза больше размера сомножителей. Для 1-байтовых операций полученное произведение записывается в регистр АХ. Для 2-байтовых операций результат умножения, который имеет размер 32 бита, записывается в регистры DX:AX (в DX - старшая половина, в АХ - младшая). Рассмотрим несколько конкретных примеров действия команд знакового и без- знакового умножения.

mov AL,3 ;Первый сомножитель-003

mov BL,2 ;Второй сомнозкитель=002

mulBL;AX=0006h=00006

mov AL,3 ;Первый сомножитель-003

mov BL,2 ;Второй сомнозкитель=002

imulBL;AX=0006h=+00006

Обе команды, mul и imul, дают в данном случае одинаковый результат, поскольку знаковые положительные числа совпадают с беззнаковымиmov

movAL,0FFh;Первый сомножитель=0FFh=255

movBL,2 ; Второй сомножитель=002

mulBL;AX=01FEh=00510

movAL,0FFh;Первый сомножитель=0FFh=255

movBL,2 ; Второй сомножитель=002

imulBL;AX=FFFEh=-00002

Здесь действие команд mul и imul над одними и теми же операндами дает разные результаты. В первом примере беззнаковое число FFh, которое интерпретируется как десятичное 255, умножается на 2, давая в результате беззнаковое 00510, или O1FEh. Во втором примере то же число FFh рассматривается как знаковое. В этом случае оно составляет -001. Умножение на 2 дает -002, или FFFEh.

Разная интерпретация одного и того же' числа FFh обусловлена использованием в первом случае команды для обработки беззнаковых чисел, а во втором - знаковых.

FFFFFFFEh. По-прежнему старшая половина этого числа (FFFFh) записывается в DX, младшая половина (FFFEh) - в АХ.

27 командаDIVДеление целых беззнаковых чисел

Команда DIVвыполняет деление целого числа без знака, находящегося в регистрах АХ (в случае деления на байт) илиDX:AX(в случае деления на слово), на операнд- источник (целое число без знака). Размер делимого в два раза больше размеров делителя и остатка.

Для 1-байтовых операций делимое помещается в регистр АХ; после выполнения операции частное записывается в регистр AL, а остаток - в регистр АН.

Для 2-байтовых операций делимое помещается в регистры DX:AX(вDX- старшая часть, в АХ - младшая); после выполнения операции частное записывается в

регистр АХ, а остаток - в регистр DX.

В качестве операнда-делителя можно указывать регистр данных или ячейку памяти; не допускается деление на непосредственное значение. Если делитель равен нулю или если частное не помещается в назначенный регистр, возбуждается прерывание через вектор 0. Команда не воздействует на флаги процессора.

Команду divможно использовать для целочисленного деления неупакованного двоично-десятичного числа в регистре АХ не неупакованный двоично-десятичный делитель, если перед ней выполнить командуaad.

386+ Допустимо использование 32-битовых операндов и дополнительных

режимов адресации 32-разрядных процессоров. При этом если делитель представляет

32-битовую величину, то возможен только один вариант команды деления, когда делимое находится в паре регистров EDX:EAX. В этом случае частное будет помещено в регистр ЕАХ, остаток - вEDX.