→ Пошук по сайту       Увійти / Зареєструватися

Команди асемблера для Intel: 386+ BTR, 386+ BTS, CALL, CBW, 386+ CDQ

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 

загрузка...
Сторінки, близькі за змістом