Битовые и логические операции с массивом - Assembler

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

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

Само задание : Дан массив из 10 без знаковых байтов. Коды первого третьего и седьмого байта сдвинуть логически влево; коды второго, четвертого и пятого байта сдвинуть арифметически вправо, а нулевой и шестой байты объединить по “И” с кодом 01110111. Определить сумму элементов массива. Превышает ли полученная сумма величину 221? Имеются ли в составе байта, в кодах которых присутствует одновременно “O” в 1,3 и в 5 битах? Давайте сотрудничать)

Решение задачи: «Битовые и логические операции с массивом»

textual
Листинг программы
LOCALS
 
.model small
 
.stack 100h
 
.data
        A               db      -3, 2, -9, 0, 8, -45, 5, 15, -9, 5
 
        Greater         db      'Greater 221', 0Dh, 0Ah, '$'
        NoGreater       db      'No greater 221', 0Dh, 0Ah, '$'
        Consist         db      'Consist', 0Dh, 0Ah, '$'
        NoConsist       db      'No Consist', 0Dh, 0Ah, '$'
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
 
        ;Коды первого третьего и седьмого байта сдвинуть логически влево;
        shl     byte ptr A[1],  1
        shl     byte ptr A[3],  1
        shl     byte ptr A[7],  1
        ;коды второго, четвертого и пятого байта сдвинуть арифметически вправо;
        shr     byte ptr A[2],  1
        shr     byte ptr A[4],  1
        shr     byte ptr A[5],  1
        ;нулевой и шестой байты объединить по "И" с кодом 01110111
        and     byte ptr A[0],  01110111b
        and     byte ptr A[6],  01110111b
        ;Определить сумму элементов массива.
        lea     si,     A
        mov     cx,     10
        mov     ax,     0       ;сумма
@@For:
        add     al,     [si]
        adc     ah,     0
        add     si,     1
        loop    @@For
        ;Превышает      ли полученная сумма величину 221
        cmp     ax,     221
        jg      @@Greater
        mov     ah,     09h
        lea     dx,     NoGreater
        int     21h
        jmp     @@Metka
@@Greater:
        mov     ah,     09h
        lea     dx,     Greater
        int     21h
@@Metka:
        ;Имеются ли в составе массива байты, в кодах которых
        ;присутствует одновременно "0" в 1,3 и в 5 битах?
        lea     si,     A
        mov     cx,     10
        mov     bx,     0       ;количество искомых байт
@@@For:
        mov     al,     [si]
        add     si,     1
        and     al,     00101010b
        cmp     al,     00101010b
        jne     @@@Skip
        inc     bx
@@@Skip:
        loop    @@@For
        cmp     bx,     0
        jne     @@Consist
        mov     ah,     09h
        lea     dx,     NoConsist
        int     21h
        jmp     @@Exit
@@Consist:
        mov     ah,     09h
        lea     dx,     Consist
        int     21h
 
@@Exit:
        mov     ax,     4C00h
        int     21h
main    endp
 
end     main

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

  1. Создание переменных:
    • A - массив байтов, содержащий значения (-3, 2, -9, 0, 8, -45, 5, 15, -9, 5)
    • Greater - строка 'Greater 221'
    • NoGreater - строка 'No greater 221'
    • Consist - строка 'Consist'
    • NoConsist - строка 'No Consist'
  2. Логический и арифметический сдвиг байтов массива:
    • Байты с номерами 1, 3 и 7 сдвигаются логически влево на 1 бит
    • Байты с номерами 2, 4 и 5 сдвигаются арифметически вправо на 1 бит
    • Байты с номерами 0 и 6 объединяются по И с кодом 01110111
  3. Определение суммы элементов массива:
    • Считается сумма элементов массива A
  4. Проверка превышения суммы величины 221:
    • Сравнивается полученная сумма с 221
    • Выводится соответствующее сообщение в зависимости от результата сравнения
  5. Поиск байтов, содержащих одновременно 0 в 1, 3 и 5 битах:
    • Ищутся байты в массиве A, у которых присутствует 0 в 1, 3 и 5 битах
    • Выводится соответствующее сообщение о наличии или отсутствии таких байтов в массиве
  6. Завершение программы:
    • Программа завершается с кодом 4C00h

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

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