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