Assembler proqramlaşdırma dili

Klaviaturadan daxil etmənin təşkili

Klaviaturadan daxil etmənin təşkili

21h kəsilməsinin müxtəlif funksiyaları bilavasitə simvolları klaviaturadan daxil etmək və ya klaviaturanın buferindən artıq formalaşmış simvollar ardıcıllığını oxu-maq əməliyyatlarını yerinə yetirməyə imkan verir. Klaviaturadan daxil olunan simvolları ekranda əks etdir-mək və ya etdirməmək olar. 21h kəsilməsinin 1h funksiyası simvolun klaviaturadan daxil olmasını gözləyir və həm də onu ekranda əks etdirir. Məsələn:

MOV ah, 1
İNT 21h

Bu funksiyanın giriş registrləri yoxdur. Bu iki əmrin icrasının nəticəsində proqram klaviaturadan düymənin sıxılmasını gözləyir. Bundan sonra hər hansı düymə sıxıl-dıqda kursorun dayandığı cari mövqedən ekranda bu simvol əks olunacaq və daxil edilən simvolun kodu AL registrinə yazılacaqdır. Məsələn: klaviaturadan ‘1’ simvolu daxil edilibsə, AL registrinə 31h (çünkü ‘1’ işarəsinin ASCİİ kodlar cədvəlindəki kodu 31h-dır) yazılacaq və ekranda ‘1’ işarəsi əks olunacaq.

7h və 8h funksiyaları da 1h funksiyasına analoji işləyir. Lakin onlar 1h funksiyasından fərqli olaraq daxil olan simvolu ekranda əks etdirmir. 8h funksiyası 7h funksiyasından fərqli olaraq Ctrl+Break düymələrinin sıxılmasını yoxlayır.

Klaviaturadan simvollar sətrini daxil etmək üçün ya simvol –simvol daxil etmə dövründən ya da 21h kəsilməsinin 0Ah funksiyasından istifadə olunur. Bu funksiya klaviaturadan daxil olunan simvollar sətrini ekranda əks etdirir və həm də onun üçün təyin edilmiş yaddaş sahəsinə yazır. 0Ah funksiyası 254-ə qədər simvolları daxil etməyə imkan verir. Daxil olan sətr simvollarının daxil edilməsi dövrü “enter” (↵ ) düyməsi sıxılana qədər davam edir.

Bu funksiyadan istifadə etmək üçün verilənlər seqmen-tində sətr üçün yer ayırmaq lazımdır. Ayırılmış baytlar blokunda blokun uzunluğu sətrdəki simvolların maksimal sayından iki bayt çox olmalıdır. Blokun birinci baytında sətrlərin maksimal uzunluğu göstərilməlidir. Məsələn, 100 simvoldan ibarət sətr üçün yer ayırmaq lazım gəldikdə verilənlər seqmentində aşağıdakı direktivi göstərmək lazımdır:

Str1 DB 100,101 DUP(?).

Daxil edilən sətr yaddaşda yerləşir və onun ünvanı əvvəlcə-dən DX registrinə yüklənməlidir. Məsələn:

LEA DX,str1
 MOV AH,0Ah
 INT 21h
Maksimal uzunluğu 100 simvoldan ibarət sətrin daxil edilməsi proqramı aşağıdakı kimi göstərilə bilər:
MASM
MODEL SMALL
.STACK 256
.DATA
str1  DB 100,101 DUP(?)
.CODE
start:
MOV AX,@DATA
MOV DS,AX
LEA DX, str1  ; str1 sətrinin ünvanın DX registrinə 
; yüklmək
MOV AH,0Ah  ; 0Ah funksiyasını DX registrinə 
; göndərmək
INT 21h
MOV AX,4C00h
INT 21h
END start

0Ah funksiyası daxil edilən sətr simvollarının sayını (karetkanın qaytarılmasını nəzərə almadan) ayrılmış sahənin ikinci baytında (sayğac) saxlayır. Qeyd edək ki, bütün daxil etmə funksiyaları ASCİİ koduna əsaslanır. Əgər “test” sözünü daxil etsək onda yaddaş sahəsi aşağıdakı kimi təsvir olunacaq:

