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

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

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

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

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

textual
Листинг программы
LOCALS
 
.model small
 
.stack 100h
 
.data
        CrLf    db      0Dh, 0Ah, '$'
 
        Array   dw      5, 8, 100, -8, 51, -72, -87, -132
        Len     dw      ($-Array)/2
 
        String  db      256 dup(?)
        msgRes  db      'Summa = '
        LenMsg  equ     $-msgRes
 
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;текущая сумма элементов
        mov     bx,     0       ;текущая сумма
        lea     si,     Array
        mov     cx,     Len
@@Sum:
        lodsw
        add     bx,     ax
        loop    @@Sum
 
        ;вывод результата на экран
        mov     ax,     bx
        lea     dx,     String
        call    Int16ToStr
 
        ;
        mov     ah,     40h
        mov     bx,     1
        mov     cx,     LenMsg
        lea     dx,     MsgRes
        int     21h
 
        mov     ah,     40h
        mov     bx,     1
        mov     cx,     0
        mov     cl,     String
        lea     dx,     String+1
        int     21h
 
        mov     ax,     4C00h
        int     21h
main    endp
 
; преобразует число из регистра AX в строку
; входные данные:
; ax - число для отображения
; ds:dx - адрес для результирующей строки Pascal типа
Int16ToStr      proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
        push    si
 
        mov     si,     dx
        mov     [si],   byte ptr 0      ;текущая длина строки равна 0
 
        mov     cx, 10
        xor     di, di          ; di - кол. цифр в числе
 
        ; если число в ax отрицательное, то
        ;1) увеличить длину строки на 1
        ;2) первый символ в строке '-'
        ;3) сделать ax положительным
        or      ax, ax
        jns     @@Conv
        inc     byte ptr [si]
        mov     [si+1], byte ptr '-'
 
        neg     ax
 
@@Conv:
        xor     dx, dx
        div     cx              ; dl = num mod 10
        add     dl, '0'         ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стек
        or      ax, ax
        jnz     @@Conv
        ; выводим из стека в строку
        mov     ax,     0
        mov     al,     [si]    ;в ячейку с длиной записываем длину строки
        add     [si],   di      ;с учётом возможного символа знака
        inc     si              ;устанавливаем указатель на первую свободную ячейку
        add     si,     ax
@@Show:
        pop     dx              ; dl = очередной символ
        mov     [si],   dl
        inc     si
        dec     di              ; повторяем пока di<>0
        jnz     @@Show
 
        pop     si
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Int16ToStr      endp
 
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
Похожие ответы