es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

“Estancado en la suma de dos matrices utilizando instrucciones MMX en NASM.”

Me dieron la siguiente tarea:

Dadas dos arrays con 16 elementos: NIZA RESW 16 y NIZB RESW 16 \
almacene en el tercer array (NIZC RESW 16) los siguientes valores: NIZC[i]=NIZA[i]+NIZB[i] usando instrucciones MMX y compilándolo con NASM

Esto es lo que tengo hasta ahora:

%include "apicall.inc"
%include "print.inc"

segment .data

unos1 db "Array A: ", 0
unos2 db "Array B: ", 0
ispisC db "Array C : ", 0

segment .bss
NIZA RESW 16
NIZB RESW 16
NIZC RESW 16

segment .text
global start

start:
call init_console
mov esi,0
mov ecx, 16

mov eax, unos1
call print_string
call print_nl

unos_a:
call read_int
mov [NIZA+esi], eax
add esi, 2
loop unos_a

mov esi,0
mov ecx, 16
mov eax, unos2
call print_string
call print_nl

unos_b:
call read_int
mov [NIZB+esi], eax
add esi, 2
loop unos_b

movq mm0, qword [NIZA]
movq mm1, qword [NIZB]
paddq mm0, mm1
movq qword [NIZC], mm0

mov esi,NIZC
mov ecx,16
mov eax, ispisC
call print_string
call print_nl

ispis_c:
mov ax, [esi]
movsx eax, ax
call print_int
call print_nl
add esi, 2
loop ispis_c

APICALL ExitProcess, 0

Después de compilar el array dado y probarlo con los siguientes dos arrays, el tercer array solo almacena 4 elementos de 16. (dado en la siguiente imagen)

Screenshot

¿Alguien sabe por qué solo almacena 4 elementos de 16? Cualquier ayuda es apreciada. \
Si tiene alguna pregunta sobre las funciones print_string, print_int y print_nl son funciones para imprimir una cadena, una nueva línea y un entero al empujarlo en el registro EAX, y también tenga en cuenta que este es un programa de 32 bits.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Basándose en el código proporcionado, parece que solo se está actualizando el primer bloque de 8 bytes del registro mm0 con el resultado de la suma. Esta es la probable razón por la que solo se están actualizando correctamente los primeros 4 elementos del tercer array.

    Para solucionar este problema, es necesario realizar la operación de suma en cada bloque de 8 bytes de los arrays individualmente. Una forma de lograr esto es usando un ciclo que itere sobre los 16 elementos de los arrays, sumándolos uno por uno. Aquí hay una implementación de ejemplo:

    movq mm0, qword [NIZA]    ; cargar primer bloque de 8 bytes de NIZA en mm0
    movq mm1, qword [NIZB]    ; cargar primer bloque de 8 bytes de NIZB en mm1
    
    mov esi, NIZA             ; apuntar al siguiente bloque de 8 bytes de NIZA
    mov edi, NIZB             ; apuntar al siguiente bloque de 8 bytes de NIZB
    mov ebx, NIZC             ; apuntar al siguiente bloque de 8 bytes de NIZC
    mov ecx, 15               ; contador de ciclo
    
    add_loop:
        paddq mm0, mm1        ; sumar elementos correspondientes de NIZA y NIZB
        movq qword [ebx], mm0 ; almacenar resultado en NIZC
    
        add esi, 8            ; apuntar al siguiente bloque de 8 bytes de NIZA
        add edi, 8            ; apuntar al siguiente bloque de 8 bytes de NIZB
        add ebx, 8            ; apuntar al siguiente bloque de 8 bytes de NIZC
        loop add_loop         ; repetir para los 16 elementos
    
    movq qword [ebx], mm0     ; almacenar resultado de la última suma en NIZC
    

    Este código carga el primer bloque de 8 bytes de NIZA y NIZB en mm0 y mm1, respectivamente. Luego establece punteros al siguiente bloque de 8 bytes de NIZA, NIZB y NIZC, e ingresa a un ciclo que suma los elementos correspondientes de NIZA y NIZB, almacena el resultado en NIZC, e incrementa los punteros en 8 bytes. El ciclo se repite para los 16 elementos de los arrays, y después de la última iteración, se almacena el resultado de la última suma en NIZC.

    Tenga en cuenta que este código asume que los arrays están alineados en límites de 8 bytes, como se requiere en el conjunto de instrucciones MMX. Si los arrays no están alineados, es posible que deba ajustar el código en consecuencia.

Comments are closed.