Assembler proqramlaşdırma dili

PUSH və POP əmrləri

PUSH və POP əmrləri

PUSH və POP əmləri stekə yazma və ya stekdən oxuma əməliyyatlarında istifadə edilir. Stek, proqram verilənlərinin müvəqqəti saxlandığı yaddaş sahəsidir. Bu zaman SP registri ilə stekin zirvəsinin ünvanı təyin edilir. Əmrlərin ümumi yazılışı aşağıdakı kimidir:

PUSH mənbə

POP qəbuledici

PUSH əmri ilə 1, 2, və ya 4 bayt uzunluqlu registrlərin məzmunu və ya yaddaş ünvanındakı məzmunu stek yaddaşın zirvəsinə yazılır. Mənbə kimi ümumi təyinatlı registr, seqment registri, bilavasitə operand (ədəd) və ya dəyişəni götürmək olar. Məsələn:

PUSH DS ; DS məzmununu stekin zirvəsinə yazılır.

PUSH K1 ; K1 ünvanındakı məlumat stekin

; zirvəsinə yazılır.

POP K1;stekin zirvəsindəki məlumat K1 yaddaşına yazılır.

POP DS ; stekin zirvəsindəki məlumatı ; DS registrinə yazılır.

Proqram verilənlərini müvəqqəti saxlamaq üçün üç registrdən: SS - stek seqmenti, ESP/SP- stek göstəricisi və EBP/BP –stek baza göstəricisi registrlərindən istifadə olunur. Stekin ölçüsü mikroprosessorun iş rejimindən asılı olaraq 64 kb (və ya mühafizə rejimində 4 qb) qədər ola bilər. İstənilən anda yalnız bir stekə müraciət etmək olar ki, onun da ünvanı SS stek seqment registrində yerləşdirilir. Bu cari stek adlanır. Başqa stekə müraciət etmək üçün SS stek seqment registrinə tələb olunan stekin ünvanını yükləmək lazımdır. Mikroprosessor steklə işləyən bütün əmrləri icra edərkən avtomatik olaraq SS stek seqment registrindən istifadə edir.

Steklə işləmənin daha bir neçə xüsusiyyətini qeyd edək:

- verilənləri stekə yazma və oxuma əməliyyatı LIFO (Last In First Out-“axırıncı gəldi birinci getdi”) prinsipinə uyğun olaraq yerinə yetirilir;

- Stekə yazma zamanı stek mümkün maksimal ünvandan kiçik ünvana doğru (yəni, “aşağıdan artma”) artır;

- ESP/SP və EBP/BP registlərindən yaddaşı ünvanlaşdırmaq üçün istifadə etdikdə, Assembler avtomatik olaraq onların məzmunundakı qiyməti SS stek seqment registrindəki ünvana nəzərən sürüşmə ünvanı olduğunu qəbul edir.

Ümumi şəkildə stekin təşkilinin strukturunu aşağıdakı kimi göstərmək olar:

SS, ESP/SP və EBP/BP registrlərindən kompleks istifadə olunmasına baxmayaraq, onların hər birinin ayrıca təyinatı var. Registrlərin hansının ünvanlaşdırma üçün istifadə olunması, seqmentləşdirmədə SEGMENT direktivinin USE16 və USE32 modifikasıyasından asılıdır. ESP/SP registrləri həmişə stekin zirvəsinin ünvanını göstərir. Başqa sözlə, stekə sonuncu daxil edilən elementin sürüşməsi bu registr ilə təyin edilir. Əgər stek boşdursa, ESP registrlərinin qiyməti seqmentin axırıncı baytının ünvanına bərabər olacaqdır.

Stekin başlanğıcı yaddaşın böyük ünvanında yerləşir. Şəkildə bu ünvan SS:FFFF cütlüyü ilə işarə olunub. Burada FFFF sürüşməsi şərti daxil edilib. Onun real qiymətini isə proqramlaşdırıcı öz proqramında, stek seqmentinin təsvirində verir. SS:FFFF ünvan cütlüyünün qiyməti real rejimdə maksimal ölçüsü 64 Kbayt (0FFFFh) olan stek seqmentinin başlanğıcı kimi götürülür.

PUSH əmrinin işləmə alqoritmində (aşağıdakı şəklə bax) aşağıdakı xüsusiyyətləri nəzərə almaq lazımdır:

1. 16 mərtəbəli stek seqmenti üçün SP –nin qiyməti 2 vahid ((SP)=(SP) –2) və ya 32 mərtəbəli stek seqmenti üçün SP –nin qiyməti 4 vahid ((SP)=(SP) –4) azalır;

2. Mənbədəki qiymət SS:SP və ya SS:ESP cütlüyü ilə göstərilən ünvandan yazılır.

Faktiki olaraq PUSH əmri ESP registrinin qiymətini mənbənin baytla ölçüsü (1, 2 və ya 4) qədər azaldır və mənbənin məzmunu yaddaşın SS:(ESP) ünvanına köçürür.

