Команда cmp выполняет вычитание операторов и устанавливает флаги, не записывает результат вычитания на место первого операнда. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Команда cmp выполняет вычитание операторов и устанавливает флаги, не записывает результат вычитания на место первого операнда.



Cmp операнд_1, операнд_2

Опкод Значение(переход,если...) Условие
JA Jump if above (X > Y) CF=0 & ZF=0
JAE Jump if above or equal (X >= Y) CF=0
JB Jump if below (X < Y) CF=1
JBE Jump if below or equal (X < Y) CF=1 or ZF=1
JC Jump if carry (cf=1) CF=1
JCXZ Jump if CX=0 регистр CX=0
JE (то же, что и JZ) Jump if equal (X = Y) ZF=1
JG Jump if greater (signed) (X > Y) ZF=0 & SF=OF
JGE Jump if greater or equal (signed) (X >= Y) SF=OF
JL Jump if less (signed) (X < Y) SF!= OF
JLE Jump if less or equal (signed) (X <= Y) ZF=1 or SF!=OF
JMP Безусловный переход -
JNA Jump if not above (X <= Y) CF=1 or ZF=1
JNAE Jump if not above or equal (X < Y) CF=1
JNB Jump if not below (X >= Y) CF=0
JNBE Jump if not below or equal (X > Y) CF=1 & ZF=0
JNC Jump if not carry (cf=0) CF=0
JNE Jump if not equal (X!= Y) ZF=0
JNG Jump if not greater (signed) (X <= Y) ZF=1 or SF!=OF
JNGE Jump if not greater or equal (signed) (X < Y) SF!=OF
JNL Jump if not less (signed) (X >= Y) SF=OF
JNLE Jump if not less or equal (signed) (X > Y) ZF=0 & SF=OF
JNO Jump if not overflow (signed) (of=0) OF=0
JNP Jump if no parity (pf=0) PF=0
JNS Jump if not signed (signed) (sf=0) SF=0
JNZ Jump if not zero (X!= Y) ZF=0
JO Jump if overflow (signed) (of=1) OF=1
JP Jump if parity (pf=1) PF=1
JP Jump if parity (pf=1) PF=1
JPE Jump if parity even PF=1
JPO Jump if parity odd PF=0
JS Jump if signed (signed) SF=1
JZ Jump if zero (X = Y) ZF=1

20.Способи задавання операндів. Способи адресації. Косвенна базова (регістрова) адресація зі зміщенням. Приклади використання. Основні регістри процесора Intel (Pentium III)

Пересылка данных

Поддерживаются начиная с процессора 8086.
mov <операнд_назначения>, <операнд_источник >

xchg <операнд1>, <операнд2>

cmovcc <приёмник>,<источник>

bswap <регистр 32>

 

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

1) нельзя осуществлять пересылку из одной области памяти в другую. При такой необходимости нужно использовать в качестве промежуточного буфера любой доступный регистр общего назначения. Пример: переслать байты из ячейки памяти fls в ячейку fld:

Data

Fls dd 947503b3h

Fld dd?

Code

Start

----

Mov eax, fls

Mov fld,eax

----

End start

 

2) нельзя загрузить в сегментный регистр значение непосредственно из памяти. Для выполнения такой загрузки нужно использовать промежуточный объект (регистр общего назначения или стек).

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

Пример: инициализировать регистр es значением регистра ds:

Mov ax,ds

Move es,ax

Можно также использовать стек и команды push и pop:

Push ds; поместить значение регистра ds в стек

Pop es; записать в es число из стека

 

Нельзя использовать сегментный регистр cs в качестве операнда назначения.

 

5) оператор ptr можно применять и когда требуется принудительно поменять размерность операндов. К примеру, требуется переслать значение 0ffh во второй байт поля flp:

Data

Flp dw?

Code

start:

----

mov byte ptr (flp+1),0ffh

----

End start

