İkilik vurma əmrləri
İşarəsiz ədədləri vurmaq üçün mikroprosessorun əmrlər sistemində MUL (MULtiply) əmri mövcuddur. Bu əmrin yazılış formatı aşağıdakı kimidir:
MUL vuruq_1
Göründüyü kimi bu əmr bir operandlı əmrdir. İkinci operand isə qeyri aşkar şəkildə verilir. Burada vuruq_1 kimi registr və ya dəyişən, vuruq _2 kimi isə mütləq AL, AX və ya EAX registrlərinin məzmunu göturulur.
MUL əmri icra olunduqda vuruq_1-in məzmunu (registr və ya dəyişən), vuruq_1–in ölçüsündən asılı olaraqAL, AX və ya EAX registrlərində yerləşən vuruq_2-nin məzmununa vurulur və nəticə uyğun olaraq AX, DX:AX, EDX:EAXregistrlər cütlüyündə yerləşdirilir.
Operandların yerləşməsi, onların ölçüsü və həmçinin, vurmanın nəticəsi aşağıdakı cədvəldə göstərilmişdir:
Vurmanın nəticəsinin birinci registrdə yerləşməsi və ya ikinci registrə keçməsi şərtini, mikroprosessor cf və of bayraqlarının qiymətinə görə müəyyənləşdirilir:
– əgər CF və OF bayraqlarının qiyməti sıfır isə onda nəticənin böyük hisəsi sıfırdır. Yəni, nəticə bir registrdə (məsələn baytla işlədikdə AL registrində) yerləşir;
– əgər CF və OF bayraqlarının qiyməti sıfırdan fərqli isə (CF=1 və OF=1) onda nəticənin böyük hisəsi sıfır deyil və bu da nəticənin bir registrdə yerləşmədiyini göstərir. Yəni, nəticə bir cüt uyğun registrlərdə (məsələn, baytla işlədikdə nəticə AH:AL registrlər cütlüyündə) yerləşir və bu gələcək əməliyyatlarda nəzərə alınmalıdır.
Misal. 59 və 11 ədədlərinin vurulması proqramına baxaq:
MASM MODEL SMALL .STACK 256 .DATA rez LABEL WORD rez_lo DB 59 rez_hi DB 0 .CODE main: MOV AX, @DATA MOV DS,AX XOR AX,AX MOV AL,11 MUL rez_lo JNC m1 ; əgər daşma yoxdursa, ; onda m1nişanına kesid MOV rez_hi,AH ; nəticənin böyük hissəsi ; rez_hi-də yazılır m1: MOV rez_lo,AL MOV AX,4C00h INT 21h END main
Bu proqramda MUL rez_lo əmri rez_lo-nun məzmununu (59), AL (11) registrinin məzmununa vurur. rez_lo adlı yaddaş xanası bayt uzunluğundadır. Vurmanın nəticəsinin kiçik hissəsi AL-də, böyük hissəsi isə AH registrində yerləşəcəkdir. JNC m1 şərti keçid əmri CF bayrağının qiymətini analiz edir. Əgər CF=0 olarsa, nəticə AL registrində tam yerləşir və AH registrinin mərtəbələrinin qiyməti sıfır olur. Əgər CF=1 olarsa, MOV rez_hi,AH əmri ilə rez_hi sahəsinə nəticənin böyük hissəsi göndərilir.
MOV rez_lo,AL əmri rez_lo sahəsinə nəticənin kiçik hissəsini göndərir.
Qeyd edək ki, bu proqramın verilənlər seqmentində sadəlik üçün söz uzunluğunda rez simvolik adlı və bayt uzunluğunda rez_lo simvolik adlı ünvanı təyin edilmişdir. Burada əsas məqsəd, əgər vurmanın nəticəsi kiçik registrdə yerləşərsə, AL registrinin məzmununu rez_lo ünvanına, əks halda isə rez ünvanına yazmaqdır.
İşarəli ədədləri vurmaq üçün IMUL (Integer MULtiply) əmrindən istifadə olunur. Operandların sayına görə IMUL əmri üç yazılış formasına malikdir:
1) IMUL vuruq_1
2) IMUL vuruq_1 , vuruq_2 ; (i80386)
3) IMUL qəbuledici, vuruq_1 , vuruq_2 ; (i80186)
IMUL əmri işarəli iki tam ikilik ədədin vurulması əməliyyatını yerinə yetirir. Bu əmr də mul əmri kimi icra olunur. IMUL əmri MUL əmrindən yalnız, işarə mərtəbəsinin nəzərə alınması ilə fəqlənir.
Əmrin işləmə alqoritmi istifadə olunan əmrin formatından asılıdır. Bir operandlı əmrdə, yalnız, bir vuruğun yerləşdiyi sahəni aşkar şəkildə göstərmək tələb olunur. Bu vuruq yaddaş xanasında və ya registrdə yerləşdirilə bilər. İkinci vuruq, birinci vuruğun ölçüsündən asılı olaraq, mütləq xüsusi registrdə yerləşdirilməlidir.
- əgər operand (vuruq_1 bayt uzunluqda olduqda) əmrdə bayt kimi göstərilibsə, ikinci vuruq AL registrində;
- əgər operand əmrdə söz kimi göstərilibsə, ikinci vuruq AX registrində;
- əgər, operand əmrdə ikiqat söz kimi göstərilibsə, ikinci vuruq EAX registrində yerləşdirilməlidir.
Əmrin nəticəsi, yuxarda göstərilən hallara uyğun olaraq, mütləq AX, DX:AX və ya EDX:EAX registrlər cütlüyündə yerləşdirilir.
İki və üç operanqdlı əmrlərdə vuruqların yerləşdirilməsi, birmənalı, aşağıdakı formada olur:
- iki operandlı əmrdə birinci operand birinci vuruğun yerini, ikinci operand isə ikinci vuruğun yerini təyin edir və əmrin icrasından sonra nəticə birinci operandda yazılır. Üç operandlı əmrlərdə birinci operandda nəticə, ikinci operandda vuruq_1, üçüncü operandda isə bayt, söz və ya ikiqat söz uzunluğunda verilmiş ədədi qiymət ola bilər.
Əgər AH və AL ( qəbuledici bayt uzunluğunda olduqda), DX və AX (söz uzunluğunda olduqda), EDX və EAX (ikiqat söz uzunluğunda olduqda) registrlərinin məzmununun işarələri eynidirsə, CF və OF bayraqlarının qiyməti 0, əks halda isə 1 olur.
imul əmri icra olunarkən, əgər nəticə kiçik olub, kiçik registrdə yerləşərsə (yəni cf=of=0 olarsa), onda böyük registrin bütün mərtəbələri kiçik registrin işarə mərtəbəsinin qiyməti ilə doldurulur. Əks halda (əgər cf=of=1 olarsa) böyük registrin böyük biti nəticənin işarə mərtəbəsi qəbul olunur, kiçik registrin işarə mərtəbəsində isə nəticənin uyğun bitinin qiyməti olur.
Misallar:
a) IMUL DX, perem,11AAh ; perem (söz) dəyişənin ; qiyməti 11AAh ədədinə ; vurulur nəticə DX : registrində yerləşdirilir. b) IMUL CX,1F1 ; CX –dəki söz 1F12h ; ədədinə vurulur. nəticə : CX yerləşdirilir v) IMUL EBX, ECX, 55h ; ECX ikiqat söz 55h ; ədədinə vurulur, : nəticə EBX yerləşdirilir. q) IMUL mem1 Bu əmrə görə mem1 dəyişənin AL, AX qiyməti və ya və ya EAX (mem1–in ölçüsündən asılı olaraq ) mem1 məzmununa vurulur. Nəticə uyğun olaraq AX, DX:AX və ya EDX:EAX yerləşdirilir. d) IMUL AX, mem2
Sonuncu əmrə görə AX registrin məzmunu mem2 (söz) dəyişəninə vurulur və nəticə AX yerləşdirilir..