POP əmri stekin zirvəsində yerləşmiş baytı, sözü və ya ikiqat sözü qəbuledicidə yerləşdirir və ESP registrinin qiymətini, uyğun olaraq 1, 2 və ya 4 vahid artırır. Qəbuledici kimi ümumi təyinatlı registrlər, seqment registləri (CS müstəsnə olmaqla) və ya dəyişən götürülə bilər.

POP əmrinin işləmə alqoritmi PUSH əmrinin işləmə alqoritminin əksinədir:

1. Stekin zirvəsinin məzmununu qəbulediciyə yazır;

2. 16 mərtəbəli stek seqmenti üçün SP –nin qiymətini 2 vahid ((SP)=(SP) +2) və ya 32 mərtəbəli stek seqmenti üçün SP –nin qiymətini 4 vahid ((SP)=(SP) +4) artırır.

Qeyd edək ki, PUSH və POP əmrlər cütlüyündən həmişə birlikdə istifadə olunur. Məsələn:

PUSH   DS   ; DS registrinin məzmununu 
               ; stekin zirvəsinə yazılır
PUSH   A    ; A yaddaş xanasının məzmununu 
              ; stekin zirvəsinə yazılır
POP     A     ; stekin zirvəsindəki verilən götürülərək
              ; A yaddaş   xanasına yazılır
POP     DS   ; stekin zirvəsindəki verilən 
              ; götürülərək  DS registrinə yazılır 

Bir seqment registrinin məzmununu başqasına köçürmək üçün aşağıdakı əmrlər ardıcıllığından istifadə etmək olar:

a)    PUSH   CS   ; CS registrinin məzmunu stekin 
                    ; zirvəsinə yazılır
      POP    DS    ; stekin zirvəsindən CS-in məzmunu 
                    ; DS registrinə yazılır və 
                    ; DS registri CS registrinin təyin 
                    ; etdiyi seqmenti göstərəcək.
b)   PUSH DS     ; DS registrinin məzmunu stekin 
                    ; zirvəsinə yazılır
     POP    ES    	;  stekin zirvəsindən DS-in məzmunu 
                    ; ES registrinə yazılır və 
                    ; ES registri DS registrinin təyin 
                    ; etdiyi seqmenti göstərəcək

Qeyd edək ki, stekin daxilindəki istənilən elementinə müraciət etmək üçün EBP registrindən istifadə olunur. Məsələn, lazımi parametrləri stekdə saxlamaq şərti ilə, altproqramdan çıxma prosesi deyilənə əyani misal ola bilər. Bu parametrlərə daxil (onları stekdə yerləşdirdikdən sonra) olmaq üçün stekin zirvəsinin ünvanını EBP (stekin baza göstəricisi) registrində saxlamaq, başqa sözlə, EBP regi­strinə ESP registrinin cari qiymətini yazmaq lazımdır. Əgər altproqramda stekdən lokal dəyişənləri saxlamaq üçün istifadə olunursa, ESP dəyişir, ancaq EBP registrindən stekdən (onların sürüşməsi EBP+parametrin_nömrəsi yazılır) birbaşa parametrlərin qiymətini hesablamaq üçün istifadə etmək olar.

PUSHA (i80186) əmri bütün ümumi təyinatlı registrləri göstərilən ardıcıllıqla stekdə yerləşdirir: AX, CX, DX, BX, SP, BP, SI və DI.

PUSHAD (i80386) əmri eyni qayda ilə EAX, ECX, EDX, EBX, ESP, EBP, ESI və EDI registrlərini stekdə yerləşdirir. Bu halda SP və ESP registrlərinin məzmunu kimi, onların əmrin icrasından əvvəlki qiymətlərindən istifadə olunur. POPA və POPAD əmrlər cütlüyü isə bu registrlərin məzmununu stekdən əks istiqamətdə oxuyur. Bu isə registrlərin öz işinini qurtarana kimi, qiymətini dəyişməyən altproqram (əsasən kəsilmələrin emalı) yazmağa imkan verir. Bu altproqram başlanğıcda PUSHA, sonda isə POPA əmrini çağırır.

POPA (i80186) və POPAD(i80386) əmrləri stekdən ümumi təyinatlı registrlərin məzmunlarını götürür. Başqa sözlə, bu əmrlər tamamilə PUSHA (i80186) və PUSHAD (i80386) əmrlərinin (SP və ESP registrlərinin məzmunu müstəsnə olmaqla) əksi olan əməliyyatı yerinə yetirir POPA əmri stekdən, SI, DI, BP məzmununu və SP qiymətini 2 vahid artırmaqla BX, DX, CX, AX məzmununu götürür. POPAD əmri isə stekdən EDI, ESI, EBP və ESP qiymətini 4 vahid artırmaqla EBX, EDX, ECX, EAX registrlərin məzmunlarını götürür.