386+ BTR Перевірка і скидання бита
Команда btr перевіряє певний біт в слові, заданому першим операндом,
копіює його значення в прапор CF і скидає. Номер біта виступає як другий
операнд. Першим операндом команди btr може служити регістр або елемент пам'яті,
другим - регістр або безпосереднє значення. У команді допустиме використання
як 16-бітових, так і 32-бітових операндів, але і перший, і другий операнди мають
бути одного типу (за винятком випадку, коли другий операнд - константа).
Приклад 1
mov Ax,00fh ;Анализируемое дане
btr АХ, 5 ;AX=00DFh. Битий 5 був = 1
;Скидання бита 5, Zf=1
Приклад 2
mov Ax,00ffh ;Анализируемое дане
btr AX, 8 ;AX=0FFh Битий 8 був =0
;Залишився 0, Zf=0
Приклад 3
mov Ax,8001h ;Анализируемое дане
mov
Bx,15 ;Номер біта, що перевіряється
btr Ax,bx ;AX=0001h Битий 15 був = 1
;Скидання бита 15, Zf=1
Приклад 4
;У полях даних
mem dw Ifh
;У програмному сегменті: ;Анализируемое дане
btr mem,10 ;mem=lFh Битий 10 був = 0
;Залишився 0, Zf=0
386+
BTS Перевірка і установка бита
Команда bts перевіряє певний біт в слові, заданому першим операндом,
копіює його значення в прапор CF
і встановлює. Номер біта виступає як другий
операнд. Першим операндом команди bts може служити регістр або елемент пам'яті,
другим - регістр або безпосереднє значення. У команді допустиме використання
як 16-бітових, так і 32-бітових операндів, але і перший, і другий операнди мають
бути одного типу (за винятком випадку, коли другий операнд - константа).
Приклад 1
mov Ax,ooffh ;Анализируемое дане
bts AX, 5 ;AX=OOFFh Битий 5 був = 1
;Залишився 1, Zf=1
Приклад 2
mov Ax,ooffh ;Анализируемое дане
bts AX, 8 ;AX=lFFh Битий 8 був = 0
;Установка бита 8, Zf=0
Приклад 3
mov Ax,8001h ; Аналізоване дане
mov
Bx,15 ;Номер біта, що перевіряється
bts Ax,bx ;AX=8001h Битий 15 був = 1
;Залишився 1, Zf=1
Приклад 4
; У полях даних
mem dw Ifh ; Аналізоване дане
;У програмному сегменті:
bts mem,10 ;mem=4lFh Битий 10 був = 0
; Установка бита 10, Zf=0
CALL
Виклик підпрограми
Команда call передає управління підпрограмі, зберігши перед цим в стеку зсув
до крапки повернення. Команда ret, якою зазвичай закінчується підпрограма, забирає
із стека адресу повернення і повертає управління на команду, наступну за командою
call. Команда не впливає на прапори процесора.
Команда call має чотири модифікації:
- виклик прямої ближній (в межах поточного програмного сегменту);
- виклик прямої дальній (виклик підпрограми, розташованої в іншому програмному
сегменті);
- виклик непрямий ближній;
- виклик непрямий дальній.
Всі
різновиди викликів мають одну і ту ж мнемоніку call,
коди операцій, що хоча
і розрізняються. У багатьох випадках транслятор може визначити вид виклику по контексту,
в тих же випадках, коли це неможливо, слід використовувати атрибутних операторів:
near ptr - прямий ближній виклик;
far ptr - прямий дальній виклик;
word ptr - непрямий ближній виклик;
dword ptr - непрямий
дальній виклик.
Команда call прямого ближнього виклику заносить в стек відносну адресу точки
повернення в поточному програмному сегменті і модифікує IP так, щоб в нім містяться
відносна адреса точки переходу в тому ж програмному сегменті. Необхідна
для обчислення цієї адреси величина зсуву від крапки повернення до точки переходу
міститься в коді команди, який займає 3 байт (код операції E8h і зсув
до точки переходу).
Команда
call прямого дальнього виклику заносить в стек два слова - спочатку сегментна адреса
поточного програмного сегменту, а потім (вище, в слово з меншою адресою) відносна
адреса точки повернення в поточному програмному сегменті. Далі модифікуються регістри
IP і CS: у IP поміщається відносна адреса точки переходу в тому сегменті, куди
здійснюється перехід, а в CS - сегментна адреса цього сегменту. Обидві ці величини
беруться з коди команди, яка займає 5 байтів (код операції 9а1г, відносна
адреса підпрограми, що викликається, і її сегментна адреса).
Непрямі виклики відрізняються тим, що адреса переходу витягується не з коди команди,
а з елементів пам'яті; у коді команди міститься інформація про те, де знаходиться
адреса виклику. Довжина коди команди залежить від використовуваного способу адресації.
Приклади прямого ближнього
виклику
call near ptr subl ;Вызов підпрограми subl
;з того ж сегменту
call subl ;To же саме
Непрямі ближні виклики
Приклад 1
mov Bx,offset subl ;ВХ=адрес підпрограми
call BX ;Вызов підпрограми
Приклад 2
; У полях даних:
addr dw subl ;Ячейка з адресою підпрограми
;У програмному сегменті:
call Ds:addr ;Вызов підпрограми
call word ptr addr ;To же саме
Приклад 3
;У полях даних:
addr dw subl ;Ячейка з адресою підпрограми
;У програмному сегменті:
mov Si,offset addr ;SI=адрес осередки з адресою
;підпрограми
call [SI] ;Вызов підпрограми
Приклад 4
;У полях даних:
tbl dw subl ;Ячейка з адресою
;підпрограми 1
dw sub2 ;Ячейка з адресою
;підпрограми 2
dw sub3 ;Ячейка з адресою
;підпрограми 3
;В програмному сегменті:
mov Bx,offset tbl ;ВХ=адрес таблиці адрес
;підпрограм
mov SI, 2 ;SI=смещение до адреси sub2
call [BX] [SI] ;Вызов підпрограми 2
Приклад прямого дальнього виклику
call far ptr subl ;Вызов підпрограми sub2
;розташованою в іншому
;програмному сегменті
Непрямі дальні виклики
Приклад 1
;У полях даних:
addr dd subl ;Поле з двухсловним
;адресою підпрограми
;В програмному сегменті:
call Ds:addr ;Вызов підпрограми
call dword ptr addr;To же саме
Приклад 2
;У полях даних:
addr dd subl ;Поле з двухсловним
;адресою підпрограми
;В програмному сегменті:
mov Di,offset addr ;В1=адрес поля з адресою
;підпрограми
call [DI] ;Вызов підпрограми
Приклад 3
; У полях даних:
tbl dd subl ;Адрес підпрограми 1
dd sub2 ;Адрес підпрограми 2
dd sub3 ;Адрес підпрограми 3
;У програмному сегменті:
mov Si,offset tbl ;DI=адрес таблиці адрес
mov Di,8 ;Смещение до адреси sub3
call [SI] [DI] ;Вызов підпрограми sub3
Допустиме використання
додаткових режимів адресації 32-розрядних процесорів. У 32-розрядних застосуваннях
допустиме використання 32-бітових операндів. У захищеному режимі роль сегментної
адреси виконує селектор.
Приклади
call [EAX] ;Косвенный виклик
call 8[ЕСХ];Косвенный виклик
CBW
Перетворення байта в слово
Команда
cbw заповнює регістр АН знаковим бітом числа, що знаходиться в регістрі
AL, що дає можливість виконувати арифметичні операції над початковим операндом-байтом,
як над словом в регістрі АХ. Команда не має параметрів і не впливає
на прапори процесора.
Приклад 1
mov Al,5
cdw ;AX=0005h
Приклад 2
mov AL, - 2;AL=FEh=-2 (байт)
cdv;AX=FFFEh=-2 (слово)
386+
CDQ Перетворення подвійного слова в четверне
Команда cdq розширює знак подвійного слова в регістрі ЕАХ на регістр
EDX. Цю
команду можна використовувати для утворення
четирехсловного ділимого з двухсловного
перед операцією двухсловного ділення. Команда не має параметрів і не впливає
на прапори процесора.
Приклад 1
;У полях даних
mem dd -2 ; Негативне число
;У програмному сегменті
mov Еах,mem ;EAX=FFFFFFFEh
cdq ;EDX=FFFFFFFFh, Eax=fffffffeh
Приклад 2
;У полях даних
mem dd 7ffffffeh,'положітельноє число
;У програмному сегменті
mov Еах,mem ;EAX=7FFFFFFEh
cdq ;EDX=00000000h, Eax=7ffffffeh
-
|