Для двунаправленной пересылки данных применяют команду xchg. Эту же операцию можно выполнить применив последовательность из нескольких команд mov. Общий вид записи:

 

XCHG <операнд1>, <операнд2>

 

Содержимое операнда2 копируется в операнд1, а старое содержимое операнда1 — в операнд2. XCHG можно выполнять над двумя регистрами или над регистром и переменной.

Например:

Xchg eax,ebx; обменять содержимое регистров eax и ebx.

То же, что три команды на языке С:

temp = eax;

eax = ebx;

ebx = temp;

 

Xchg al,al; а эта команда не делает ничего

xchg ax, word ptr [si]; обменять содержимое регистра ах и слова в памяти по адресу в [si].

22. Відмінності програми, написаної для DOS16 та для Win32. Арифметичні команди. Випадки при яких виникає переповнення результату ділення. Способи, що позволяють виконати ділення навіть при виникненні переповнення результату ділення.

Программирование арифметических выражений в языке Ассемблер происходит через некоторые команды такие, как: mul, div, sub, add. Эти команды называются командами арифметических операций.


Mul – команда умножения. Она умножает регистр ax на то, что стоит после нее. Результат заносится в ax.
Div – команда деления. Она делит регистр ax на то, что стоит после нее. Результат заносится в ax.
Add – команда сложения. Слаживает два числа. Результат заносится в первый регистр.
Sub – команда вычитания. Вычитает два числа. Результат заносится в первый регистр.

Пример: Написать программу на ассемблере вычисления выражения: а – e/b – de;
где а =5;
b =27;
c = 86;
е =1986;
d =1112;
Результат вычисления выражения сохранить в памяти. Навести значение и порядок размещения данные в памяти.

Текст программы

.686; директива определения типа микропроцессора
.model flat,stdcall; задание линейной модели памяти
; но соглашения ОС Windows

.data; директива определения данные
_a dw 5; запись в 16-разрядный амбарчик памяти с именем _а числа 5
_b dw 27; запись _b = 16h
_c dw 86; запись _c = 56h
_e dw 1986; запись _e = 7C2h
_d dw 1112; запись _d = 458
res dw 0; резервирование памяти для сохранения переменной res

.code; директива начала сегмента команд
start:
mov edx,0; очистка регистров
mov ebx,0; очистка регистров
mov ecx,0; очистка регистров
mov ах,_e; в регистр ах заносим число _e = 7C2h
mul _d; множим _e и _d
SHL edx,16; делаем здвиг на 16
mov dx,ax
push edx; бросаем значение в стек
mov edx,0
mov ах,_e
mov cx,_b
div cx; делим ах с cx
pop ecx; достаем из стеку значения
sub ecx,eax; отнимаем
mov ах,_a
sub eax,ecx
mov res, eax
ret; возвращение управление ОС
end start; окончание программы с именем _start

Переполнение результата деления возникает в следующих случаях:

1. Делитель равен 0

2. При делении байтов без знака делимое без знака делимое пол меньшей мере в 256 раз превышает делитель.

3. При делении слов без знака делимое по меньшей мере в 65 536 раз превышает делитель.

4. При делении байтов со знаком частное лежит вне диапазона от –128 до 127.

5. При делении слов со знаком частное лежит вне диапазона от –32768 до 32767

Коррекция результата

Для того чтобы поучить правильный результат (т.е. выполнить перенос из одного разряда в другой, 56+25= 81, один десяток надо перенести в старший разряд) необходимо его скорректировать. Это делается с помощью следующих команд.

AAA – скорректировать результат сложения для представления в кодах ASCII.

DAA – скорректировать сложение для представления в десятичном формате.

Формат:

AAA

DAA

 

24. Команда cmp у асемблері. Робота з негативними числами в асемблері при виконанні арифметичних операцій. Значення прапора sf. Приклади встановлення прапора sf при виконанні віднімання В-С. Алгоритм виведення негативних чисел на екран.



Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 329; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.14.70.203 (0.008 с.)