Assembler proqramlaşdırma dili

Sətrin göndərilməsi

Sətrin göndərilməsi

MOVS ( MOVe String- sətrin göndərilməsi ) əmri bayt, söz və ya ikiqat söz uzunluqlu operandın məzmunu mənbədən qəbulediciyə köçürür. Əmrin ümumi formatı aşağıdakı kimidlr.

MOVS sətr_qəbuledici , sətr_mənbə

Sətr elementlərinin ünvanı əvvəlcədən aşağıdakı registrlərdə yerləşdirilməlidir:

- mənbənin ünvanı - DS:ESI/SI registrlər cütlüyündə (susmaya görə DS registrində) ;

qəbuledicinin ünvanı - ES:EDI/DI registrlər cütlüyündə. Köçürülən elementlərin ölçüsünü Assembler qəbuledici və mənbənin yaddaş sahəsini göstərən atributlarının iden­tifi­katoruna görə tə’yin edir. Yəni, əgər bu identfikator DB ilə tə’yin olunubsa baytı, DW ilə tə’yin olunubsa sözü və ya DD ilə tə’yin olunubsa ikiqat sözü köçürür.

MOVS əmri yalnız bir elementi mənbədən qəbulediciyə köçürür. Ancaq bu əmrin qarşısında REP prefiksindən istifadə olunarsa, onda bir əmrlə 64k bayt (əgər seqmentdə ünvanın ölçüsü 16 bit - USE16- dırsa) və ya 4Q bayta (əgər seqmentdə ünvanın ölçüsü 32 bit-USE32- dirsə) qədər verlənləri köçürmək olar. Köçürülən elementlərin sayı CX (USE16) və ya ECX (USE32) registrlərində yerləşdirilməlidir.

MOVS əmrinin köməyi ilə yaddaşın bir sahəsindən elementlər ardıcıllığını yaddaşın başqa bir sahəsinə köçürmək üçün proqramda aşağıdakı əməliyyatları yerinə yetirmək lazımdır:

1. Dövrdə elementlərin emal olunma istiqamətinə (ünvanın artması və ya azalması) uyğun olaraq DF bayrağının qiymətini tənzimləmək;

2. Sətrin yaddaş ünvan göstəricisini DS:ESI (DS: SI), ES:EDI (ES: DI) registrlər cütlüyünə yükləmək;

3. Emal olunacaq elementlərin sayını ECX/CX registrinə yükləmək;

4. MOVS əmrinin əvvəlinə REP prefiksini yazmaq.

Bu ardıcıllığı bütün sətr əmrlərinə aid etmək olar. İndi isə bir sətr elementlərini digərinə göndərilməsi proqramına baxaq:

1.  
;hər iki sətr eyni bir verilənlər seqmentində yerləşir
MASM
MODEL    COMPACT
STACK    256
.DATA
source   DB ” Köçürülən  sətr  ”,'$'       ; mənbə_sətr
dest     DB 18 DUP(” ”)                    ; qəbuledici_sətr 
.CODE
	ASSUME DS:@DATA, ES:@DATA
main:
	MOV AX,@DATA 
	MOV DS,AX       ;  DS və ES registrlərinə
	MOV ES,AX       ;verilənlər seqmentinin ünvanının 
                                ;yüklənməsi 
	CLD         ; DF tənzimləmək: sətrləri başlanğıcdan
                           ; sona  doğru emal etmək
	LEA SI,source  mənbə_sətr sürüşdürməsinin DS:SI
                                    ;registrlər cütlüyünə yüklənməsi
	LEA DI,dest        ; qəbuledici_sətr sürüşdürməsinin 
                               ;DS:DI registrlər cütlüyünə yüklənməsi
	MOV CX,18       ; REP üçün təkrarlanma sayının 
                               ; (sətrlərin uzunluğu) 
                               ; CX sayğac registrinə yüklənməsi
