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
210
| .model small
.data
N = 5 ;строк
M = 7 ;столбцов
inpm db 13,10,'Input matrix:$'
msg1 db 13,10,'Matrix:',13,10,'$'
msg2 db 13,10,'New matrix:',13,10,'$'
msg3 db 13,10,'Enter number!$'
str0 db 0dh,0ah,'A($' ;формируемая для вывода строка
str1 db ')= $'
buf db 5,6 dup(0) ;принимает строку, введенную с клавиатуры
A db N*M dup (?)
.stack 256
.code
start:
mov ax,@data ;Настраиваем сегментные регистры
mov ds,ax
mov ah,9 ;функция вывода сообщения на экран
lea dx,inpm ;выводимое сообщение
int 21h ;выводим на экран
;Ввод матрицы
lea bx,A ;начало матрицы
mov cx,1 ;строка
mov di,1 ;столбец
inpmas: mov ah,9 ;функция вывода сообщения на экран
lea dx,str0
int 21h ;выводим на экран
mov ax,cx ;строка
call printdec ;преобразуем номер строки в текст и выводим на экран
mov ah,2 ;ф-я вывода символа
mov dl,',' ;запятая
int 21h ;вывести на экран
mov ax,di ;столбец
call printdec ;выводим на экран
mov ah,9 ;функция вывода сообщения на экран
lea dx,str1
int 21h ;выводим на экран
mov ah,0ah ;функция ввода строки с клавиатуры
mov dx,offset buf ;буфер куда вводить
int 21h ;пользователь вводит в текстовом виде в buf значение элемента массива
lea si,buf[2] ;начало введенного текста
call str2dw ;преобразовываем строку в значение
jnc correct
mov ah,9 ;функция вывода сообщения на экран
lea dx,msg3 ;выводимое сообщение
int 21h ;выводим на экран
jmp inpmas
correct:
mov [bx],al ;заносим значение в массив
inc bx ;следующий элемент
inc di ;номер следующего столбца
cmp di,M ;сравниваем с шириной матрицы
jbe inpmas ;если меньше или рано, продолжить
mov di,1 ;первый столбец
inc cx ;следующая строка
cmp cx,N ;сравниваем с высотой матрицы
jbe inpmas ;если меньше или рано, продолжить
mov ah,9 ;функция вывода сообщения на экран
lea dx,msg1 ;выводимое сообщение
int 21h ;выводим на экран
call outmatr ;вывод матрицы
lea si,A
mov bx,M
;пузырьковая сортировка массива
;si указывает на массив, который нужно отсортировать
;bx - количество элементов массива
sort: xor dx, dx ;flag=0
mov di, si ;начало массива
lea cx, [bx-1] ;сх=bx-1(будем проводить n-1 сравниваний)
s1: mov al, [di] ;mas[n]
cmp al, [di+1] ;mas[n] не больше mas[n+1]
jng s2 ;то пропустить
push cx ;сохранить регистры
push di
mov cx,N ;кол-во элементов в столбце
s3: mov al,[di] ;меняем
xchg al, [di+1] ;местами
mov [di],al ;два
add di,M ;соседних
loop s3 ;столбца
pop di ;восстанивить регистры
pop cx
mov dx, 1 ;flag=1
s2: inc di ;переходим к следующему элементу массива
loop s1 ;сравниваем все элементы в данном проходе
test dx, dx ;flag=0?
jnz sort ;если нет, то продолжаем сортировку
mov ah,9 ;функция вывода сообщения на экран
lea dx,msg2 ;выводимое сообщение
int 21h ;выводим на экран
call outmatr ;вывод матрицы
mov ax,4c00h ;закончить программу
int 21h
;преобразование числа из аl в десятичную строку и вывод на экран
;al - число
printdec proc
push cx ;сохраняем регистры
push dx
push bx
push si
cbw ;расширить до слова
mov si,ax ;запоминаем число
mov bx,10 ;основание системы
xor cx,cx ;в сх будет количество цифр в десятичном числе
test ax,ax ;если число положительное
jns @@m1a ;то пропускаем
neg ax ;если отрицательное, то меняем знак
@@m1a: xor dx,dx ;очистить старшую часть делимого
div bx ;делим число на степени 10
push dx ;и сохраняем остаток от деления(коэффициенты при степенях) в стек
inc cx ;увеличиваем количество десятичных цифр числа
test ax,ax ;после деления остался 0?
jnz @@m1a ;если нет, продолжаем
test si,si ;число отрицательное?
jns @@m3a ;если нет, пропустить
push -3 ;иначе дописать перех числом минус
inc cx ;увеличить количество цифр числа
@@m3a: mov ah,2 ;ф-я вывода символа
@@m2a: pop dx ;взять из стека цифру цисла
add dl,'0' ;преобразовываем цифру в ASCII символ
int 21h ;вывести на экран
loop @@m2a ;все цифры
pop si ;восстанавливаем регистры
pop bx
pop dx
pop cx
ret ;выход из подпрограммы
printdec endp
str2dw:
;Преобразование строки в число
;на входе ds:si ссылается на ASCII строку, которую нужно преобразовать
;на выходе в ax - число.
;признак cf=1 в случае некорректной строки
push dx ;сохраняем регистры
push si
push di
push bx
mov bx,10
xor dx,dx ;сумма
xor di,di ;знак
@lp1: xor ax,ax
lodsb ;берем символ
cmp al,13 ;если это конец строки,
jz @ex ;то заканчиваем
cmp al,'-' ;если минус,
jnz @m1
mov di,1 ;то устанавливаем признак минуса
jmp @lp1 ;продолжаем обработку
@m1: cmp al,'9' ;если это не цифра,
ja @errex1 ;то ошибка
cmp al,'0' ;если это не цифра,
jb @errex1 ;то ошибка
sub ax,'0' ;получаем цифровое значение
push ax ;сохраняем ax
mov ax,dx ;Dx
imul bx ;dx*основание системы
mov dx,ax ;dx=dx*основание системы
pop ax ;восстанавливаем ax
add dx, ax ;прибавляем текущее значение
jmp @lp1 ;продолжаем обработку
@ex: test di,di ;если установлен признак отрицательного числа
jz @ex1
neg dx ;то меняем знак
@ex1: mov ax,dx ;помещаем результат в ах
pop bx
pop di
pop si ;восстанавливаем регистры
pop dx
clc ;нормальное завершение
ret ;выход их подпрограммы
@errex1:
pop bx
pop di
pop si ;восстанавливаем регистры
pop dx
xor ax,ax
stc ;ошибка
ret ;выход их подпрограммы
outmatr proc
mov ax,N ;размер матрицы
mov cx,M
mul cx ;количество элементов в матрице
mov cx,ax ;количество элементов в матрице
lea bx,A ;начало матрицы
mo6: mov al,[bx] ;берем элемент матрицы
call printdec ;выводим
mov ah,2 ;функция вывода символа на экран
mov dl,9 ;символ табуляции
int 21h ;выводим пробел
inc bx ;переходим к следующему элементу матрицы
dec cx ;уменьшаем количество оставшихся элементов
jz ex1 ;если 0 - закончить
mov ax,cx ;количество оставшихся элементов
mov dx,M ;длина строки матрицы
div dl ;делим текущий элемент на длину строки матрицы
test ah,ah ;если не 0
jnz mo6 ;то продолжить
mov ah,2 ;функция вывода символа на экран
mov dl,13 ;возврат каретки
int 21h ;выводим возврат каретки
mov dl,10 ;перевод строки
int 21h ;выводим перевод строки
jmp mo6 ;продолжаем вывод
ex1: ret
outmatr endp
end start |
|
Добавлено через 1 час 3 минуты
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
210
| .model small
.data
N = 5 ;строк
M = 7 ;столбцов
inpm db 13,10,'Input matrix:$'
msg1 db 13,10,'Matrix:',13,10,'$'
msg2 db 13,10,'New matrix:',13,10,'$'
msg3 db 13,10,'Enter number!$'
str0 db 0dh,0ah,'A($' ;формируемая для вывода строка
str1 db ')= $'
buf db 5,6 dup(0) ;принимает строку, введенную с клавиатуры
A db N*M dup (?)
.stack 256
.code
start:
mov ax,@data ;Настраиваем сегментные регистры
mov ds,ax
mov ah,9 ;функция вывода сообщения на экран
lea dx,inpm ;выводимое сообщение
int 21h ;выводим на экран
;Ввод матрицы
lea bx,A ;начало матрицы
mov cx,1 ;строка
mov di,1 ;столбец
inpmas: mov ah,9 ;функция вывода сообщения на экран
lea dx,str0 ;(
int 21h ;выводим на экран
mov ax,cx ;строка
call printdec ;преобразуем номер строки в текст и выводим на экран
mov ah,2 ;ф-я вывода символа
mov dl,',' ;запятая
int 21h ;вывести на экран
mov ax,di ;столбец
call printdec ;выводим на экран
mov ah,9 ;функция вывода сообщения на экран
lea dx,str1 ;)=
int 21h ;выводим на экран
mov ah,0ah ;функция ввода строки с клавиатуры
mov dx,offset buf ;буфер куда вводить
int 21h ;пользователь вводит в текстовом виде в buf значение элемента массива
lea si,buf[2] ;начало введенного текста
call str2dw ;преобразовываем строку в значение
jnc correct
mov ah,9 ;функция вывода сообщения на экран
lea dx,msg3 ;выводимое сообщение
int 21h ;выводим на экран
jmp inpmas
correct:
mov [bx],al ;заносим значение в массив
inc bx ;следующий элемент
inc di ;номер следующего столбца
cmp di,M ;сравниваем с шириной матрицы
jbe inpmas ;если меньше или рано, продолжить
mov di,1 ;первый столбец
inc cx ;следующая строка
cmp cx,N ;сравниваем с высотой матрицы
jbe inpmas ;если меньше или рано, продолжить
mov ah,9 ;функция вывода сообщения на экран
lea dx,msg1 ;выводимое сообщение
int 21h ;выводим на экран
call outmatr ;вывод матрицы
lea si,A
mov bx,M
;пузырьковая сортировка массива
;si указывает на массив, который нужно отсортировать
;bx - количество элементов массива
sort: xor dx, dx ;flag=0
mov di, si ;начало массива
lea cx, [bx-1] ;сх=bx-1(будем проводить n-1 сравниваний)
s1: mov al, [di] ;mas[n]
cmp al, [di+1] ;mas[n] не больше mas[n+1]
jng s2 ;то пропустить
push cx ;сохранить регистры
push di
mov cx,N ;кол-во элементов в столбце
s3: mov al,[di] ;меняем
xchg al, [di+1] ;местами
mov [di],al ;два
add di,M ;соседних
loop s3 ;столбца
pop di ;восстанивить регистры
pop cx
mov dx, 1 ;flag=1
s2: inc di ;переходим к следующему элементу массива
loop s1 ;сравниваем все элементы в данном проходе
test dx, dx ;flag=0?
jnz sort ;если нет, то продолжаем сортировку
mov ah,9 ;функция вывода сообщения на экран
lea dx,msg2 ;выводимое сообщение
int 21h ;выводим на экран
call outmatr ;вывод матрицы
mov ax,4c00h ;закончить программу
int 21h
;преобразование числа из аl в десятичную строку и вывод на экран
;al - число
printdec proc
push cx ;сохраняем регистры
push dx
push bx
push si
cbw ;расширить до слова
mov si,ax ;запоминаем число
mov bx,10 ;основание системы
xor cx,cx ;в сх будет количество цифр в десятичном числе
test ax,ax ;если число положительное
jns @@m1a ;то пропускаем
neg ax ;если отрицательное, то меняем знак
@@m1a: xor dx,dx ;очистить старшую часть делимого
div bx ;делим число на степени 10
push dx ;и сохраняем остаток от деления(коэффициенты при степенях) в стек
inc cx ;увеличиваем количество десятичных цифр числа
test ax,ax ;после деления остался 0?
jnz @@m1a ;если нет, продолжаем
test si,si ;число отрицательное?
jns @@m3a ;если нет, пропустить
push -3 ;иначе дописать перех числом минус
inc cx ;увеличить количество цифр числа
@@m3a: mov ah,2 ;ф-я вывода символа
@@m2a: pop dx ;взять из стека цифру цисла
add dl,'0' ;преобразовываем цифру в ASCII символ
int 21h ;вывести на экран
loop @@m2a ;все цифры
pop si ;восстанавливаем регистры
pop bx
pop dx
pop cx
ret ;выход из подпрограммы
printdec endp
str2dw:
;Преобразование строки в число
;на входе ds:si ссылается на ASCII строку, которую нужно преобразовать
;на выходе в ax - число.
;признак cf=1 в случае некорректной строки
push dx ;сохраняем регистры
push si
push di
push bx
mov bx,10
xor dx,dx ;сумма
xor di,di ;знак
@lp1: xor ax,ax
lodsb ;берем символ
cmp al,13 ;если это конец строки,
jz @ex ;то заканчиваем
cmp al,'-' ;если минус,
jnz @m1
mov di,1 ;то устанавливаем признак минуса
jmp @lp1 ;продолжаем обработку
@m1: cmp al,'9' ;если это не цифра,
ja @errex1 ;то ошибка
cmp al,'0' ;если это не цифра,
jb @errex1 ;то ошибка
sub ax,'0' ;получаем цифровое значение
push ax ;сохраняем ax
mov ax,dx ;Dx
imul bx ;dx*основание системы
mov dx,ax ;dx=dx*основание системы
pop ax ;восстанавливаем ax
add dx, ax ;прибавляем текущее значение
jmp @lp1 ;продолжаем обработку
@ex: test di,di ;если установлен признак отрицательного числа
jz @ex1
neg dx ;то меняем знак
@ex1: mov ax,dx ;помещаем результат в ах
pop bx
pop di
pop si ;восстанавливаем регистры
pop dx
clc ;нормальное завершение
ret ;выход их подпрограммы
@errex1:
pop bx
pop di
pop si ;восстанавливаем регистры
pop dx
xor ax,ax
stc ;ошибка
ret ;выход их подпрограммы
outmatr proc
mov ax,N ;размер матрицы
mov cx,M
mul cx ;количество элементов в матрице
mov cx,ax ;количество элементов в матрице
lea bx,A ;начало матрицы
mo6: mov al,[bx] ;берем элемент матрицы
call printdec ;выводим
mov ah,2 ;функция вывода символа на экран
mov dl,9 ;символ табуляции
int 21h ;выводим пробел
inc bx ;переходим к следующему элементу матрицы
dec cx ;уменьшаем количество оставшихся элементов
jz ex1 ;если 0 - закончить
mov ax,cx ;количество оставшихся элементов
mov dx,M ;длина строки матрицы
div dl ;делим текущий элемент на длину строки матрицы
test ah,ah ;если не 0
jnz mo6 ;то продолжить
mov ah,2 ;функция вывода символа на экран
mov dl,13 ;возврат каретки
int 21h ;выводим возврат каретки
mov dl,10 ;перевод строки
int 21h ;выводим перевод строки
jmp mo6 ;продолжаем вывод
ex1: ret
outmatr endp
end start |
|
0
|