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