Qiymətlərin qaytarılması və təyini əməliyyatları
əməliyyatları
Qiymətlərin qaytarılması əməliyyatları proqramdakı dəyişənlər və nişanlar haqqında informasiya verir.
Ünvan sayğacı – əməliyyatı, ($) dollar işarəsi ilə işarə olunur, cari qiyməti ünvan sayğacına qaytarır. Assembler translyatoru ilkin proqramda bu simvola rast gəldikdə, onun yerinə ünvan sayğacının cari qiymətini yerləşdirir. Məsələn:
message DB ‘bu sətrlər’
messagel EQU $ - message
Assembler, message sətrindəki simvolların sayını (0Ah) təyin edir və onu messagel sabitinə mənsub etdirir. Bu halda yaddaşı aşağıdakı kimi təsvir etmək olar:
seg <ifadə>
əməliyyatı ifadə üçün seqmentin fiziki ünvanını qaytarır. İfadə kimi nişan, dəyişən, seqment adı, qrupun adı və ya simvolik ad ola bilər.
offset <ifadə>
əməliyyatı ifadə-nin yerləşdiyi seqmentdə onun başlanğıcına nisbətən baytlarla sürüşməsinin qiymətinin alınmasını təmin edir.
Məsələn:
a)
MOV AX, SEG A1
MOV BX, OFFSET A1
1-ci əmr ilə A1 dəyişəni yerləşən blokun nömrəsi AX registrinə, 2-ci əmr ilə A1 dəyişənin bloka nəzərən sürüşməsinin qiymətini BX registrinə yazır.
b)
.data sahe DW 5 … .CODE MOV ES,SEG sahe MOV AX,OFFSET sahe
ES:AX registrlər cütlüyünə sahedəyişənin tam ünvanı yüklənir (baza və sürüşmənin qiymətini)
type əməliyyatı verilənin tipinə uyğun ədədi qiyməti qaytarır.
style="float:left" />
Burada –2-FAR, -1-NEAR, 1-DB, 2-DW, ... , 8-QWORD, 10-TBYTE-nı göstərir.
PTR əməliyyatı nişan və ya dəyişənin tipini təyin etmək və ya dəqiqləşdirmək üçün tətbiq olunur və aşağıdakı kimi yazılır:
<tip > PTR <ifadə >
Burada <tip > aşağıdakı qiymətlərdən birini ala bilər: BYTE (1 bayt), WORD (2 bayt), DWORD (4 bayt ), FWORD (6 bayt ), QWORD (8 bayt ), TBYTE (10 bayt ), NEAR (yaxın nişan), FAR (uzaq nişan) ola bilər.
PTR əməliyyatını misallar üzərində izah edək.
Misallar:
1) d_wrd DD 0 ... mov AL, BYTE PRT d_wrd+1
AL registrinə ikiqat sözün ikinci baytını göndərir.
Bu proqram fraqmentini izah edək. Təyinata görə d_wrd dəyişəni ikiqat söz uzunluğundadır və yaddaşda 4 bayt sahə tutur:
Dəyişən üçün ayrılmış bütün sahəyə deyil, onun hər hansı baytına (məsələn, ikinci baytına) necə müraciət etmək olar?
Əgər yuxarıdıkı MOV əmri yerinə MOV AL , d_wrd+1 əmri olsa idi, onda translyator operandların tipinin eyni olmaması məlumatını verərdi. PRT əməliyyatı əmrdə verilənin tipini dəyişərək, əmrin icra olunmasına imkan yaradır.
2) word_tab DW 100 DUP (?) ... first_byte EQU BYTE PTR word_tab əməliyyatları nəticəsində word_tab-nin birinci baytına first_byte adı veriləcəkdir. 3) fip DW 0 ... MOV BYTE PTR (fip+1), 0FFh
Bu fraqmentdə fip sahəsi word tipli olmasına baxmayaraq, translyatora onu bayt kimi qəbul etməsi məlumatını veririk və ikinci operandın effektiv ünvanını fip+1 sürüşməsindən hesablamağa məcbur edirik. Beləliklə fip sahəsinin ikinci baytına müraciət etmiş oluruq.
4) əğər proqramda
start: MOV CX, 100
sətri olarsa, onda start nişanı NEAR atributuna malik olur ki, bu da həmin seqmentdə yerləşən keçid əmri ilə ona müraciət etməyə imkan verir. Bu nişana başqa seqmentdəki əmrlə müraciət edilərsə, onda nişan FAR atributu ilə təyin olunmalıdır. Yəni
far_start EQU FAR PTR start
Beləliklə, başqa seqmentdən start nişanlı operatora müraciət etmək üçün, keçid əmrində far_start nişanını göstərmək lazımdır.
: - əməliyyatı segmentin yenidən təyin edilməsi əməliyyatdır. Əməliyyatın yazılışı aşağıdakı kimidir:
< seqment_ reg >: <ünvan ifadə >
< nişan >
< dəyişən >
Bildiyimiz kimi mikroprosessor apparat səviyyəsində kod, stek və verilənlər segmentlərini dəstəkləyir. Mikroprosessor növbəti əmrin icra üçün seçilməsi zamanı mütləq CS registrinin məzmununu nəzərdən keçirir. Bu registrdə əmrlər segmentin fiziki başlanğıc ünvanı yerləşir. Sumaya görə verilənlərin ünvanının təyini üçün seqment registri kimi DS götürülür. Yəni, sürüşmənin qiyməti BX, Sİ və ya Dİ registrləri ilə təyin edilərsə baza registri kimi DS seçilir. Operandın ünvanı SP və ya BP registrlərində yerləşərsə mikroprosessor avtomatik olaraq baza registri kimi SS regstrini seçir.
DS:, ES:, SS:, FS: və GS:
segment registrlərini dəyişən əməliyyatları nişanın segment atributunu dəyişdirməyə imkan verir. Məsələn:
MOV AX, ES:[BP]
Burada mənbəninin sürüşmə ünvanını BP registrində yerləşməsinə baxmayaraq operand stek seqmentindən deyil, ES (əlavə) seqmentindən seçiləcəkdir.
This əməliyyatı ünvan sabiti yaradır. Bu sabitin atributu BYTE və ya WORD və yaxud NEAR, FAR məsafə atributları olur. Bu əməliyyatlardan sonra gələn əmrin ünvanı bu əmrin ünvanı ilə eynidir. Məsələn:
K2 EQU THİS BYTE K1 DW ?
1-ci əmr ünvan sabiti yaradır və bu sabitin qiyməti sonrakı K1 dəyişəninin ünvanına bərabər olur. Bunu PTR əmri ilə də yerinə yetirmək olar:
K2 EQU BYTE PTR K1
THİS əməliyyatı ilə əmrə FAR atributu vermək olar. Yuxarıda yazdığımız əmri aşağıdakı kimi göstərmək olar:
A1 EQU THİS FAR
MOV AX, K1
Burada MOV əmri FAR atributu alır. Bu əmrə başqa seqmentlərdən də müraciət etmək olar.
length - əməliyyatı dup direktivi ilə təyin edilən dəyişənlər üçün ehtiyata alınmış sahələrin sayını qaytarır. Məsələn:
A1 DW 50 DUP(?)
MOV AX, LENGTH A1
əmrlərinin icrasından sonra AX registrində 50 qiyməti olacaq.
size- əməliyyatı isə dup direktivi ilə təyin edilən dəyişənlər üçün ehtiyata alınmış sahələrin baytlarla uzunluğunu qaytarır.
Məsələn:
A2 DW 50 DUP (?)
MOV AX, SİZE A2
əmrlərinin icrasından sonra AX registrində 100 qiyməti olacaq.
HIGH və LOWəməliyyatları 16 –tı bitlik ifadənin uyğun olaraq böyük və kiçik baytının qiymətini qaytarır. Məsələn, əgər
const EQU 0ABCDh
direktivi ilə təyin olunubsa, onda
MOV AH, HIGH const
əmri AH registrinə 0ABh qiymətini yükləyəcəkdir.
İndeksləmə əməliyyatı - əməliyyat kvadrat mötərizə ilə işarə olunur və aşağıdakı formada göstərilir:
İfadə_1 [ İfadə_2]
Bu cür yazılışı translyator, İfadə_1-in qiyməti ilə mötərizədəki İfadə_2-nin qiymətinin toplanmasına göstəriş kimi qəbul edir.Yazılışda İfadə_1 parametri iştirak etməyə də bilər.
Misal:
a)
MOV AX, mas[SI]
əmri ilə mas+[SI] ünvanından söz AX registrinə göndərilir.
mas+[SI] yazılışı mas dəyişənin ünvanı ilə SI registrinin məzmunu toplanması (sürüşmənin təyini) deməkdir.
b)
MOV CX, WORD PTR [DI]
(DI) ünvanındakı sözü CX registrinə göndərir
v)
MOV DWORD PTR [SI], 0
DS:(SI) kimi təyin olan unvanından 4 bayta sıfr yazmaq