Assembler proqramlaşdırma dili

İkilik çıxma əmrləri

İkilik çıxma əmrləri

İşarəsiz ikilik ədədlərin çıxılmasında, azalan çıxılandan böyük olduqda, fərq müsbət olduğundan fərqin qəbuledicidə yerləşməsində heç bir problem yaranmır. Ancaq, əgər azalan çıxılandan kiçik olarsa, fərq mənfi olur. Bu halda mikroprosessor operandın mərtəbə şəbəkəsinin növbəti böyük mərtəbəsindən 1 vahid borc götürür. Bu məsələni söz uzunluğunda olan operandların çıxılması əməliyyatında araşdıraq:

Əslində isə (65536+4)–5=65535 əməliyyatı icra olunur.

Beləliklə, işarəsiz ədədlərin çıxılmasından sonra, CF bayrağının vəziyyətini analiz etmək lazımdır. Əgər o 1 vəziyyətindədirsə, bu o deməkdir ki, böyük mərtəbədən borc götürülüb və nəticə əlavə kodda alınıb.

İkilik ədədlərin çıxılması üçün mikroprosessorun

SUB (SUBtract-çıxma ),

SBB (SUBtract with Borrow-borc götürməklə çıxma )

DEC (DECrement operand by 1- operandın qiymətinin 1 azaldılması) əmrlərindən istifadə olunur.

SUB və SBB çıxma əmrlərinin yazılışları aşağıdakı kimidir:

SUB qəbuledici, mənbə

SBB qəbuledici, mənbə

DEC qəbuledici

SUB əmri qəbuledicinin məzmunundan mənbənin məzmununu çıxır və nəticəni qəbuledicidə yerləşdirir.

qəbuledici = qəbuledici - mənbə

Toplama əmrində olduğu kimi çıxma əmrində də qəbuledici operand kimi registr və yaddaş sahəsinin məzmunu, mənbə kimi isə registr, yaddaş sahəsinin məzmunu və bilavasitə ədəd götürülə bilər. Bu əmrlərin operandları bayt, söz və ya ikiqat söz uzunluğunda ola bilər.SUB əmri ADD əmri kimi işarəli və işarəsiz ədədləri fərqləndirmir. Ancaq bayraqlar onu bu və ya digər hallar üçün istifadə etməyə imkan verir.

SUB əmrindən tam ədədi operandların və ya çoxbaytlı operandların kiçik hissəsənin qiymətinin çıxılmasında istifadə olunur.

SBB əmri SUB əmrinə analoji olaraq işləyir, ancaq o qəbuledicinin qiymətindən mənbənin və CF bayrağının qiymətini çıxır. Yəni

Qəbuledici = qəbuledici – mənbə – CF_qiyməti

SBB əmri ADC əmrinə uyğundur, ancaq burada CF bayrağı ədədlərin çıxılmasında böyük mərtəbədən borc götürmə indikatoru rolunu oynayır.

SBBəmri ADD/ADC əmrinə analoji olaraq EDX:EAX və EBX:ECX registrlərində yerləşən 64 bitlik ikilik ədədlərin qiymətinin çıxılması əməliyyatını aşağıdakı kimi yerinə yetir:

çıxlan DD 2 dup (0)
çıxan DD 2 dup (0)
rez   DD 2 dup (0)
...
; qiymətləri azalan və çıxılan sahəsinə daxil etmək
; kiçik baytı kiçik ünvana yazmaq şərti ilə
...
mov EAX, azalan
sub  EAX, çıxılan          ;  ədədin kiçik hissəsinin çıxılması
mov rez, EAX                ; kiçik hissənin nəticəsi
mov EAX, azalan+4
sbb EAX, çıxılan+4       ; böyük hissənin çıxılması
mov rez+4, EAX            ; böyük hissənin nəticəsi

Əgər kiçik ikiqat sözlərin çıxılması zamanı borc götürmə baş verərsə, onda bu böyük sözlərin çıxılmasında nəzərə alınır.

DEC (DECriment) əmri registrin və ya yaddaş xanasının (qəbuledicinin) məzmununu 1 vahid azaldır. Əmrin formatı:

DEC qəbuledici

Bu əmrin SUB qəbuledici,1 əmrindən yeganə fərqi ondadır ki, əməliyyatın nəticəsi CF bayrağına təsir göstərmir.

Misallar:

a) DEC EBX ; EBX registrindəki ikiqat sözü 
; 1 vahid azaldır

b) DEC mer ; mer adlı yaddaş xanasının 
; qiymətini 1 vahid azaldır

Bu əmrlər qrupuna NEG əmri də daxildir. NEG əmri operandı tamamlayıcı koda çevirir (işarəsini dəyişdirir) və aşağıdakı yazılış formatına malikdir:

NEG operand

Bu əmr operandı (reqistr və ya dəyişən) sıfırdan çıxır və nəticəni ilkin operanda yazır. Əgər operand sıfırdırsa, onda CF bayrağı sıfır, əks halda 1 vəziyyətinə gətirilir. NEG əmrindən işarəni dəyişdirmək üçün istifadə etmək olar. Məsələn:

NEG AX ; (AX) işarəsini dəyişmək

ADD AX, 211 ; (AX)=211–(AX)

NEG əmrindən mütləq ədədi almaq üçün də istifadə etmək olar:

again: NEG EAX ; işarəni dəyişmək və əgər
; işarə mənfidirsə
JS again ; daha bir dəfə birinci əmrə keçmək

SUB və NEG əmrlərinin tətbiqinə yuxardakı (4-5) çıxma alqoritminin proqram fraqmentində baxaq :

MASM
MODEL SMALL
.STACK 256
.DATA 
a          DB 4
b          DB 5
.CODE
main:
...
        XOR AX, AX
        MOV AL, a
        SUB  AL, b
        JNC m1       ;Əgər köçürmə yoxdursa, 
                             ; onda   m1 nişanına 
                             ; keçmək 
        NEG AL     ; AL –də nəticənin modulu
m1: ...

Bu misalda nəticə tamamlayıcı kodda alınır (mənfidir). Nəticəni normal formaya (onun modulunu almaq) çevirmək üçün NEG AL əmri tətbiq olunur. Nəticənin mənfi olması CF bayrağının köməyi ilə qeyd olunur. Baxdığımız halda CF=1 olacaq.

İşarəli ikilik ədədlərin çıxılmasında yalnız CF bayrağının qiymətini deyil, eyni zamanda operandın böyük mərtəbəsinin (işarə) vəziyyətini qeyd edən, OF daşma bayrağının vəziyyətini də nəzərə almaq lazımdır. Əgər iki müxtəlif işarəli ədədlərin çıxılmasının nəticəsi operandların qiymətlər diapazonundan kənara çıxırsa, onda OF bayrağı 1 vəziyyətinə gətirilir.