Действия над массивами слов и массивами байтов - Assembler

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

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

Есть задание: Даны два массива: массив слов MS и массив байтов MB. Установить "1" в 4-ых и 6-тых битах всех элементов массива MB. Коды отрицательных слов MS сдвинуть логически вправо. Разделить со знаком нечетные элементы массива слов на четные элементы массива байтов. Образовать дополнительные массивы частных и остатков деления. Определить сумму элементов массива частных и ее знак. Превышают ли остатки от деления число 10? Накинул только вот такое начало программы. Дальше, не знаю, что да как делать. Прошу помочь информацией, ссылками, примерами кода. Буду очень благодарен!
.model small
.stack 100h
 
.data
        MB   db      1, 2, 40, 122, 133, 245, 144, 111, 55      ; массив байтов
    MS   dw      55, 111, 144, -245, 133, 122, -40, 2, 1        ; массив слов

        MsgOverflow     db      'Overflow', 0Dh, 0Ah, '$'
        MsgNothing      db      'Find Nothing', 0Dh, 0Ah, '$'
.code
main:
    ; Действия

@@Exit:
        mov  ax, 4C00h                   ; выход в DOS
        int  21h
end     main

Решение задачи: «Действия над массивами слов и массивами байтов»

textual
Листинг программы
LOCALS
 
.model small
 
.stack 100h
 
.data
 
    Len     equ     9                                           ;длина массивов
    MB      db      1, 2, 40, 122, 133, 245, 144, 111, 55       ; массив байтов
    MS      dw      55, 111, 144, -245, 133, 122, -40, 2, 1     ; массив слов
 
    MC      dw      Len/2 dup(?)                                ; массив частных
    MO      dw      Len/2 dup(?)                                ; массив остатков
 
    Sum     db      0                                           ; сумма частных
 
    Positive            db      'Positive', 0Dh, 0Ah, '$'
    Negative            db      'Negative', 0Dh, 0Ah, '$'
    Prevyshaut          db      'Greater', 0Dh, 0Ah, '$'
    NePrevyshaut        db      'Not greater', 0Dh, 0Ah, '$'
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;Установить "1" в 4-ых и 6-тых битах всех элементов массива MB.
        lea     si,     MB  ;si - указатель на массив MB
        mov     cx,     Len ;длина массива MB
@@For1:
        or  [si],       byte ptr 01010000b  ;установить 4 и 6 биты
        add     si,     1   ;увеличение на размер одного элемента массива
        loop    @@For1
 
        ;Коды отрицательных слов MS сдвинуть логически вправо.
        lea     si,     MS  ;si - указатель на массив MS
        mov     cx,     Len ;длина массива MS
@@For2:
        mov     ax,     [si]
        or      ax,     ax
        jns     @@Next2
        shr     ax,     1   ;Коды отрицательных слов MS
        mov     [si],   ax  ;сдвинуть логически вправо.
@@Next2:
        add     si,     2   ;увеличение на размер одного элемента массива
        loop    @@For2
 
        ;Разделить со знаком нечетные элементы массива слов на четные элементы массива байтов.
        ;Образовать дополнительные массивы частных и остатков деления.
        lea     si,     MS  ; si - указатель на массив MS
        lea     di,     MB  ; di - указатель на массив MB
        mov     bx,     0   ; bx - индекс в массивах остатков и частных
        add     di,     1   ; di - на чётный индекс элемента массива
        mov     cx,     Len/2 ; Длина массивов
@@For3:
        push    bx
        mov     al,     [di]
        cbw
        mov     bx,     ax
        mov     ax,     [si]
        cwd
        add     si,     4   ; увеличиваем на размер двух элементов массива MS
        add     di,     2   ; увеличиваем на размер двух элементов массива MB
 
        idiv    bx          ; Производим знаковое деление (dx:ax) на bx
        pop     bx
        mov     MC[bx], ax
        mov     MO[bx], dx
        add     bx,     1   ;увеличение на размер одного элемента массива MO или MC
        loop    @@For3
 
        ;Определить сумму элементов массива частных и ее знак.
        mov     al,     0   ;сумма элементов массива
        mov     cx,     Len/2 ; Длина массива
        lea     si,     MC
@@For4:
        add     al,     [si]
        add     si,     1   ;увеличение на размер одного элемента массива MC
        loop    @@For4
        mov     Sum,    al
        or      al,     al
        js      @@Negative
        mov     ah,     09h
        lea     dx,     Positive
        int     21h
        jmp     @@End5
@@Negative:
        mov     ah,     09h
        lea     dx,     Negative
        int     21h
@@End5:
 
        ;Превышают ли остатки от деления число 10?
        lea     si,     MO
        mov     cx,     Len/2
@@For5:
        cmp     [si],   word ptr 10
        jg      @@Greater
        loop    @@For5
        mov     ah,     09h
        lea     dx,     NePrevyshaut
        int     21h
        jmp     @@Exit
 
@@Greater:
        mov     ah,     09h
        lea     dx,     Prevyshaut
        int     21h
 
@@Exit:
        mov     ax,     4C00h
        int     21h
main    endp
 
end     main

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

  1. Инициализируются переменные:
    • Len со значением 9 (длина массивов)
    • MB с массивом байтов: 1, 2, 40, 122, 133, 245, 144, 111, 55
    • MS с массивом слов: 55, 111, 144, -245, 133, 122, -40, 2, 1
    • MC с пустым массивом размера Len/2 для частных
    • MO с пустым массивом размера Len/2 для остатков
    • Sum с байтом 0 для хранения суммы частных
    • Positive с текстом 'Positive', 0Dh, 0Ah, '$'
    • Negative с текстом 'Negative', 0Dh, 0Ah, '$'
    • Prevyshaut с текстом 'Greater', 0Dh, 0Ah, '$'
    • NePrevyshaut с текстом 'Not greater', 0Dh, 0Ah, '$'
  2. В процедуре main выполняются следующие действия:
    • Устанавливается сегмент данных
    • Устанавливается 1 в 4-ых и 6-тых битах всех элементов массива MB
    • Коды отрицательных слов MS сдвигаются логически вправо
    • Нечетные слова массива MS делятся с остатком на четные байты массива MB, формируются дополнительные массивы частных и остатков
    • Определяется сумма элементов массива частных и их знак
    • Проверяется, превышают ли остатки от деления число 10
    • Программа завершается
  3. Программа завершается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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