Даны 2 массива: массив слов MS и массив байтов MB - Assembler
Формулировка задачи:
Даны 2 массива: массив слов MS и массив байтов MB. Разделить со знаком попарно MS/MB и образовать массивы частных (MCH) и остатков (MO). Определить сумму элементов MCH и число элементов массива MO, в коде которых имеется "1" в 7-ом бите. Выяснить знак полученной суммы.
В ассемблере почти не разбираюсь, попыталась сделать хоть что то с помощью того, что есть в интернете. Но так и не смогла понять, как определить знак суммы и число элементов массива MO, в коде которых имеется "1" в 7-ом бите. К тому же я даже не уверена в правильности того, что сделала на данный момент:
Пожалуйста, помогите разобраться с этими вопросами. Буду очень благодарна!
LOCALS
.model small
.stack 100h
.data
Len equ 7 ; длина массивов
MS dw 5,23,1,-17,32,25,9 ; массив слов
MB db 1,2,13,41,-15,-16,22 ; массив байтов
MCH dw Len dup(?) ; массив частных
MO dw Len dup(?) ; массив остатков
.code
main proc
mov ax, @data
; Разделить со знаком попарно MS/MB и образовать массивы частных и остатков
lea si,MS ; si - указатель на массив MS
lea di,MB ; di - указатель на массив MB
mov bx,0 ; bx - индекс в массивах остатков и частных
mov cx,len ; длина массивов
@@For1:
push bx
mov al,[di]
cbw
mov bx,ax
mov ax,[si]
cwd
add si,2 ; увеличение на один элемент массива MS
add di,1 ; увеличение на один элемент массива MB
idiv bx ; знаковое деление
pop bx
mov MCH[bx],ax
mov MO[bx],dx
add bx,1 ; увеличение на один элемент массива MO или MCH
loop @@For1
; Определение суммы элементов массива частных
mov al,0 ; сумма элементов массива
mov cx,Len ; длина массива
lea si,MCH
@@For2:
add al,[si]
add si,1 ; увеличение на один элемент массива MCH
loop @@For2
main endp
end mainРешение задачи: «Даны 2 массива: массив слов MS и массив байтов MB»
textual
Листинг программы
LOCALS .model small .stack 100h .data Len equ 7 ; длина массивов MS dw 5,23,1,-17,32,25,9 ; массив слов MB db 1,2,13,41,-15,-16,22 ; массив байтов MCH dw Len dup(?) ; массив частных MO dw Len dup(?) ; массив остатков N dw ? ; число положительных элементов Positive db ‘Positive’,0Dh,0Ah,’$’ Negative db ‘Negative’,0Dh,0Ah,’$’ .code main proc mov ax, @data ; Разделить со знаком попарно MS/MB и образовать массивы частных и остатков lea si,MS ; si - указатель на массив MS lea di,MB ; di - указатель на массив MB mov bx,0 ; bx - индекс в массивах остатков и частных mov cx,Len ; длина массивов @@For1: push bx mov al,[di] cbw mov bx,ax mov ax,[si] cwd idiv bx ; знаковое деление pop bx mov MCH[bx],ax mov MO[bx],dx add si,2 ; увеличение на один элемент массива MS add di,1 ; увеличение на один элемент массива MB add bx,1 ; увеличение на один элемент массива MO или MCH loop @@For1 ; Определение суммы элементов массива частных mov ax,0 ; сумма элементов массива mov cx,Len ; длина массива lea si,MCH @@For2: add al,[si] add si,2 ; увеличение на один элемент массива MCH loop @@For2 ; Подсчёт количества элементов MO, у которых в 7-м бите единица mov N,0 ; переменное для хранения количества элементов @@For4: test MO[si],1000000b jz @@For3 ; если 0, то не инкрементируем N inc N @@For3: add si,2 ; переходим на следующий элемент loop @@For4 ; Проверка знака суммы элементов массива частных MCH or al,al js @@Negative mov ah,09h lea dx,Positive int 21h jmp @@End @@Negative: mov ah,09h lea dx,Negative int 21h @@End: mov ax,4C00h int 21h main endp end main
Объяснение кода листинга программы
- Объявление переменных и констант:
Len- константа, значение 7MS- массив данных типа слов (dw) с элементами 5, 23, 1, -17, 32, 25, 9MB- массив байтов (db) с элементами 1, 2, 13, 41, -15, -16, 22MCH- массив слов (dw) длиной Len для хранения частныхMO- массив слов (dw) длиной Len для хранения остатковN- переменная для хранения количества положительных элементовPositive- строкаPositiveс символом новой строки и конечным нулемNegative- строкаNegativeс символом новой строки и конечным нулем
- Разделение со знаком попарно MS/MB и формирование массивов частных и остатков:
- Указатели:
si- массив MS,di- массив MB bx- индекс в массивах остатков и частных- Цикл разделения с использованием деления с остатком и сохранением результатов в массивы MCH и MO
- Указатели:
- Определение суммы элементов массива частных:
ax- переменная для хранения суммы элементов массива- Цикл для нахождения и добавления элементов массива MCH к переменной
ax
- Подсчёт количества элементов MO, у которых в 7-м бите единица:
- Цикл для проверки каждого элемента массива MO и подсчёта количества элементов, у которых седьмой бит равен 1
- Проверка знака суммы элементов массива частных MCH:
- Проверка знака суммы элементов массива MCH и вывод сообщения
PositiveилиNegativeв зависимости от этого
- Проверка знака суммы элементов массива MCH и вывод сообщения
- Завершение программы:
- Вызов прерывания для завершения программы.