Надо только переделать, чтобы массив можно было вводить, скажем, вот так:
1 -4 44
4 4 1
1 1 1
То есть, чтобы пробелы разделяли числа
Вот, что у меня получилось (в результате выходят нули)
Кликните здесь для просмотра всего текста
Assembler | 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
| .model small
.stack 100h
.data
msg_p db "",10,13,'$'
Mas dw 3 dup (?)
dw 3 dup (?)
dw 3 dup (?)
len db 9 ;кол-во элементов массива
min dw 1 dup (?)
max dw 1 dup (?)
minnum dw 1 dup (?)
maxnum dw 1 dup (?)
buff db 12,13 dup (?)
.code
jmp main
InInt proc
push cx
push dx
push bx
push si
push di
; обрабатываем содержимое буфера
nach: cmp byte ptr [si],' '
jz prop
cmp byte ptr [si],"-" ; если первый символ минус
jnz ii1
mov di,1 ; устанавливаем флаг
inc si ; и пропускаем его
jmp ii1
prop: inc si
jmp nach
ii1:
xor ax,ax
mov bx,10 ; основание системы счичления
ii2:
mov cl,[si] ; берем символ из буфера
cmp byte ptr [si],' '
jz prop3
; это замыкающий 0?
jmp ww
prop3: dec si
mov cl,[si]
add si,2
jmp tuda
ww: cmp cl,0dh
jz ii3 ; завершаем разбор числа
; если это не замыкающий 0, то проверяем его на правильность
tuda:
cmp cl,'0' ; символ < 0
jl endin
cmp cl,'9' ; символ > 9
ja endin ; на этом разбор числа заканчивается
sub cl,'0' ; делаем из символа число
mul bx ; умножаем на 10
add ax,cx ; прибавляем к остальным
inc si ; указатель на следующий символ
jmp ii2 ; повторяем
; все символы из буфера обработаны число находится в ax
endin:
cmp di,1 ; если установлен флаг, то
jnz ii3
neg ax ; делаем число отрицательным
pop bx
mov mas[bx],ax
add bx,2
push bx
jmp nach
ii3:
pop di
pop si
pop dx
pop cx
pop bx
ret
InInt endp
Show_AX proc
mov cx, 10 ; cx - основание системы счисления
xor di, di ; di - кол. цифр в числе
; если число в ax отрицательное, то
;1) напечатать '-'
;2) сделать ax положительным
or ax, ax
jns @@Conv
push ax
mov dx, '-'
mov ah, 2 ; ah - функция вывода символа на экран
int 21h
pop ax
neg ax
@@Conv:
xor dx, dx
div cx ; dl = num mod 10
add dl, '0' ; перевод в символьный формат
inc di
push dx ; складываем в стэк
or ax, ax
jnz @@Conv
; выводим из стэка на экран
@@Show:
pop dx ; dl = очередной символ
mov ah, 2 ; ah - функция вывода символа на экран
int 21h
dec di ; повторяем пока di<>0
jnz @@Show
ret
Show_AX endp
main:
mov ax, @data ;ds = сегмент .data
mov ds, ax
xor ax,ax ;ax=0
Xor bx,bx ;инициализация индексного регистра
Mov cx, 3 ;инициализация счетчика цикла
cycl1:
push cx
mov ah,0ah
mov dx,offset buff ; адрес буфера
int 21h ; принимаем строку
mov si,offset buff+2 ; готовим параметр для процедуры интерпретации
mov bx,0
call InInt ; переводим введенную строку в число
mov ah,9 ;номер функции для вывода строки
mov dx,OFFSET msg_p
int 21h
pop cx
loop cycl1
mov cx,9
xor si,si
mov ax,mas[si]
mov max,ax
cycl2:
push cx
mov ax,max
cmp ax,mas[si]
jl maxel
jmp prop1
maxel:
mov ax,mas[si]
mov max,ax
mov maxnum,si
prop1:
add si,2
pop cx
loop cycl2
mov ax, maxnum
mov bh,2
div bh
mov ah,0
call Show_AX
mov ah,9 ;номер функции для вывода строки
mov dx,OFFSET msg_p
int 21h
mov ax, max
call Show_Ax
mov ah,9 ;номер функции для вывода строки
mov dx,OFFSET msg_p
int 21h
mov cx,9
xor si,si
mov ax,mas[si]
mov min,ax
cycl3:
push cx
mov ax,min
cmp ax,mas[si]
jg minel
jmp prop2
minel:
mov ax,mas[si]
mov min,ax
mov minnum,si
prop2:
add si,2
pop cx
loop cycl3
mov ax, minnum
mov bh,2
div bh
call Show_AX
mov ah,9 ;номер функции для вывода строки
mov dx,OFFSET msg_p
int 21h
mov ax, min
call Show_AX
mov ah,4ch
int 21h
end main |
|
Добавлено через 8 часов 51 минуту
Помогите найти ошибку. Смотрел через turbo debugger, так вроде даже команда записи чисел в массив срабатывает, но в результате все равно выдаются нули
Кликните здесь для просмотра всего текста
Assembler | 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
| .model small
.stack 100h
.data
msg_p db "",10,13,'$'
Mas dw 3 dup (?)
dw 3 dup (?)
dw 3 dup (?)
len db 9 ;кол-во элементов массива
min dw 1 dup (?)
max dw 1 dup (?)
minnum dw 1 dup (?)
maxnum dw 1 dup (?)
buff db 12,13 dup (?)
.code
jmp main
InInt proc
push cx
push dx
push bx
push si
push di
; обрабатываем содержимое буфера
nach: cmp byte ptr [si],' '
jz prop
cmp byte ptr [si],"-" ; если первый символ минус
jnz ii1
mov di,1 ; устанавливаем флаг
inc si ; и пропускаем его
jmp ii1
prop: inc si
jmp nach
ii1:
xor ax,ax
mov bx,10 ; основание системы счичления
ii2:
mov cl,[si] ; берем символ из буфера
cmp cl,' '
jz endin
ww: cmp cl,0dh
jz endin ; завершаем разбор числа
; если это не замыкающий 0, то проверяем его на правильность
tuda:
cmp cl,'0' ; символ < 0
jl endin
cmp cl,'9' ; символ > 9
ja endin ; на этом разбор числа заканчивается
sub cl,'0' ; делаем из символа число
mul bx ; умножаем на 10
add ax,cx ; прибавляем к остальным
inc si ; указатель на следующий символ
jmp ii2 ; повторяем
; все символы из буфера обработаны число находится в ax
endin:
cmp di,1 ; если установлен флаг, то
jnz suda
neg ax
suda: ; делаем число отрицательным
pop bx
mov mas[bx],ax
add bx,2
push bx
mov cl,[si]
cmp cl,0dh
jz ii3
jmp nach
ii3:
pop di
pop si
pop dx
pop cx
pop bx
ret
InInt endp
Show_AX proc
mov cx, 10 ; cx - основание системы счисления
xor di, di ; di - кол. цифр в числе
; если число в ax отрицательное, то
;1) напечатать '-'
;2) сделать ax положительным
or ax, ax
jns @@Conv
push ax
mov dx, '-'
mov ah, 2 ; ah - функция вывода символа на экран
int 21h
pop ax
neg ax
@@Conv:
xor dx, dx
div cx ; dl = num mod 10
add dl, '0' ; перевод в символьный формат
inc di
push dx ; складываем в стэк
or ax, ax
jnz @@Conv
; выводим из стэка на экран
@@Show:
pop dx ; dl = очередной символ
mov ah, 2 ; ah - функция вывода символа на экран
int 21h
dec di ; повторяем пока di<>0
jnz @@Show
ret
Show_AX endp
main:
mov ax, @data ;ds = сегмент .data
mov ds, ax
xor ax,ax ;ax=0
Xor bx,bx ;инициализация индексного регистра
Mov cx, 3 ;инициализация счетчика цикла
cycl1:
push cx
mov ah,0ah
mov dx,offset buff ; адрес буфера
int 21h ; принимаем строку
mov si,offset buff+2 ; готовим параметр для процедуры интерпретации
mov bx,0
call InInt ; переводим введенную строку в число
mov ah,9 ;номер функции для вывода строки
mov dx,OFFSET msg_p
int 21h
pop cx
loop cycl1
mov cx,9
xor si,si
mov ax,mas[si]
mov max,ax
cycl2:
push cx
mov ax,max
cmp ax,mas[si]
jl maxel
jmp prop1
maxel:
mov ax,mas[si]
mov max,ax
mov maxnum,si
prop1:
add si,2
pop cx
loop cycl2
mov ax, maxnum
mov bh,2
div bh
mov ah,0
call Show_AX
mov ah,9 ;номер функции для вывода строки
mov dx,OFFSET msg_p
int 21h
mov ax, max
call Show_Ax
mov ah,9 ;номер функции для вывода строки
mov dx,OFFSET msg_p
int 21h
mov cx,9
xor si,si
mov ax,mas[si]
mov min,ax
cycl3:
push cx
mov ax,min
cmp ax,mas[si]
jg minel
jmp prop2
minel:
mov ax,mas[si]
mov min,ax
mov minnum,si
prop2:
add si,2
pop cx
loop cycl3
mov ax, minnum
mov bh,2
div bh
call Show_AX
mov ah,9 ;номер функции для вывода строки
mov dx,OFFSET msg_p
int 21h
mov ax, min
call Show_AX
mov ah,4ch
int 21h
end main |
|
0
|