Даны 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

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

  1. Объявление переменных и констант:
    • Len - константа, значение 7
    • MS - массив данных типа слов (dw) с элементами 5, 23, 1, -17, 32, 25, 9
    • MB - массив байтов (db) с элементами 1, 2, 13, 41, -15, -16, 22
    • MCH - массив слов (dw) длиной Len для хранения частных
    • MO - массив слов (dw) длиной Len для хранения остатков
    • N - переменная для хранения количества положительных элементов
    • Positive - строка Positive с символом новой строки и конечным нулем
    • Negative - строка Negative с символом новой строки и конечным нулем
  2. Разделение со знаком попарно MS/MB и формирование массивов частных и остатков:
    • Указатели: si - массив MS, di - массив MB
    • bx - индекс в массивах остатков и частных
    • Цикл разделения с использованием деления с остатком и сохранением результатов в массивы MCH и MO
  3. Определение суммы элементов массива частных:
    • ax - переменная для хранения суммы элементов массива
    • Цикл для нахождения и добавления элементов массива MCH к переменной ax
  4. Подсчёт количества элементов MO, у которых в 7-м бите единица:
    • Цикл для проверки каждого элемента массива MO и подсчёта количества элементов, у которых седьмой бит равен 1
  5. Проверка знака суммы элементов массива частных MCH:
    • Проверка знака суммы элементов массива MCH и вывод сообщения Positive или Negative в зависимости от этого
  6. Завершение программы:
    • Вызов прерывания для завершения программы.

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

5   голосов , оценка 3.8 из 5
Похожие ответы