При прямом внутрисегментном переходе можно производить переходы в приделах 64 Кбайт относительно следующей за jmp команды. 


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



ЗНАЕТЕ ЛИ ВЫ?

При прямом внутрисегментном переходе можно производить переходы в приделах 64 Кбайт относительно следующей за jmp команды.



Пример 3:

M1:

…; расстояние более 128 байт и менее 64 Кбайт

Jmp m1

….

 

При косвенном внутрисегментном переходе указывается не сам адрес перехода, а место, где он записан.

Пример 4:

Lea bx,m1

Jmp bx; адрес перехода в регистре bx

m1:

 

Пример 5:

Data

Addr dw m1

Dw m2

Code

cycl:

Mov si,0

jmp addr[si]; адрес перехода в слове addr+(si)

Mov si,1

jmp addr[si]; адрес перехода в слове addr+(si)

Jmp cycl

m1:

m2:

Межсегментный переход изменяет регистры cs и eip/ip. Межсегментный переход поддерживает два варианта команд безусловного перехода: прямой и косвенный.

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

Пример 6:

Seg_1 segment

Jmp far ptr m2

M1 label far

seg_1 ends

seg_2 segment

M2 label far

Jmp m1

Команда косвенного межсегментного перехода в качестве операнда имеет адрес области памяти, в которой содержатся смещение и сегментная часть адреса перехода.

 

Таким образом, модификаторы short ptr, near ptr, word ptr применяются для организации внутрисегментных переходов, а far ptr, dword ptr – межсегментных.

 


Процедуры

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

– механизм процедур;

– макроассемблер;

– механизм прерываний.

 

Обратиться к процедуре можно с помощью любой команды перехода.

Контекст – информация о состоянии программы в точке вызова процедуры.

Есть две команды, осуществляющие работу с контекстом. Это команды call и ret:

– call[модификатор] имя_процедуры – вызов процедуры. Команда call, подобно jmp передаёт управление по адресу с символическим именем имя_процедуры, но при этом в стеке сохраняется адрес возврата. Адрес возврата – это адрес команды, следующей после команды call;

– ret [число] – возвратить упраление вызывающей программе. Команда ret считывает адрес возврата из стека и загружает его в регистр cs и eip/ip тем самым возвращая управление на команду следующую в программе за командой call. [число] – необязательный параметр, обозначающий количество элементов, удаляемых из стека при возврате из процедуры.


Вызов процедуры командой call может быть:

– внутрисегментным – процедура находиться в текущем сегменте кода (имеет тип near), и в качестве возврата команда call сохраняет в стек только содержимое регистра eip/ip;

– межсегментным – процедура находится в другом сегменте кода (имеет тип far) и для осуществления возврата команда call заносит в стек содержимое обоих регистров cs и eip/ip. Очерёдность такова: сначала в стек помещается регистр cs, а потом eip/ip.

Подобно команде jmp существует четыре разновидности команды call, в зависимости от значения [модификатор] и атрибута дальности в описании процедуры.

Значения [модификатор] такие же, как и у команды jmp за исключением short ptr.

– near ptr;

а) прямой короткий (short ptr);

б) прямой;

в) косвенный.

– far ptr;

– word ptr

– dword ptr

 


Условные переходы

Микропроцессор имеет 18 команд условного перехода, позволяющие проверить:

– отношение между операндами со знаком (больше-меньше);

– отношение между операндами без знака (выше-ниже);

– состояние арифметических флагов zf,sf, cf, of, pf.

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

Jcc метка_перехода

 

Межсегментной передачи управления в условных переходах не допускается (максимальный переход равен размеру сегмента).

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

– любая команда, изменяющая состояние арифметических флагов;

– команда сравнения cmp;

– состояние регистра ecx/cx.

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

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

 

Значения аббревиатур в названии команды jcc:

 

 

Пример 7: сравним очередной элемент массива с 5:

 


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


Cmp x, y

Опкод Значение(переход,если...) Условие
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

 

 


Пример 8: надо преобразовать строчные буквы в прописные. Строчным буквам в таблице ASCII символов соответствует диапазон 61h-7ah, прописным – 41h-5ah. Для выполнения преобразования между строчными и прописными буквами достаточно инвертировать 5 бит.

Например:

а – 01100001 z – 01111010

А – 01000001 Z – 01011010

 

Таблица ASCII кодов.

                      A B C D E F
  ... ...     @ P ' Р А Р а ... ... ... р Ё
  ... ... !   A Q a Q Б С б ... ... ... с ё
  ... ... "   B R b R В Т в ... ... ... т Є
  ... ... #   C S c S Г У г ... ... ... у є
  ... ... $   D T d T Д Ф д ... ... ... ф Ї
  ... ... %   E U e U Е Х е ... ... ... х ї
  ... ... &   F V f V Ж Ц ж ... ... ... ц Ў
  ... ... '   G W g W З Ч з ... ... ... ч ў
  ... ... (   H X h X И Ш и ... ... ... ш °
  ... ... )   I Y i Y Й Щ й ... ... ... щ
A ... ... * : J Z j Z К Ъ к ... ... ... ъ ·
B ... ... + ; K [ k { Л Ы л ... ... ... ы
C ... ... , < L \ l | М Ь м ... ... ... ь
D ... ... - = M ] m } Н Э н ... ... ... э ¤
E ... ... . > N ^ n ~ О Ю о ... ... ... ю
F ... ... / ? O _ o ¤ П Я п ... ... ... я  

 

 



Поделиться:


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

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