REP 	MOVS dest,source  ; sətrlərin göndərilməsi
LEA DX,dest ; dest  ünvanını DX registrinə yükləmək və
    MOV AH,09h      ; ekrana çıxarmaq
    INT       21H
    MOV    AX, 4C00H
    INT     21H
END   MAIN

Translyasiya zamanı operandların tipindən asılı olaraq, translyator MOVS əmrini analoqu olan aşağıdakı üç operandsız maşın əmrlərindən birinə çevirəcəkdir.

MOVSB ( MOVE String Byte - baytların göndərilməsi ) ;
MOVSW (MOVE String Word - sözlərin göndərilməsi); 
MOVSD (MOVE String Duble Word- ikiqat sözün göndərilməsi, i80386).

Bunları nəzərə alsaq, əvvəlki proqramda göstərilən REP MOVS dest,source əmrini translyator REP MOVSB əmrinə çevirir.

Göstərilən dörd əmrin hər biri üçün sətrin ünvanı əvvəlcədən ESI/SI və EDI/DI registrlərinə yüklənməlidir. Sətrin göndərilməsi əmrlərinə aid daha bir neçə misal göstərək:

2. Əvvəlki proqramı sətrlərin yaddaşın müxtəlif seqmentlərdə yerləşməsi şərti daxilində tərtib etməli

MASM
MODEL    COMPACT
.STACK    256
.FARDATA menbe
source DB ”  Köçürülən  sətr ”,'$' 
.FARDATA netice
dest	 DB 18 DUP(” ”)
.CODE
	ASSUME DS: mənbə, ES: netice
main:
	MOV AX, menbe
	MOV DS,AX
	MOV AX, netice
	MOV ES,AX
	CLD
	LEA SI,source
	LEA DI,dest   
	MOV CX,18    
REP	MOVS dest,source
	LEA DX,dest
	MOV AH,09h        
	INT 21h
	MOV AX,4C00h
	INT 21h
END	main

Proqramparın anlizi göstərir ki, birinci proqramda sətr_qəbuledici və sətr_mənbə data adlı eyni bir seqmentdə yerləşdiyindən hər iki DS və ES registrlərinə eyni data seqmentinin ünvanı, ikinci proqramda isə sətr_qəbuledici və sətr_mənbə iki müxtəlif FARDATA menbe və FARDATA netice adlı seqmentlərdə yerləşdiyindən DS və ES registrlərinə uyğun olaraq bu seqmentlərin ünvanı yüklənir. 3. Verilən seqmentində yerləşən A1 sətrindən 30 simvolu (baytları), əlavə verilənlər seqmentində yerləşən A2 sətrinə göndərilməsinin proqram fraqmenti:

CLD 
LEA SI, A1
LEA Dİ, ES:A2
MOV CX, 30
REP MOVS

4. Adətən SI registri ilə verilənlər seqmenti ünvanlaşdırılır, ancaq seqmenti dəyişdirmə prefiksinin köməyi ilə mənbə operandda başqa sementdən istifadə etmək olar:

LEA SI,ES:A1
LEA DI,ES:A2
MOVSB

Burada hər iki sətr əlavə seqmentdə yerləşir.

5. İki sətrin verlənlər seqmentinə köçürülməsi. İki sətrin verlənlər seqmentində köçürülməsi üçün DS verlənlər seqmenti registrinin əvvəlki qiymətini ES əlavə verlənlər seqment registrinə yükləmək lazımdır. Bu cür yanaşmada prosessor adi qayda ilə sətri verlənlər seqmentindən əlavə verlənlər seqmentinə köçürəcəkdir.

Fərz edək ki, hər iki sətr verilənlər seqmentində yerləşdirilib. Bu halda A1 sətrindən 30 baytın A2 sətrinə göndərilməsinin proqram fraqmentini aşağıdakı kimi göstərmək olar:

PUSH  DS          
POP     ES
CLD
LEA     SI , A1
LEA     DI , A2
MOV    CX, 30
REP      MOVSB

Beləliklə, ES əlavə verlənlər seqment registrinin qiyməti elə DS verlənlər seqmenti registrinin qiyməti olacaqdır.