Assembler proqramlaşdırma dili

Sətrlərə ardıcıl baxış əmrləri

Sətrlərə ardıcıl baxış əmrləri

Sətr elementlərinə ardıcıl baxış (sətrlərin skanlaşması) əməliyyatlarını icra edən əmrlər bayt, söz və ya ikiqat söz uzunluğunda elementlər ardıcıllığından təşkil olunmuş yaddaşda

yeriləşən sətr elementlərindən axtarılan qiymətinin tapılması əməliyyatlarını icra edir. Sətr ES registri ilə ünvanlaşdırılan əlavə seqmentdə yerləşdirilir. Axtarılacaq qiymət əvvəlcədən AL/AX/EAX registrində yüklənir. Kon-kret registrin seçilməsi axtarış aparılacaq sətr elementinin ölçüsünə əsaslanır.

SCAS (SCAning String –sətrin skanlaşması) əmri, sətrə ardıcıl baxış əməliyyatını icra edir və ümumi şəkildə:

SCAS sətr_qəbuledici

kimi yazılır.

Sətr_qəbuledinin ünvanı əvvəlcədən ES:EDI/DI registrlərində yerləşdirilir. Translyasiya zamanı translyator verilənlər seqmentindəki sətr_qəbuledinin tipini (elementin ölçüsünü) analiz edərək onu bu əmrin analoqu olan aşağıdakı üç operandsız maşın əmrindən birinə çevirir: SCASB (SCAning String Byte – bayt sətrinin skanlaşması), SCASW (SCAning String Word – söz sətrinin skanlaşması), SCASD (SCAning String Double word –ikiqat söz sətrinin skanlaşması, i80386). Əgər sətr db, dw və ya dD direktivlərinin köməyilə təyin olunubsa, onda axtarılan element uyğun olaraq AL, AX və ya EAX registrlərində olmalıdır və sətrə baxış isə uyğun olaraq SCASB, SCASW və ya SCASD əmrləri ilə icra olunur. Axtarışın aparılması zamanı akkumulyator registrin məzmunundan sətrin növbəti elementi çıxılır və çıxmanın nəticəsindən asılı olaraq ZF, SF və OF bayraqlarının qiyməti tənzimlənir. Əmrin icrasından sonra operandların məzmunu dəyişməz qalır.

SCAS əmri liə birlikdə repe/repz və ya repne/repnz prefikslərindən dövrü skanlaşma əməliyyatını aparmaq daha əlverişlidir. repe/repz pre­fiksli SCAS əmrindən akkumulyator registrindəki (al/ax/eax) verilmiş qiymətdən fərqli sətr elementinin tapılması prosesində istifadə olunur.

repNe/repNz prefiksli SCAS əmrindən isə ak­kumulyator registrdəki (al/ax/eax) verilmiş qiymət ilə üst-üstə düşən sətr elementinin axtarılması və tapılması prosesində istifadə olunur.

Məsələn, aşağıdakı əmrlər ardıcıllığının köməyi ilə sətr_1 bayt sətrinin 20 elementinə baxmaq və kodu 21h (boşluq işarəsinin kodu) olan elementlərin tapılmasının proqram fraqmenti verilmişdir:

	  CLD
	  LEA DI,ES:str_1;str_1 sətrinin birinci baytının ;ünvanının yüklənməsi
	  MOV AL,21h ; AL registrinə '' (boşluq) işarəsinin 
                                         ;kodu yüklənir 
	   MOV CX,20
 REPNE SCAS str_1         ; və ya REPNE SCASB 
	JE found

İndi isə string sətrində ‘A’ simvolunun tapılması proqramına baxaq:
MODEL SMALL
STACK 256
.DATA
message1  DB 0Ah,0Dh,'Cimvol  tapılıb $'
message2  DB 0Ah,0Dh,'Cimvol tapılmayıb $'
string          DB 'Bu bir satirdir $'
  .CODE
	ASSUME DS:@data,ES:@DATA
main:
	MOV AX,@DATA
	MOV DS,AX
	MOV ES,AX
	MOV AH,09h     ;simvol axtarılan sətri ,
	LEA DX,string    ; ekrana
	INT 21h             ; çıxarmaq
	MOV AL,'A'       ; axtarılan simvolu  AL 
                                                            ;göndərmək
	CLD
	LEA DI,string
	MOV CX,15
REPNE	SCAS string
	JE found       ; Əgər 'A' simvolu tapılıbsa,
                                                     ; found nişanına keçid 
	MOV AH,09h             ;simvol tapılmayıb mesajını
	LEA DX,message2    ; ekrana çıxarmaq və 
	INT 21h
	JMP exit                     ; sona çatmaq
found:
	MOV AH,09h            ; tapılmış simvolu
	LEA DX,message1   ; ekrana çıxarmaq
	INT 21h
exit:
	MOV AX,4C00h
	INT 21h
END  main

Nəticə kimi qeyd edək ki, SCAS əmri ilə sətr elementlərinin ölçüsündən asılı olaraq SCASB, SCASW, SCASD əmrlərindən istifadə etmək olar.