1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
| ;***************************************************************
; Programa pakeicianti dvejetaini skaiciu desimtainiu
;***************************************************************
.model small
buferioDydis EQU 100
.stack 256
.data
bufDydis DB buferioDydis ;kiek maksimaliai simboliu galima nuskaityti
nuskaite DB ? ;cia bus patalpinta, kiek simboliu nuskaityta
buferis DB buferioDydis dup (?) ;cia bus talpinamas nuskaitytas skaicius
;kiti duomenys
kiek DB "Is viso simboliu:$"
nulis DB "Zero$"
vienas DB "One$"
du DB "Two$"
trys DB "Three$"
keturi DB "Four$"
penki DB "Five$"
sesi DB "Six$"
septyni DB "Seven$"
astuoni DB "Eight$"
devyni DB "Nine$"
ivesk DB "Iveskite eilute:$"
enteris DB 13, 10,'$'
rezult DB "Pakeista eilute:$"
empty DB "Nerasta jokiu simboliu $"
klaida DB "KLAIDA! $"
;Pagalbos praneрimas:
help DB "Daemon025", 10, 13,"Informacines technologijos", 10, 13,"I kursas", 10, 13,"1 grupe", 10, 13,"27 uzduotis", 10, 13,"Parasykite programa, kuri ivestoje simboliu eiluteje skaitmenis", 10, 13,"pakeicia zodziais ir atspausdina eilutes ilgi$"
.code
pradzia:
MOV ax, @data ;reikalinga kiekvienos programos pradюioj
MOV ds, ax ;reikalinga kiekvienos programos pradюioj
MOV ch, 0
MOV cl, [es:0080h] ;programos paleidimo parametru simboliu skaicius raрomas ES 128-ame (80h) baite
CMP cx, 0 ;jei paleidimo parametru nera,
JE Nera ;nereikia nieko tikrinti.
MOV bx, 0081h ;programos paleidimo parametrai raрomi segmente es pradedant 129 (arba 81h) baitu
Ieskok:
CMP [es:bx], '?/' ;atmintyje jaunesnysis baitas saugomas pirmiau,
;todel pirmasis baitas iraрomas i bl, o antrasis i bh.
;taip '/?' virsta '?/'.
JE Yra ;jeigu radau '/?', vadinasi reikia spausdinti praneрimа
INC bx ;neradau '/?' рiuose baituose, paslenku rodyklж ir tikrinu toliau esancius parametrus
LOOP Ieskok ;jei dar nepatikrinti visi parametrai, reikia tikrinti toliau
JMP Nera ;jei patikrinti visi parametrai ir nerastas '/?' reikia baigti programos darbа
;spausdinu i ekranа pagalbos praneрimа
Yra:
MOV ah, 9 ;i ah iraрau dosinio pertraukimo funkcijos numeri
MOV dx, offset help ;i dx iraрau nuorodа i spausdinamo teksto pradюiа
INT 21h ;iрkvieciu dosini pertraukimа - spausdinu praneрimа
JMP pabaiga
Nera:
MOV ah, 9
MOV dx, offset ivesk
INT 21h ;spausdinamas prasymas ivesti eilute
MOV ah, 0Ah
MOV dx, offset bufDydis
INT 21h ;nuskaitoma ivesta eilute
MOV ah, 9
MOV dx, offset enteris ;kursorius nukeliamas i nauja eilute
INT 21h ;kursorius nukeliamas i nauja eilute
MOV cl, nuskaite ;i cl idedama kiek simboliu buvo nuskaityta
CMP cl, 0 ;tikriname ar buvo nuskaityti simboliai
JE tuscia1
JMP next1
tuscia1:
JMP tuscia ;Jei nieko persokame i 'tuscia'
next1:
MOV ah, 9
MOV dx, offset rezult ;rezultato pranesimas
INT 21h
MOV SI, offset buferis
check_s:
CMP byte ptr [si], '0'
JB raide
CMP byte ptr [si], '9'
JA raide
MOV al, byte ptr [si]
CALL Skaitmuo
JMP kitas_simbolis
raide:
MOV ah, 2
MOV dx, [SI]
INT 21h
kitas_simbolis:
INC SI
LOOP check_s
MOV ah, 9
MOV dx, offset enteris ;kursorius nukeliamas i nauja eilute
INT 21h ;kursorius nukeliamas i nauja eilute
MOV cl, nuskaite
LEA dx, kiek
INT 21h
MOV ax, cx
CALL Skaiciuok
JMP pabaiga ;persokame i progarmos pabaiga
error:
LEA dx,klaida ;pranesimas apie klaida
INT 21h
JMP pabaiga
tuscia:
MOV ah, 9
MOV dx, offset empty ;pranesimas apie tuscia buferi
INT 21h
pabaiga:
MOV ah, 4Ch ;reikalinga kiekvienos programos pabaigoj
MOV al, 0 ;reikalinga kiekvienos programos pabaigoj
INT 21h
;----------------------------------------------------------------------------------
; Spausdinsime pakeista skaitmeni
;----------------------------------------------------------------------------------
PROC Skaitmuo
MOV ah, 9
CMP al, '0' ;tikriname ar simbolis yra '0'
JE L0
CMP al, '1' ;tikriname ar simbolis yra '1'
JE L1
CMP al, '2' ;tikriname ar simbolis yra '2'
JE L2
CMP al, '3' ;tikriname ar simbolis yra '3'
JE L3
CMP al, '4' ;tikriname ar simbolis yra '4'
JE L4
CMP al, '5' ;tikriname ar simbolis yra '5'
JE L5
CMP al, '6' ;tikriname ar simbolis yra '6'
JE L6
CMP al, '7' ;tikriname ar simbolis yra '7'
JE L7
CMP al, '8' ;tikriname ar simbolis yra '8'
JE L8
CMP al, '9' ;tikriname ar simbolis yra '9'
JE L9
L0:
LEA dx, nulis
INT 21h
JMP next
L1:
LEA dx, vienas
INT 21h
JMP next
L2:
LEA dx, du
INT 21h
JMP next
L3:
LEA dx, trys
INT 21h
JMP next
L4:
LEA dx, keturi
INT 21h
JMP next
L5:
LEA dx, penki
INT 21h
JMP next
L6:
LEA dx, sesi
INT 21h
JMP next
L7:
LEA dx, septyni
INT 21h
JMP next
L8:
LEA dx,astuoni
INT 21h
JMP next
L9:
LEA dx, devyni
INT 21h
next:
RET
Skaitmuo ENDP
PROC Skaiciuok
;Korektiрka procedыra privalo po darbo atstatyti panaudotu registru reikрmes
;Todel prieр tai turime jas kur nors iрsisaugoti
;Patogiausia tai daryti steke
PUSH ax
PUSH cx
PUSH dx
MOV cx, 10 ;kadangi naudojam deрimtainж sistemа, tai dalinsim iр 10
PUSH "$$" ;kad spausdindami skaitmenis iр steko, galetume rasti pabaigа
Dalink:
MOV dx, 0 ;tiesiog iрvalom registrа, nes jis dalyvaus dalyboje
DIV cx ;[DX,AX]:10 = AX(liek DX)
PUSH dx ;idedam skaitmeni i stekа; deja, negalime ideti 1 baito
CMP ax, 0 ;ar dar neperskaiteme viso skaiciaus?
JA Dalink ;jei ne, skaitom toliau
;pradedam skaiciaus spausdinimа
MOV ah, 2 ;i AH irasom simbolio spausdinimo dosines funkcijos numeri
Spausdink:
POP dx ;isimam skaitmeni is steko
CMP dx, "$$" ;ar isspausdinome visа skaiciu?
JE Finish ;jei taip, reikia baigti darbа
ADD dl, '0' ;liekanos jaunesnysis baitas - tai vienas skaitmuo; prideje simbolini 0 iр skaiciaus (pvz.: 1) gausime simboli ('1')
INT 21h ;jei ne, spausdinam skaitmeni
JMP Spausdink ;spausdink kitа skaitmeni
Finish:
;Turime atstatyti iрsaugotu registru reikрmes
POP dx
POP cx
POP ax
RET ;grizimo is proceduros komanda
Skaiciuok ENDP ;reikalinga kiekvienos proceduros pabaigoj
END pradzia |