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