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
| model small
.stack 400h
.data
c10 dw 10
c6 equ 6
h db ? ; часы
m db ? ; минуты
s db ? ; секунды
massiv dw 10 dup(?)
msg1 db 13,10,"Vvedite 10 chisel cherez probel razmernost'u 000...255 ",13,10, "Posle najmite enter", 13,10,"$"
msg2 db 13,10,"Maksimal'noe chislo = $"
msg3 db 13,10,"Massiv: "
msg4 db 13,10,"Vremya: "
msg5 db 13,10,"Yazik programmirovania: Assembler"
msg6 db ":"
msg7 db 13,10,"Rezultat zapisan v fail << rezult.txt >>",13,10,"PROBEL dlya vihoda",'$'
f_n db 'prim.txt',0 ; имя файла в который сохранится ответ
w_s db c6 dup (?), ' ' ; строка для вывода цифр в файл
.code
start:
mov ax,@data
mov ds,ax
mov ah,09h ; вывод приглашения для ввода чисел
lea dx,msg1
int 21h
mov di,0 ; в di - max
; Ввод массив с клавиатуры
xor cx,cx ; обнуляем cx
xor dx,dx ; в dx - очередное число
input_loop:
mov ah,01h ; ввод символа
int 21h
cmp al,0dh
je chislo
cmp al,20h ; если пробел
je chislo ; то занести число в массив
sub al,30h ; вычитаем '0'
mov cl,al
mov ax,dx
mul c10 ; умножаем на 10
xor ch,ch
add ax,cx ; добавляем цифру из al
mov dx,ax ; число снова в dx
jmp input_loop ; снова вводим число
chislo:
mov bx,cx
shl bx,1
mov massiv[bx],dx
inc cx
cmp dx,di ; сравниваем число с максиальным
jg maximum ; если оно больше, то jmp на maximum
jmp chislo_cont ; иначе jmp на chislo_cont
maximum:
mov di,dx ; запоминаем максимальное число в di
chislo_cont:
xor dx,dx ; dx в ноль
cmp cx,20
je end_input
cmp al,0dh ; если был нажат enter
je end_input ; то конец ввода
jmp input_loop
end_input:
mov ah,09h ; вывод на экран msg2
lea dx,msg2
int 21h
mov ax,di
call output ; выводим это число
jmp outputfail ; выводим результат в файл
mov ah,4ch ; завершение программы
int 21h
output proc ; процедура вывода числа, находящегосы в ax
xor cx,cx ; счетчик цифр
div_loop:
xor dx,dx ; подготовка к делению
div c10 ; деление
add dx,30h ; в dx - ASCII-код остатка от деления
push dx ; сохраняем его в стеке
inc cx ; инкремент счетчика
cmp ax,0 ; деление, покуда частное не нулевое
je out_loop
jmp div_loop
; Процедура записи времени
time:
mov ah,2Ch ; функция возврата времени
int 21h ; выводим время
mov h,ch ; в h часы
mov m,cl ; в m минуты
mov s,dh ; в s секунды
ret ; возвращаемся к основной программе
out_loop:
pop dx
mov ah,02h ; и выводим его на экран
int 21h
loop out_loop
ret
outputfail:
; Создаём файл
mov ah,3Ch ; функция создания файла в текущем каталоге
lea dx,f_n ; в dx имя создаваемого файла
xor cx,cx ; обнуляем cx
int 21h
mov bx,ax
; Записываем в файл
mov ah,40h ; функция записи в файл
mov cx,msg3-msg2
lea dx,msg2
int 21h ; записываем в файл
mov ax,di ; в ax цифру которую надо вывести
mov ah,40h ; функция записи в файл
mov cx,c6
lea dx,w_s ; в dx адрес буфера, содержащего записываемые данные
int 21h ; записываем в файл
;new
mov ah,40h ; функция записи в файл
mov cx,msg4-msg3 ; число записываемых байтов в cx
lea dx,msg3
int 21h ; записываем в файл
write:
push cx
mov ax,massiv[di] ; записываем в ax элемент массива
mov ah,40h ; функция записи в файл
mov cx,c6+1 ; число записываемых байтов в cx
lea dx,w_s
int 21h
add di,2 ; di+1
pop cx ; извлекаем сx из стека
loop write ; повторяем цикл
mov ah,40h ; функция записи в файл
mov cx,msg5-msg4 ; число записываемых байтов в cx
lea dx,msg4 ; в dx адрес буфера, содержащего записываемые данные
int 21h
call time ; записываем время
mov al,h
mov ah,0
mov ah,40h ; функция записи в файл
mov cx,2
lea dx,w_s+4
int 21h
mov ah,40h
mov cx,msg7-msg6
lea dx,msg6
int 21h
mov al,m
mov ah,0
mov ah,40h ; функция записи в файл
mov cx,2
lea dx,w_s+4
int 21h
mov ah,40h
mov cx,msg7-msg6
lea dx,msg6
int 21h
mov al,s
mov ah,0
mov ah,40h ; функция записи в файл
mov cx,2 ; число записываемых байтов в cx
lea dx,w_s+4
int 21h ; записываем в файл
mov ah,40h
mov cx,msg6-msg5
lea dx,msg5 ; в dx адрес буфера, содержащего записываемые данные
int 21h ; записываем в файл
; Закрываем файл
mov ah,3Eh ; функция записи в файл
int 21h ; закрываем файл
wait_exit:
mov ah,09h ; функция вывода на экран
lea dx,msg7 ; помещаем в dx сообщение, которое надо вывести
int 21h ; прерывание дос (выводит на экран сообщение)
; Закрываем окно программы
spacebar:
mov ah,0 ; записываем в ah 0
int 16h ; принемаем нажатия кнопки клавиатуры
cmp al,20h
jne spacebar
exit:
mov ax,4C00h
int 21h
output endp
end start |