-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlab5.asm
217 lines (201 loc) · 4.32 KB
/
lab5.asm
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
in_sym macro
mov ah, 01h
int 21h
sub al, '0'
xor ah, ah
endm
out_sym macro
mov ah, 02h
int 21h
endm
out_str macro
mov ah,9
int 21h
endm
.model tiny
.code
org 80h
cmd_length db ?
cmd_line db ?
org 100h
start:
cld
mov bp, sp
mov cl, cmd_length
mov cx, -1
mov di, offset cmd_line
find_param:
mov al, ' '
repz scasb
dec di
push di
inc word ptr argc
mov si, di
scan_params:
lodsb
cmp al, 0Dh
je params_ended
cmp al, 20h
jne scan_params
dec si
mov byte ptr [si], 0
mov di, si
inc di
jmp short find_param
params_ended:
dec si
mov byte ptr [si], 0
mov cx, 2
cmp cx, wp argc
je skip1
lea dx, msg5
out_str
jmp exit
skip1:
xor si, si
pop dx
push dx
mov ah, 3Dh
mov al, 00h
int 21h
jnc input_num
lea dx, msg3
out_str
jmp exit
input_num:
mov cx, ax ;сохраняем идентификатор файла в cx
pop ax
pop bx
push ax
push cx
xor ax,ax
mov di, bx
xor ch,ch
mov cl, 5
mov si,10
xor bh,bh
call input_number
mov len, ax
cmp bp, 333
jne skip5
lea dx, msg6
out_str
jmp exit
skip5:
pop bx ;идентификатор файла в bx
xor bp, bp
xor si, si
read_data:
mov cx, 10000
mov dx,offset buffer
mov ah,3Fh
int 21h
jc close_file
mov cx,ax
jcxz close_file
call find_str
jmp short read_data
close_file:
mov ah,3Eh
int 21h
output_number:
lea dx, msg2
out_str
mov ax, si
call ShowUInt16
jmp exit
ShowUInt16 proc
mov bx, 10 ;делитель (основание системы счисления)
mov cx, 5 ;количество выводимых цифр
@@div:
xor dx, dx ;делим (dx:ax) на bx
div bx
add dl, '0' ;преобразуем остаток деления в символ цифры
push dx ;и сохраняем его в стеке
loop @@div ;да - повторить цикл выделения цифры
mov cx, 5
@@show:
mov ah, 02h ;функция ah=02h int 21h - вывести символ из dl на экран
pop dx ;извлекаем из стека очередную цифру
int 21h ;и выводим её на экран
loop @@show ;и так поступаем столько раз, сколько нашли цифр в числе (cx) pop bx
ret
endp
exit:
mov ah,3Eh
int 21h
int 20h
new_line proc
mov dl, 0Ah
out_sym
mov dl, 0Dh
out_sym
xor bp, bp
ret
endp
input_number proc
m1:
cmp byte ptr [di], 0
je end_inp_num
mul si
mov bl,[di]
cmp bl, 30h
jl err_msg
cmp bl, 39h
jg err_msg
sub bl,30h
add ax,bx
inc di
loop m1
end_inp_num:
ret
jmp skip3
err_msg:
mov bp, 333
ret
skip3:
endp
find_str proc
push di
push dx
push cx
mov dx, wp border_size
lea di, buffer
loop1:
cmp byte ptr [di], 0Dh
je next1
cmp byte ptr [di], 0Ah
je next
inc dx
jmp next
next1:
mov ax, dx
xor dx, dx
cmp ax, len
jge next
cmp ax, 0
je next
inc si
next:
inc di
loop loop1
mov word ptr border_size, dx
xor ax,ax
pop cx
pop dx
pop di
ret
endp
argc dw 0
wp equ word ptr
len dw 0
border_size dw 0
buffer db 10000 dup(0)
;f_name db 'file.txt',0
msg1 db 0Dh, 0Ah,"Vvedite dlinu stroki",0Dh, 0Ah,'$'
msg2 db 0Dh, 0Ah,"Chislo strok = ",'$'
msg3 db 0Dh, 0Ah,"Fail ne naiden!",0Dh, 0Ah,'$'
msg4 db 0Dh, 0Ah,"Makcimalnaya dlina stroki < 50 symb!!",0Dh, 0Ah,'$'
msg5 db 0Dh, 0Ah,"Kol-vo argumentov dolzhno byt 2!!!",0Dh, 0Ah,'$'
msg6 db 0Dh, 0Ah,"Invalid argument!!!",0Dh, 0Ah,'$'
end start