Программа коды:
Процедураларды жазу (ішкі программаларды) Call ungetch
Ungetch proc
Ungetch endp
Ungetch – процедураның аты Call – ішкі программаны шақыру Proc– procedure – процедура
endp– end procedure – процедураның соңы
178
90-сурет. Программаның орындалу нәтижесі коды
INT 16h, AH = 02h, 12h, 22h – пернетақтаның жағдайын оқу
Енгізу
|
АН = 02h (83/84-key), 12h (101/102-key), 22h (122-key)
|
Шығару
|
AL = пернетақта жағдайының байты 1
АН = 2 пернетақта жағдайының байты (12h және 22h)
|
Пернетақта жағдайының байты 1 (бұл байт жадыдағы келесі адрес бойынша орналасқан 0000h: 0417h немесе 0040h: 0017h):
7 бит: Ins қосылған
6 бит: CapsLock қосылған 5 бит: NumLock қосылған 4 бит: ScrollLock қосылған
3 бит: Alt батырмасы басылған
2 бит: Ctrl батырмасы басылған (кез келген Ctrl) 1 бит: сол жақ Shift батырмасы басылған
0 бит: оң жақ Shift батырмасы басылған
DOS ОЖ құралдары
0Ah функциясы – STDIN-нен буферге символдар жолын оқу
179
Енгізу
|
АН = 0Ah
DS: DX = буфер адресі
|
Шығару
|
Буфер енгізілген жолдан тұрады
|
Ондық санды оналтылық санға түрлендіретін программаның мысалын қарастырамыз
1
|
2
|
org 100h
|
; СОМ-файлдың басталуы
|
start:
|
; программа кодының басталу белгісі
|
mov dx,offset messagel
|
; DS: DX – жол адресі
|
mov ah,9
|
; АН регистріндегі функция нөмірі
|
int 21h
|
; message1
|
mov dx,offset buffer
|
; DS: DX – жол адресі
|
mov ah,0Ah
|
; АН регистріндегі функция нөмірі
|
int 21h
|
; символдар жолын буферге оқу
|
mov dx,offset crlf
|
; DS: DX – жол адресі
|
mov ah,9
|
; АН регистріндегі функция нөмірі
|
int 21h
|
; жолды ауыстыру
|
xor di,di
|
; DI = 0 – буфердегі байт нөмірі
|
xor ax,ax
|
; АХ = 0 – нәтиженің ағымдағы мәні
|
mov cl,blength
| |
xor ch,ch
|
; ch регистрін нөлге айналдырамыз
|
xor bx,bx
|
; bx регистрін нөлге айналдырамыз
|
mov si,cx
|
; SI – буфер ұзындығы
|
mov cl,10
|
; CL = 10, MUL-дың көбейткіші
|
asc2hex:
|
; asc2hex: блогының басталу белгісі
|
mov bl,byte ptr bcontents [di]
| |
sub bl,'0'
|
; цифр = цифрдың коды – «0» символының коды
|
jb asc_error
|
; егер символдың коды«0»-дің кодынан кіші болса
|
cmp bl,9
|
; немесе «9»-дан үлкен болса
|
ja asc_error
|
; программаны қате деген хабарламамен аяқтау
|
mul cx
|
; басқа жағдайдаағымдағы нәтижені 10-ға көбейту
|
add ax,bx
|
; оған жаңа цифрды қосу
|
inc di
|
; санағышты арттыру
|
180
1
|
2
|
cmp di,si
|
; егер санағыш+1 символдар санынан аз болса
|
jb asc2hex
|
; жалғастыру (санағыш 0 деп есептеледі)
|
push ax
|
; түрлендіру нәтижесін сақтау
|
mov ah,9
|
; АН регистріндегі функция нөмірі
|
mov dx,offset message2
|
; DS: DX – жолдар адресі
|
int 21h
|
; message 2 енгізу
|
pop ax
|
; стектен оқу
|
push ax
|
; стекке жазу
|
xchg ah,al
|
; AL регисріне үлкен байтты орналастыру
|
call print_al
|
; оны экранға шығару
|
pop ax
|
; AL регистрінде кіші байтты қалыпқа келтіру
|
call print_al
|
; оны экранға шығару
|
ret
|
; СОМ-файлды аяқтау
|
asc_error:
|
; asc_error: блогының басталуы
|
mov dx,offset err_msg
|
; DS: DX – жол адресі
|
mov ah,9
|
; АН регистріндегі функция нөмірі
|
int 21h
|
; қате туралы хабарлама шығару
|
ret
|
; программаны аяқтау
|
print_al:
|
; print_al: блогының басталу белгісі
|
mov dh,al
|
; dh-ке al регистрінің мәнін сақтау
|
and dh,0Fh
|
; DH – 4 кіші биті
|
shr al,4
|
; AL – үлкен биттері
|
call print_nibble
|
; үлкен цифрды шығару
|
mov al,dh
|
; AL-де 4 кіші бит сақтаулы
|
print_nibble:
|
; 4 битті шығару процесдурасы (оналтылық санның)
|
cmp al,10
|
; AL
|
sbb al,69h
|
; ASCII-кодына сәйкес
|
das
|
; (DAS командасының сипаттамасын қарау)
|
mov dl,al
|
; DL-дегі символ коды
|
mov ah,2
|
; АН-дегі функция нөмірі
|
int 21h
|
; символды шығару
|
ret
|
; RET екі рет жұмыс істейді – бірінші рет үлкен цифрға шақырылған print_nibble процедурасынан қайтқанда, екінші рет – print_al процедурасынан қайтқанда
|
91-сурет. Программаның орындалу нәтижесі
181
1
|
2
|
messagel db "Ондық сан: $"
|
; шығарылатын мәліметтерден тұратын жол
|
message2 db "Оналтылық сан: $"
|
; шығарылатын мәліметтерден тұратын жол
|
err_msg db "Енгізу қатесі"
|
; шығарылатын мәліметтерден тұратын жол
|
crlf db 0Dh,0Ah,
|
; шығарылатын мәліметтерден тұратын жол
|
Buffer db 6
|
; енгізу буферінің максималды буфері
|
blength db?
|
; оқығаннан кейінгі буфер өлшемі
|
bcontents:
|
; буфердегі мәліметтер СОМ-файлдың соңынан ке- йін орналасады
|
end start
|
; программа кодының аяқталу белгісі
|
Программаның коды және орындалу барысы:
182
0Ah функциясы ыңғайлы, бірақ мәліметтерді енгізудің шек- телген әдісі болып табылады. Әдетте, әр символды жеке енгізе- тін функциялар жиі қолданылады, олар символдардың экранда бейнеленуін, программаның функционалды және басқарушы ба- тырмаларға өзгерісін және т.с.с. бақылап отырады.
Бақылау сұрақтары:
- DIV, PUSH, POP, SHL, TEST командалардың жұмысын сипаттаңыз.
- Стекке орналастырылған сандардың қайда орналасқанын анықтаңыз.
- SHL dx,1 және SHL dx, cl командаларының өзара айырмашылығы?
Зертханалық жұмыс барысында көрсетілген мысалдарды іске асырып, регистрлердің қолданылу ерекшеліктерін көрсетіңіз.
Батырма
|
Код
|
Батырма
|
Код
|
Батырма
|
Код
|
Батырма
|
Код
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
Esc
|
01h
|
Enter
|
1Ch
|
K*
|
37h
|
Ins
|
52h
|
1!
|
02h
|
Ctrl
|
1Dh
|
Alt
|
38h
|
Del
|
53h
|
2 @
|
03h
|
A
|
1Eh
|
SP
|
39h
|
SysRq
|
54h
|
3 #
|
04h
|
S
|
1Fh
|
Caps
|
3Ah
|
Macro
|
56h
|
4 $
|
05h
|
D
|
20h
|
F1
|
3Bh
|
F11
|
57h
|
5%
|
06h
|
F
|
21h
|
F2
|
3Ch
|
F12
|
58h
|
6 ^
|
07h
|
G
|
22h
|
F3
|
3Dh
|
PA1
|
5Ah
|
7 &
|
08h
|
СЫЗБА
|
23h
|
F4
|
3Eh
|
F13/LWin
|
5Bh
|
8 *
|
09h
|
J
|
24h
|
F5
|
3Fh
|
F14/RWin
|
5Ch
|
9 (
|
0Ah
|
K
|
25h
|
F6
|
40h
|
F15/Menu
|
5Dh
|
0)
|
0Bh
|
L
|
26h
|
F7
|
41h
|
F16
|
63h
|
- _
|
0Ch
|
;:
|
27h
|
F8
|
42h
|
F17
|
64h
|
= +
|
0Dh
|
сызба "
|
28h
|
F9
|
43h
|
F18
|
65h
|
BS
|
0Eh
|
` ~
|
29h
|
F10
|
44h
|
F19
|
66h
|
Tab
|
0Fh
|
LShift
|
2Ah
|
Num
|
45h
|
F20
|
67h
|
Q
|
10h
|
\ |
|
2Bh
|
Scroll
|
46h
|
F21
|
68h
|
СЫЗБА
|
11h
|
Z
|
2Ch
|
Home
|
47h
|
F22
|
69h
|
E
|
12h
|
X
|
2Dh
|
-
|
48h
|
F23
|
6Ah
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
R
|
13h
|
C
|
3Eh
|
PgUp
|
49h
|
F24
|
6Bh
|
T
|
14h
|
V
|
2Fh
|
K-
|
4Ah
|
EraseEOF
|
6Dh
|
СЫЗБА
|
15h
|
B
|
30h
| |
4Bh
|
Copy/Play
|
6Fh
|
U
|
16h
|
N
|
31h
|
K5
|
4Ch
|
CrSel
|
72h
|
I
|
17h
|
M
|
32h
|
®
|
4Dh
|
Delta
|
73h
|
O
|
18h
|
, <
|
33h
|
K+
|
4Eh
|
ExSel
|
74h
|
P
|
19h
|
. >
|
34h
|
End
|
4Fh
|
Clear
|
76h
|
[{
|
1Ah
|
/?
|
35h
|
I
|
50h
| | |
] }
|
1Bh
|
RShift
|
36h
|
PgDn
|
51h
| | |
Достарыңызбен бөлісу: |