Технологический Университет
Факультет АИТ
Кафедра Системного программирования
|
Красноярск 2000
Есть двух – байтный массив М. Отсортировать массив М по возрастанию (массив W).
Modelsmall ;Модель памяти занимает один сегмент
Stack 100h ;Задаёт размер стека (256 byte)
.data ;Сегмент данных
M DW 20 dup(?) ;Произвольный массив
W DW 20 dup(?) ;Отсортированный массив
P DB 'Произвольный двух – байтный массив: М ','$'
Y DB 'Упорядоченный двух – байтный массив: W: ','$'
D DB 'd,','$'
T DB 'd ','$'
H DB 100,100,10,1
.code ;Сегмент кода
start:mov ax,@data ;Заносим адрес сегмента данных
mov ds,ax ;в регистр AX
;******************** Ввод данных в массив M *****************
sub AX,AX ;Обнуление регистра ( AX = AX – AX )
sub BX,BX ; Обнуление регистра
sub DX,DX ; Обнуление регистра
sub CX,CX ; Обнуление регистра
mov DX,0Ah ;DX = 10 dec
mov AX,01C2h ;01C2h = 450dec
mov CX,10 ;Начало цикла C
C:add AX,DX ;AX = AX + DX
mov M[BX],AX ;Заполняем массив М
add BX,4 ;BX = BX + 4
loop C ;Конец цикла С
sub BX,BX ; Обнуление регистра
sub CX,CX ; Обнуление регистра
sub AX,AX ; Обнуление регистра
mov AX,01C2h ;AX = 450 dec
mov BX,2 ;BX = 2
mov CX,10 ;Начало цикла С1
C1:sub AX,DX ;AX = AX - DX
mov M[BX],AX ; Заполняем массив М
add BX,4 ; BX = BX + 4
loop C1 ; Конец цикла С1
;******************* Вывод на экран массив М *******************
sub AX,AX ; Обнуление регистра
sub DX,DX ; Обнуление регистра
mov AH,09h ;Вывод строки Р
lea DX,P ;Запись адресса строки Р
int 21h ;Прерывание DOS
xor CX,CX ; Обнуление регистра
xor DI,DI ; Обнуление регистра
mov CX,20 ;Внешний цикл
K8:xor AX,AX ;Обнуление регистра АХ
xor BX,BX ; Обнуление регистра
mov AX,M[DI] ;AX = Заносим элементы массива М
push CX ;Запись в стек содержимого регистра СХ
call N1 ;Вызов процедуры N1
pop CX ;Чтение из стека в регистр СХ
cmp CX,1 ; Сравнение регистра СХ с числом 1 dec
JE K5 ;
jmp K6 ;Безусловный переход к команде с именем К6
K5:call N3 ;Вызов процедуры N3
jmp K7 ; Безусловный переход к команде с именем К7
K6:call N2 ; Вызов процедуры N2
K7:add DI,2 ;DI = DI + 2
loop K8 ; Конец цикла К8
;******** Отсортировка массива М по возрастанию *********
sub BX,BX ; Обнуление регистра
mov BX,40 ;BX = 40
sub DI,DI ; Обнуление регистра
sub CX,CX ; Обнуление регистра
mov CX,20 ;Начало внешнего цикла CVNSH1
CVNSH1:push CX ;Запись содержимого регистра в стек
sub AX,AX ; Обнуление регистра
sub BX,2 ;BX = BX - 2
mov AX,M[BX] ;AX = Заносим элементы массива М
mov CX,20 ; Начало внутреннего цикла CVNTR1
CVNTR1:sub SI,SI ; Обнуление регистра
cmp AX,M[DI] ;Сравнение регистра АХ с ячейкой памяти массива М
JB S1 ;Если AX < M[BX] (cf = 1), то выполняется S1
jmp S2 ; Безусловный переход к команде с именем S2
S1:xchg AX,M[DI] ;Обмен содержимым
jmp C2 ; Безусловный переход к команде с именем С2
S2:cmp AX,M[DI] ; Сравнение регистра АХ с ячейкой памяти массива М
JE S3 ; Если AХ = M[DI] ( zf = 1), то переход к команде S3
jmp C2 ; Безусловный переход к команде с именем С2
S3:xchg SI,M[DI] ; Обмен содержимым
C2:add DI,2 ;DI = DI + 2
loop CVNTR1 ; Конец внутреннего цикла CVNTR1
mov W[BX],AX ;Заносим отсортированные элементы массива М в W
sub DI,DI ; Обнуление регистра
pop CX ;Запись числа из стека в регистр
loop CVNSH1 ; Конец внешнего цикла CVNSH1
;*************** Вывод на экран массива W **************
sub AX,AX ; Обнуление регистра
sub DX,DX ; Обнуление регистра
mov AH,09h ;Вывод на экран строки с именем Y
lea DX,Y ;Запись адресса строки с именем Y в регистр
int 21h ; Прерывание DOS
xor CX,CX ; Обнуление регистра
xor DI,DI ; Обнуление регистра
mov CX,20 ;Начало цикла К
K:xor AX,AX ; Обнуление регистра
xor BX,BX ; Обнуление регистра
mov AX,W[DI] ;Заносим в регистр элементы отсортированного массива
push CX ;Запись содержимого регистра в стек
call N1 ;Вызов процедуры N1
pop CX ;Чтение из стека в регистр
cmp CX,1 ;Сравнение содержимого регистра с числом 1dec
JE K9 ; Если СХ = 1 ( zf = 1), то переход к команде с именем К9
jmp K10 ; Безусловный переход к команде с именем К10
K9:call N3 ;Вызов процедуры N3
jmp K11 ; Безусловный переход к команде с именем К11
К10:call N2 ; Вызов процедуры N2
K11:add DI,2 ;DI = DI + 2
loop K ; Конец цикла К
jmp EXIT ;Безусловный переход к команде с именем EXIT
N1 proc ;Начало процедуры с именем N1
mov BX,AX ;BX = AX
xor CX,CX ; Обнуление регистра
xor SI,SI ; Обнуление регистра
mov CX,4 ;Начало цикла К1
K1:cmp CX,4 ; Сравнение содержимого регистра с числом 4dec
JE K2 ;Если СХ = 4 ( zf = 1), то переход к команде с именем К2
jmp K3 ; Безусловный переход к команде с именем К3
K2:div H+2 ;AX = AX / ячейку памяти с именем Н
sub AH,AH ; Обнуление регистра
K3:div H[SI] ; AX = AX / ячейку памяти с именем Н
sub AH,AH ; Обнуление регистра
sub DX,DX ; Обнуление регистра
mov DL,AL ;DL = AL
push AX ;Запись содержимого регистра в стек
xor AX,AX ; Обнуление регистра
mov AH,02h ;Вывод элементов отсортированного массива W на экран
add DL,30h ;Получение ASCII - кода
int 21h ; Прерывание DOS
xor DX,DX ; Обнуление регистра
xor AX,AX ; Обнуление регистра
pop AX ;Чтение из стека в регистр
mul H[SI] ;AX = AX * ячейку памяти с именем Н
sub BX,AX ;BX = BX - AX
sub AX,AX ; Обнуление регистра
mov AX,BX ;AX = BX
inc SI ;SI = SI + 1
loop K1 ; Конец цикла К1
ret ;Возврат из процедуры
N1 endp ; Конец процедуры N1
N2 proc ; Начало процедуры с именем N2
sub AX,AX ; Обнуление регистра
mov AH,09h ;Вывод на экран строки с именем D
lea DX,D ;Заносим адрес строки с именем D
int 21h ; Прерывание DOS
ret ;Возврат из процедуры
N2 endp ; Конец процедуры N2
N3 proc ; Начало процедуры с именем N3
sub AX,AX ; Обнуление регистра
mov AH,09h ; Вывод на экран строки с именем Т
lea DX,T ; Заносим адрес строки с именем Т
int 21h ; Прерывание DOS
ret ;Возврат из процедуры
N3 endp ; Конец процедуры N3
EXIT:mov ax,4c00h ;Стандартный выход
int 21h ;Прерывание DOS
end start ;Конец программы
Вывод на экран
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.