Сортировка двух-байтного массива М по возрастанию

Страницы работы

Содержание работы

Министерство образования РФ

СибирскийГосударственный

Технологический Университет

Факультет  АИТ

Кафедра Системного программирования

Лабораторная работа №1

Проверил:

____________ Конев А.И.

         (подпись)

_____________________________

                   (оценка, дата)

Выполнили:  студ. гр. 23-2

___________ Захаров А.С.

          (подпись)

___________  Смирнов Н.М.

          (подпись)

___________  Кирюхин П.В.

          (подпись)

___________  Мутовин С.В.

          (подпись)

 

 


Красноярск 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                 ;Конец программы

Вывод на экран


Похожие материалы

Информация о работе

Предмет:
Информатика
Тип:
Отчеты по лабораторным работам
Размер файла:
201 Kb
Скачали:
0