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