Сложить два массива по 8 натуральных чисел, с насыщением MMX ассемблер NASM - Assembler
Формулировка задачи:
Здравствуйте! Пишу программу, складывающую поэлементно 2 массива по 8 натуральных чисел, не превышающих 127, с насыщением. (например: ввод: 120 1 0 0 0 0 0 0
120 2 0 0 0 0 0 0, вывод: 127 3 0 0 0 0 0 0). Подскажите, пожалуйста, как правильно считать массив и в конце вывести массив суммы на экран.
Вот то, что я написала:
[bits 32] global main extern exit extern scanf extern printf section .text main: push a push _fmt1 call scanf add esp, 8 push b push _fmt1 call scanf add esp, 8 movq mm0,qword [a] paddsb mm0, qword [b] movq qword[b], mm0 push b push _fmt1 call printf add esp, 12 push 0 call exit section .data _fmt1: db "%d %d %d %d %d %d %d %d", 0 a: db 0, 0, 0, 0, 0, 0, 0, 0 b: db 0, 0, 0, 0, 0, 0, 0, 0
Решение задачи: «Сложить два массива по 8 натуральных чисел, с насыщением MMX ассемблер NASM»
textual
Листинг программы
[bits 32] global _main extern _exit extern _scanf extern _printf section .text _main: mov ebx, a L1: push v push _fmt1 call _scanf add esp, 8 mov eax, [v] mov [ebx], al inc ebx cmp ebx, a + 16 jnz L1 movq mm0, qword [a] paddsb mm0, qword [b] movq qword [b], mm0 mov ebx, b L2: movzx eax, byte [ebx] push eax push _fmt2 call _printf add esp, 8 inc ebx cmp ebx, b + 8 jnz L2 push 0 call _exit section .data _fmt1: dd '%d', 0 _fmt2: dd ' %d', 0 v: dd 0 a: times 8 db 0 b: times 8 db 0
Объяснение кода листинга программы
- Объявление глобальных переменных: _main, _exit, _scanf, _printf, a, b.
- Код для чтения двух массивов по 8 натуральных чисел с использованием функции scanf:
- Используется цикл, который выполняется до тех пор, пока не будут прочитаны все 16 чисел.
- В каждой итерации цикла:
- Число считывается в регистр eax.
- Считанное число записывается в соответствующую ячейку массива a.
- Индекс увеличивается на 1.
- Код для сложения двух массивов с использованием MMX-регистра mm0:
- Используется paddsb для сложения двух 8-элементовых массивов, сохраненных в qword[a] и qword[b].
- Результат сохраняется в qword[b].
- Код для вывода результата:
- Используется цикл, который выполняется до тех пор, пока не будут выведены все 8 чисел.
- В каждой итерации цикла:
- Число считывается из массива b и сохраняется в регистре eax.
- Используется функция printf для вывода числа и дополнительного пробела.
- Индекс увеличивается на 1.
- Код для выхода из программы с использованием функции exit:
- Функция exit вызывается с аргументом 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д