İ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
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:
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.