Дан массив байтов(16 байт, в DS). Подсчитать количество элементов, кратных 3, но не кратных 4 на ассемблере
Буду очень благодарен
По дате
По рейтингу
Чтобы выполнить данную задачу на ассемблере x86, вы можете использовать следующий код:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
; Массив байтов
array db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
array_len equ $ - array
; Сегмент данных
section .data
counter dw 0 ; Счётчик для подсчёта количества элементов, кратных 3, но не кратных 4
; Сегмент кода
section .text
global _start
_start:
; Установка начального значения для регистров
mov ecx, array_len ; Размер массива
lea esi, [array] ; Адрес массива
xor ebx, ebx ; Очистка регистра-счётчика
loop_start:
movzx eax, byte [esi] ; Загрузка текущего элемента массива в регистр eax
test eax, eax ; Проверка на ноль (конец массива)
je end_loop ; Если элемент равен нулю, завершаем цикл
; Проверка на кратность
xor edx, edx
mov ecx, 3
div ecx ; eax = eax / 3, edx = eax % 3
; Если элемент кратен 3 и не кратен 4
cmp edx, 0
jne next ; Если не кратен 3, переходим к следующему элементу
; Проверка на кратность 4
mov ecx, 4
div ecx ; eax = eax / 4, edx = eax % 4
cmp edx, 0
je next ; Если кратен 4, переходим к следующему элементу
inc ebx ; Увеличиваем счётчик на 1
next:
inc esi ; Переходим к следующему элементу массива
loop loop_start
end_loop:
mov [counter], bx ; Записываем значение счётчика в память
; Завершение программы
mov eax, 1 ; Вызов системного вызова sys_exit
xor ebx, ebx ; Код завершения программы - 0
int 0x80 ; Вызов прерывания
Этот код проверяет каждый элемент массива на кратность 3 и некратность 4, увеличивая счётчик ebx при выполнении условий. Затем он сохраняет значение счётчика в переменной counter.
Вот пример кода на ассемблере x86 для подсчета количества элементов в массиве из 16 байт, которые кратны 3, но не кратны 4:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
section .data
array db 12, 7, 8, 5, 10, 15, 3, 9, 1, 4, 13, 6, 2, 11, 14, 0 ; массив из 16 байт
section .text
global _start
_start:
xor eax, eax ; счетчик для количества элементов, кратных 3, но не кратных 4
mov ecx, 16 ; счетчик для прохода по массиву
loop_start:
cmp ecx, 0 ; проверка, достигли ли конца массива
jz done ; если да, переходим к done
mov bl, [array + ecx - 1] ; загружаем очередной элемент массива в регистр bl
cmp bl, 0 ; проверяем, является ли элемент нулем
je next ; если да, переходим к next
mov edx, 0 ; edx будет использоваться для проверки кратности 4
mov eax, ebx ; загружаем элемент в eax для проверки кратности 3
div dword [three] ; делим eax на 3, результат в eax, остаток в edx
cmp edx, 0 ; проверяем, является ли элемент кратным 3
jne three_divisible ; если да, переходим к three_divisible
next:
dec ecx ; уменьшаем счетчик прохода по массиву
jmp loop_start ; переходим к loop_start для следующей итерации
three_divisible:
mov edx, 0 ; edx будет использоваться для проверки кратности 4
mov eax, ebx ; загружаем элемент в eax для проверки кратности 4
div dword [four] ; делим eax на 4, результат в eax, остаток в edx
cmp edx, 0 ; проверяем, является ли элемент кратным 4
je next ; если да, переходим к next
inc eax ; увеличиваем счетчик элементов, кратных 3, но не кратных 4
jmp next ; переходим к next для следующей итерации
done:
; результат хранится в eax
; можно использовать результат для других операций
; например, вывода результата на экран или сохранения в файл
; выходим из программы
mov eax, 1
xor ebx, ebx
int 80h
section .data
three dd 3 ; константа для деления на 3
four dd 4 ; константа для деления на 4
Примечание: данная реализация предполагает, что массив находится в сегменте данных (DS) и начинается с метки "array". Также