Assembler proqramlaşdırma dili

Xətti sürüşdürmə əmrləri

Xətti sürüşdürmə əmrləri

Bu tip əmrlərdə sürüşdürmə zamanı növbəti «sürüşdürülən» bit CF bayrağında yerləşdirilir və bu halda əvvəlki sürüşən bitin qiyməti itir.

Xətti sürüşdürmə əmrləri də iki altqrupa ayrılır:

-məntiqi xətti sürüşdürmə əmrləri;

-hesabi xətti sürüşdürmə əmrləri.

Məntiqi sürüşdürmə əmrləri işarəsiz ədədlər və ya ədədi olmayan verilənlər üzərində, hesabi sürüşdürmə əmrləri isə işarəli ədədlər üzərində əməliyyat zamanı istifadə olunur.

Məntiqi xətti sürüşdürmə əmrlərinə SHL (SHift logical Left- məntiqi sola sürüşdürmə) və SHR (SHift logical Right- məntiqi sağa sürüşdürmə) əmrləri daxildir.

SHL əmri qəbuledicinin məzmununu sayğacın qiyməti ilə təyin olunmuş bitlərin sayı qədər sola sürüşdürür və sağdan kiçik bitin yerinə sıfır yazılır

SHR əmri qəbuledicinin məzmununu, sayğacın qiyməti ilə təyin olunmuş bitlərin sayı qədər sağa sürüşdürür və soldan işarə bitinə sıfır yazılır.

Məsələn, əgər AL registrinin məzmunu 0B4h (və ya 10110100b), CF=1 olarsa,

a) SHL AL,1        ; əmrinin icrasından sonra
                      ; AL=01101000b, CF=1 alınar.
b) SHR AL,1           ; əmrinin icrasından sonra isə
                     ;AL=01011010b, CF=0 alınar.

Məntiqi xətti sürüşdürmə əmrlərinin köməyi ilə işarəsiz ədədləri 2 –nin tərtibinə vurmaq və bölmək olar.

Misal:

MOV CL,3
SHL BX,CL            ;işarəsiz ədəd 8-ə vurulur
SHR BX,CL            ;işarəsiz ədəd 8-ə bölünür.

Aşağıda bcd_num adlı söz uzunluqlu yaddaş sahəsindəki iki qeyri-yığcam BCD ədədini AL registrində yığcam BCD ədədinə çevirən proqram fraqmenti verilmişdir;

...
bcd _num DW 0203h        ; Qeyri yığcam 23 BCD ədədi
...
MOV AX,bcd_num          ; AX=0203h
MOV  CL, 4
SHL AH, CL              ; AH=20h, AL=03h
ADD AL,AH               ; nəticədə: AL=23h

Hesabi xətti sürüşdürmə əmrlərinə SAL (Shift Arithometic Left- hesabi sola sürüşdürmə) və SAR (Shift Aritometic Right-məntiqi sağa sürüşdürmə) əmrləri daxildir və onlar məntiqi sürüşdürmə əmrlərindən fərqli olaraq qəbuledicinin işarə mərtəbəsi ilə xüsusi formada işləyir.

SAL əmri qəbuledicinin məzmununu, sayğacda verilmiş qiymətə görə təyin olunmuş bitlərin sayı qədər sola sürüşdürür. Sağdan kiçik bitin mövqeyinə sıfır yazılır. SAL əmri işarəni saxlamır və yalnız növbəti sürüşdürülən bitdə işarə mərtəbəsinin qiyməti dəyişdikdə, OF bayrağına 1 yazır. SAL əmri SHL əmrinə analoji işləyir.

Misal: fərz edək ki, AL=0AAh (AL=10101010b), köçürmə bayrağı isə CF=0 - dır.

SAL AL,1 ; əmri icra olunduqdan sonra
; AL=01010100b, CF=1, OF=1 olar.

SAR əmri qəbuledicinin məzmununu, sayğacda verilmiş qiymətə görə təyin olunmuş bitlərin sayı qədər sağa sürüşdürür. Bu halda qəbuledicinin işarə bitindən başqa bütün bitlər sürüşdürülür və soldan boşaldılmış bitlər işarə mərtəbəsindəki rəqəm ilə doldurulur. SAR əmri hər növbəti sürüşdürülən mərtəbədən sonra işarəni bərpa edərək saxlayır.

Misal: fərz edək ki, AL=0A8h (AL=10101000b), köçürmə bayrağı isə CF=0 - dır

SAR AL,1      ; əmri icra olunduqdan sonra
              ; AL=11010100b, CF=0, OF=0 olacaq.

Hesabi xətti sürüşdürmə əmrlərinin köməyi ilə işarəli ədədləri 2 –nin tərtibinə vurmaq və bölmək olar.

Misal:
MOV CL,2
SAL AX,CL           ; işarəli ədədi 4-ə vurmaq
SAR AX,CL           ; işarəsli ədədi 4-ə bölmək

Aşağıdakı proqram icra edildikdə ‘0123456789’ sətrindəki işarələrin uyğun 2-lik kodları ekranda əks olunur. Belə nəticə sürüşdürmə və məntiqi əmrlərin tətbiqi ilə alınır.

SSEG	SEGMENT STACK
	DB  256 DUP(?)
SSEG	ENDS         ; stek  seqmentinin sonu
    DATA	SEGMENT 
MESSAGE1 DB 'ILKIN VEILENLER',10,13,'$'
MESSAGE2 DB 'VERILENLERIN UYQUN 2-LIK KODLARI',10,13,'$'
C      DB '0123456789',10,13,'$'
RES    DB ?,' --> ',10 DUP(0),10,13,'$'  
DATA	ENDS           ;verilənlər seqmentinin sonu
     CODE	SEGMENT PARA PUBLIC 'CODE'
	ASSUME CS:COD,SS:SSEG,DS:DAT
START	PROC FAR
	PUSH DS
	PUSH AX
	MOV AX,DAT
	MOV DS,AX
	MOV AX,SSEG
	MOV SS,AX
	CALL MAIN
	RET
START	ENDP
MAIN	PROC NEAR
	MOV AH,9H
	MOV DX, OFFSET MESSAGE1
	INT 21H
	MOV AH,9H
	MOV DX, OFFSET C
	INT 21H
	MOV AH,9H
	MOV DX, OFFSET MESSAGE2
	INT 21H
            MOV SI,0
       MOV AH,0
TEKRAR:   MOV AL,C[SI] 
       MOV RES,AL  
       MOV DI,0 
       MOV CL,8
NEXT:  SHL AX,1
       AND AH,1B 
       ADD AH,30H  
       MOV RES[DI+6],AH
       INC DI    
       LOOP NEXT
       LEA DX,RES      
       MOV AH,9H
       INT 21H 
           INC SI
       CMP SI,10
       JNE TEKRAR 
 	RET
MAIN	ENDP
CODE	ENDS
	END	START