Контрольная работа по «Основы ассмблера»

Автор работы: Пользователь скрыл имя, 13 Июня 2015 в 03:33, контрольная работа

Описание работы

Вариант 5. Вывести на экран сумму элементов целочисленного массива, предварительно изменив произвольным образом элементы массива при помощи команд побитовой обработки.

Файлы: 1 файл

Ассемблер контрольная.docx

— 25.85 Кб (Скачать файл)

Контрольная работа по дисциплине «Основы ассмблера»

Вариант 5. Вывести на экран сумму элементов целочисленного массива, предварительно изменив произвольным образом элементы массива при помощи команд побитовой обработки.

  1. .model tiny
  1. .data
  1. ar1 dw 3,4,2,1,5,4,2,7    ;8 элементов
  1. ar2 dw 15,34,13,35,12,57,0;7 элементов
  1. ar3 dw 1,4,15,3,7,5,8,68,5;9 элементов
  1. mes db 'summa elementov massiva ravna ','$'
  1. ;сегмент кода
  1. .code

  1. .386
  1. org 100h
  1. start:
  1. movzx    ecx,len        ;для цикла заносим длину массива
  1. shr    ecx,1        ;так как длина в словах делим на 2
  1. dec    cl        ;сравниваем со следующим, значит на 1 меньше
  1. xor    esi,esi        ;начальное значение индекса 0
  1. lea    ebx,massiv        ;заносим адрес массива
  1. l1:
  1. mov    ax,[ebx+esi*2]    ;считываем первый элемент
  1. and    ax,1000000000000000b    ;проверяем старший бит - знак
  1. mov    sign,ax        ;сохраняем его
  1. mov    dx,[ebx+esi*2+2]    ;считываем второй элемент
  1. and    dx,1000000000000000b
  1. cmp    dx,sign        ;сравниваем знаки
  1. jmp    l2
  1. l2:
  1. inc    esi        ;увеличиваем индекс
  1. loop    l1
  1. ;------------------------
  1. ;блок вывода исходного массива после обработки
  1. ;------------------------
  1. movzx    ecx,len        ;для вывода нужны все элементы
  1. shr    ecx,1
  1. xor    esi,esi
  1. l3:
  1. mov    ax,[ebx+esi*2]    ;считываем элемент
  1. push    ax
  1. xchg    ah,al
  1. call    print_all        ;вывод старшей цифры
  1. pop    ax
  1. call    print_all        ;вывод младшей цифры
  1. inc    esi        ;увеличиваем индекс
  1. loop    l3
  1. mov    dx,offset ctrl        ;адрес строки перевода
  1. mov    ah,09h        ;перевести строку
  1. int    21h
  1. ;------------------------
  1. ;Блок вычисления максимального и среднего арифметического
  1. ;максимального и последнего элемента
  1. ;------------------------
  1. movzx    ecx,len
  1. shr    ecx,1
  1. dec    cl
  1. push    ebx        ;адрес массива
  1. push    ebx
  1. mov    ax,[ebx]        ;считываем первый элемент
  1. add    ebx,2        ;переходим к следующему
  1. l6:
  1. cmp    ax,[ebx]        ;сравниваем со следующим
  1. jg    l5        ;больше?
  1. mov    ax,[ebx]        ;нет - заносим в регистр
  1. l5:
  1. add    ebx,2        ;да - переходим к следующему
  1. loop    l6
  1. pop    ebx
  1. push    eax        ;это наибольший элемент
  1. movzx    eax,len
  1. sub    eax,2
  1. add    ebx,eax        ;перемещаемся на последний элемент
  1. pop    eax
  1. add    ax,[ebx]        ;добавляем к наибольшему
  1. push    ax
  1. and    ax,1000000000000000b    ;определяем знак
  1. mov    sign,ax
  1. pop    ax
  1. shr    ax,1        ;делим на 2 - среднее арифметическое двух чисел
  1. or    ax,sign            ;устанавливаем знак
  1. cmp    sign,1000000000000000b    ;знак минус?
  1. jne    l4            ;нет - идем дальше
  1. dec    ax            ;да - увеличиваем среднее
  1. l4:
  1. pop    ebx
  1. lea    ebp,massiv1        ;заносим адрес нового массива
  1. push    ebp
  1. movzx    ecx,len        ;заносим длину исходного массива
  1. shr    ecx,1
  1. l8:
  1. mov    dx,[ebx]        ;считываем элемент исходного массива
  1. cmp    dx,ax        ;он больше среднего арифметического?
  1. jle    l7        ;нет - идем дальше
  1. mov    [ebp],dx        ;да - заносим его в новый массив
  1. add    ebp,2        ;переводим указатель на следующий элемент нового массива
  1. inc    len1        ;изменяем длину нового массива
  1. l7:
  1. add    ebx,2        ;переходим к следующему элементу исходного массива
  1. loop    l8
  1. pop    ebp
  1. movzx    ecx,len1        ;длина нового массива
  1. test    ecx,ecx        ;она равна нулю?
  1. jz    l10        ;да - выход
  1. l9:
  1. mov    ax,[ebp]        ;нет - считываем
  1. push    ax        ;и выводим
  1. xchg    ah,al        ;этот уже проходили
  1. call    print_all
  1. pop    ax
  1. call    print_all
  1. add    ebp,2
  1. loop    l9
  1. l10:
  1. ret
  1. ;------------------------
  1. ;Блок вывода цифр. Выводит в 16-ричной системе.
  1. ;Отрицательные выводит согласно 16-ричной системы.
  1. ;------------------------
  1. print_all:
  1. mov    dh,al        ;сохраняем
  1. and    dh,0Fh        ;младшую цифру
  1. shr    al,4
  1. call    print_n        ;вывод старшей цифры
  1. mov    al,dh        ;восстанавливаем младшую и вывод
  1. print_n:
  1. cmp    al,10
  1. sbb    al,69h
  1. das
  1. mov    dl,al
  1. mov    ah,2
  1. int    21h
  1. ret
  1. massiv    dw    1,-2,3,4,5,6,7,11,9,10    ;задан произвольно с произвольным количеством
  1. len    db    $-massiv
  1. sign    dw    ?
  1. max    dw    ?
  1. ctrl    db    0Dh,0Ah,'$'
  1. len1    db    0
  1. massiv1:
  1. ;ссылаем на сегмент данных
  1. mov ax, @data
  1. mov ds, ax
  1. ;ициализация переменных
  1. xor bx,bx    ;ax=0
  1. mov cx,8     ;cx=8
  1. xor si,si    ;si=0
  1. ;цикл, суммирующий элементы массива
  1. cycle: 
  1. add bx,ar1[si]    ;ax=ax+ar[si]   
  1. inc si            ;si++
  1. loop cycle        ;повторяем цикл
  1. ;вывод строки
  1. string:        
  1. mov ah,09h      ;команда на вывод
  1. mov dx,offset mes ;помещаем строку
  1. int 21h          ;вызываем прерывания
  1. xor cx,cx
  1. xor ax,ax
  1. xor dx,dx
  1. ;вывод числа
  1. mov     ax,bx   ;ax=bx    
  1. push    -1    ;Сохраним признак конца числа
  1. mov    cx,10    ;Делим на 10
  1. repeat:   
  1. xor    dx,dx    ;Очистим регистр dx
  1. div    cx    ;Делим 
  1. push    dx    ;Сохраним цифру
  1. cmp    ax,0    ;Остался 0? (оптимальнее or ax,ax)
  1. jne    repeat    ;нет -> продолжим
  1. mov    ah,2h
  1. digit:   
  1. pop    dx    ;Восстановим цифру
  1. cmp    dx,-1    ;Дошли до конца -> выход {оптимальнее: or dx,dx jl ex}
  1. je    exit
  1. add    dl,'0'    ;Преобразуем число в цифру
  1. int    21h    ;Выведем цифру на экран
  1. jmp    digit    ;И продолжим
  1. exit:
  1. mov ax, 4C00h 
  1. int 21h

  1. end    start

 


Информация о работе Контрольная работа по «Основы ассмблера»