Даны 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 и вывод сообщения
- Завершение программы:
- Вызов прерывания для завершения программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д