Yuxarıda deyildiyi kimi daxil edilən simvollar ASCİİ kodlarında olur. Belə daxil edilən ədədi verilənlər üzərində hesab əməliyyatlarını aparmaq üçün onlar ikilik kodlara çevrilməlidirlər. İkilik kodlara çevrilmə üsullarından birinin alqoritmi aşağıdakı proqram ilə həyata keçrilmişdir.

Əvvəlcə 21h kəsilməsinin funksiyalarından istifadə edə-rək 10-luq tam verilənin klaviaturadan daxil edilməsini təşkil edən proqramı nəzərdən keçirək. Proseduradan isti-fadə etməzdən əvvəl müəyyən hazırlıq işdəri görülməlidir. Yəni, əsas proqramda daxil edilən rəqəmlərin sayını saxlamaq üçün STR11 dəyişənini DW direktivi ilə təyin etməliyik. Rəqəmlər daxil ediləcək sahənin ünvanını isə BX registrinə LEA əmri ilə yükləməliyik. Sonra isə CALL KLAVD əmrindən istifadə edə bilərik.

MASM
MODEL SMALL 
.STACK 100h
.DATA
.CODE
MAİN:
	MOV AX, @DATA
	MOV DS, AX  
PUBLIC  KLAVD
	EXTRN STR11:WORD
KLAVD    PROC FAR
	PUSH CX
	PUSH DX
PUSH AX
	PASH Sİ
SUB CX,CX
SUB SI,SI
	MOV CX,6
DAX:  MOV AH,8
	INT 21H
	CMP AL,0DH
JE GURTAR
	CMP AL,'-'
JNE A1
	CMP SI,0
JE A2
JMP DAX
A1:   CMP AL,'0'
JL DAX
	CMP AL,'9'
JG DAX
	CMP SI,0
JNE A2
	DEC CX
A2:   MOV [BX][SI],AL
	MOV DL,AL
	MOV AH,2
	INT 21H
	INC SI
 	LOOP DAX
GURTAR: 
MOV STR11, Sİ
	POP Sİ
	POP AX
POP DX
	POP CX
	RET

KLAVD    ENDP
END MAİN

Daxil edilmiş 10-luq ədədi aşağıdakı proqram vasitəsi ilə 2-lik ədədə çevirə bilərik. Bu proqramı icra etməzdən əvvəl müəyyən hazırlıq işləri görək. Yəni, emal olunacaq simvollar sayı iki baytlıq STR11 dəyişənində olmalıdır və emalın nəticəsinin yazılacağı sahənin ünvanı BX registrinə yazılmalıdır.

MASM 
MODEL  SMALL 
.STACK 100H
.DATA
.CODE
MAIN:
	MOV AX,@DATA
	MOV DS, AX  
PUBLIC CON1
	EXTRN UGU:FAR,MES2:BYTE,REZ:WORD, STR11:WORD
CON1	PROC FAR
	PUSH AX
	PUSH CX
	PUSH DX
PUSH Dİ
	PUSH Sİ 
	PUSH BX
	MOV CX, STR11
SUB Dİ, Dİ
	MOV SI,10
DEV:  MOV AX,DI
	MUL SI
	MOV DI,AX
	SUB AH,AH
	MOV AL,[BX]
	CMP AL,'-'
JE MENFI
	SUB AL,30H
	ADD DI,AX
MENFI:  
INC BX
LOOP DEV
	CMP DI,32767
JBE DYZ
	MOV AH,9
	LEA DX,MES2
	INT 21H
JMP UGU
DYZ:    
SUB SI,SI
	POP BX
CMP BYTE PTR[BX][SI],'-'
JNE SON
	NEG DI
SON:  MOV REZ,DI
	POP SI
POP DI
	POP DX
	POP CX
	POP AX
	RET
CON1 	ENDP
END MAİN