Assembler proqramlaşdırma dili

Sətr elementinin akkumulyatora yüklənməsi

Sətr elementinin akkumulyatora yüklənməsi

Sətrdən elementi götürüb onu AL / AX / EAX akkumulyator_ registirdə yerləşdirmək ücün mikroprosessorun dörd əmrindən istifadə olunur. Bu əməliyyatda əvvəlcə axtarılan element (skanlaşma əmirlərin köməyi ilə) tapılır. Axtarılan elementin mümkün ölçüsü tədbiq olunan əmrə görə təyin olunur. İstifadə olunan əmrlərdərdən biri bir operandlı qalanları isə operandsız əmrlərdir.

Akkumulyatora yükləmə əmrləri aşağıdakılardır:

LODS mənbənin_ünvanı ; (LoaD Strinq- sətrin yüklənməsi)

Bu əmr, sətrdən elementi AL/AX/ EAX akkumulyator_ registrinə yükləyir.

LODSB ( LoaD Strinq Bute ) əmri, baytı sətrdən AL registirinə yükləyir.

LODSW (LoaD Strinq word ) əmri, sözü sətrdən AX registrinə yükləyir.

LODSD ( LoaD Strinq double word ) əmri, ikiqat sözü sətrdən EAX registrnə yükləyir.

Əmrin icrasından sonra axtarılan element ölçüsündən asılı olaraq AL/AX/EAX registrinə yüklənir.

Burada da əvvəlki paraqraflarda göstərilən əmrlərdə olduğu kimi bir operandlı LODS mənbənin_ünvanı sətrin yüklənməsi əmri translyasiya zamanı elementin ölçüsündən asılı olaraq translyator tərəfindən bu əmrin analoqu olan operandsız LODSB, LODSW , LODSD maşın əmrlərindən birinə çevirilir.

LODS əmrində mənbənin_ünvanı əsasən verilənlər seqmentində təyin olunmuş sətirin ünvanıdır. Bu əmrin işləməsi zamanı əvvəlcə sətrdən akkumulyatora göndəriləcək element SCAS əmrinin köməyi ilə tapılır (Proqramın məntiqindən asılı olaraq bu əmrdə prefiksdən istifadə olunmayada bilər). Sonra onun ünvanı DS:ESI/SI registrlər cütlüyündə yerləşdirilir və LODS əmrinin köməyi ilə EAX/AX /AL registirinə yüklənir. Bu halda ESI / SI registrinin qiyməti DF bayrağının vəziyyətindən asılı olaraq elementin ölçüsünə uyğun olaraq artırıla (inkrement) və ya azaldıla (dekrement) bilər.

REP prefiksli LODS əmri uzunluğu ECX/CX registrinin qiyməti ilə təyin olunan olan sətrin bütün elementini dövri olaraq akkumulyatora köçürür və nəticədə akkumulyatorda sətrin sonuncu elementi alınır.

Misal. Yaddaşda string1 və string2 bayt sətirlərini müqayisə edib, üst_üstə düşməyən birinci elementi string2 sətrindən AL registrininə yükləməli.

MODEL SMALL
STACK 256
.DATA
string1    DB ”Müqayisə olunan sətr1”,0Ah,0Dh,'$'
string2    DB ” Müqayisə olunan sətr2 ”,0Ah,0Dh,'$'
mes_ok   DB ”uyuşan sətrlər ”,0Ah,0Dh,'$'
mes_find DB ”uyuşmayan element AL”
db 	“registrində”,0Ah,0Dh,'$'
.CODE
	ASSUME DS:@DATA,ES:@DATA
main:
	MOV AX,@DATA
	MOV DS,AX
	MOV ES,AX
	MOV AH,09h
	LEA DX,string1
	INT 21h
	LEA DX,string2
	INT 21h
	CLD
	LEA DI,string1
	LEA SI,string2
	MOV CX,22
REPE	CMPS string1,string2
	JCXZ beraber
	JMP beraber_deyil
beraber:
	MOV AH,09h
	LEA DX,mes_ok
	INT 21h
	JMP exit
beraber_deyil:
	MOV AH,09h
	LEA DX,mes_find
	INT 21h
	DEC SI
	LODS string2
exit:
	MOV AX,4C00h
	INT 21h
END	main

Qeyd edək ki, LODSB (LOaD String Byte – bayt sətrin yüklənməsi), LODSW (LOaD String söz sətrin yüklənməsi) və LODSD (LOaD String Double word – ikiqat söz sətrin yüklənməsi, Word –i80386) əmrləri sətrdən uyğun olaraq baytı AL, sözü AX, ikiqat sözü EAX registrlərinə yükləyir.