Вычислить сумму элементов массива, расположенных до минимального элемента - Assembler

Узнай цену своей работы

Формулировка задачи:

Ребят, спасайте. Сдавать через пару дней, а как реализовать это не понимаю. Позарез нужна помощь. Задан одномерный массив (16 бит со знаком). Вычислить сумму элементов массива, расположенных до минимального элемента. Вывод результата реализовать на экран через функции работы с файлами.

Решение задачи: «Вычислить сумму элементов массива, расположенных до минимального элемента»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         CrLf    db      0Dh, 0Ah, '$'
  9.  
  10.         Array   dw      5, 8, 100, -8, 51, -72, -87, -132
  11.         Len     dw      ($-Array)/2
  12.  
  13.         String  db      256 dup(?)
  14.         msgRes  db      'Summa = '
  15.         LenMsg  equ     $-msgRes
  16.  
  17. .code
  18.  
  19. main    proc
  20.         mov     ax,     @data
  21.         mov     ds,     ax
  22.  
  23.         ;текущая сумма элементов
  24.         mov     bx,     0       ;текущая сумма
  25.         lea     si,     Array
  26.         mov     cx,     Len
  27. @@Sum:
  28.         lodsw
  29.         add     bx,     ax
  30.         loop    @@Sum
  31.  
  32.         ;вывод результата на экран
  33.         mov     ax,     bx
  34.         lea     dx,     String
  35.         call    Int16ToStr
  36.  
  37.         ;
  38.         mov     ah,     40h
  39.         mov     bx,     1
  40.         mov     cx,     LenMsg
  41.         lea     dx,     MsgRes
  42.         int     21h
  43.  
  44.         mov     ah,     40h
  45.         mov     bx,     1
  46.         mov     cx,     0
  47.         mov     cl,     String
  48.         lea     dx,     String+1
  49.         int     21h
  50.  
  51.         mov     ax,     4C00h
  52.         int     21h
  53. main    endp
  54.  
  55. ; преобразует число из регистра AX в строку
  56. ; входные данные:
  57. ; ax - число для отображения
  58. ; ds:dx - адрес для результирующей строки Pascal типа
  59. Int16ToStr      proc
  60.         push    ax
  61.         push    bx
  62.         push    cx
  63.         push    dx
  64.         push    di
  65.         push    si
  66.  
  67.         mov     si,     dx
  68.         mov     [si],   byte ptr 0      ;текущая длина строки равна 0
  69.  
  70.         mov     cx, 10
  71.         xor     di, di          ; di - кол. цифр в числе
  72.  
  73.         ; если число в ax отрицательное, то
  74.         ;1) увеличить длину строки на 1
  75.         ;2) первый символ в строке '-'
  76.         ;3) сделать ax положительным
  77.         or      ax, ax
  78.         jns     @@Conv
  79.         inc     byte ptr [si]
  80.         mov     [si+1], byte ptr '-'
  81.  
  82.         neg     ax
  83.  
  84. @@Conv:
  85.         xor     dx, dx
  86.         div     cx              ; dl = num mod 10
  87.         add     dl, '0'         ; перевод в символьный формат
  88.         inc     di
  89.         push    dx              ; складываем в стек
  90.         or      ax, ax
  91.         jnz     @@Conv
  92.         ; выводим из стека в строку
  93.         mov     ax,     0
  94.         mov     al,     [si]     ячейку с длиной записываем длину строки
  95.         add     [si],   di       учётом возможного символа знака
  96.         inc     si              ;устанавливаем указатель на первую свободную ячейку
  97.         add     si,     ax
  98. @@Show:
  99.         pop     dx              ; dl = очередной символ
  100.         mov     [si],   dl
  101.         inc     si
  102.         dec     di              ; повторяем пока di<>0
  103.         jnz     @@Show
  104.  
  105.         pop     si
  106.         pop     di
  107.         pop     dx
  108.         pop     cx
  109.         pop     bx
  110.         pop     ax
  111.         ret
  112. Int16ToStr      endp
  113.  
  114. end     main

Объяснение кода листинга программы

  1. Объявление переменных:
    • CrLf - массив символов для перехода на новую строку
    • Array - массив данных типа слово (2 байта), представляющий собой список чисел
    • Len - длина массива Array (в байтах)
    • String - строка из 256 символов
    • msgRes - строка для сообщения Summa =
    • LenMsg - длина строки msgRes
  2. Инициализация программы:
    • Установка указателя на сегмент данных ds равным началу сегмента данных @data
    • Инициализация счетчика bx для текущей суммы и указателя si на массив Array
    • Загрузка длины массива в счетчик cx
  3. Вычисление суммы элементов массива:
    • Циклический проход по элементам Array, вычисление суммы и сохранение результата в bx
  4. Преобразование числа в строку:
    • Вызов процедуры Int16ToStr для преобразования числа в строку
    • Вывод сообщения Summa = на экран
    • Вывод результата (преобразованного числа bx) на экран
    • Завершение программы
  5. Процедура Int16ToStr:
    • Преобразование числа в строку и сохранение результата в String

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.556 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы