Top.Mail.Ru
Ответы

Дан массив байтов(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". Также