Сложить два массива по 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

Объяснение кода листинга программы

  1. Объявление глобальных переменных: _main, _exit, _scanf, _printf, a, b.
  2. Код для чтения двух массивов по 8 натуральных чисел с использованием функции scanf:
    • Используется цикл, который выполняется до тех пор, пока не будут прочитаны все 16 чисел.
    • В каждой итерации цикла:
      • Число считывается в регистр eax.
      • Считанное число записывается в соответствующую ячейку массива a.
      • Индекс увеличивается на 1.
  3. Код для сложения двух массивов с использованием MMX-регистра mm0:
    • Используется paddsb для сложения двух 8-элементовых массивов, сохраненных в qword[a] и qword[b].
    • Результат сохраняется в qword[b].
  4. Код для вывода результата:
    • Используется цикл, который выполняется до тех пор, пока не будут выведены все 8 чисел.
    • В каждой итерации цикла:
      • Число считывается из массива b и сохраняется в регистре eax.
      • Используется функция printf для вывода числа и дополнительного пробела.
      • Индекс увеличивается на 1.
  5. Код для выхода из программы с использованием функции exit:
    • Функция exit вызывается с аргументом 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.692 из 5
Похожие ответы