Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Quick Sum

Repositório contendo pequeno projeto em c + assembly para realização de somas rápidas em vetores de inteiros.

main.c

O código em c utiliza de uma função externa, desenvolvida no arquivo quick_sum.asm, que realiza a soma de dois vetores de inteiro com mesmo tamanho e retorna um terceiro vetor de inteiro contendo a soma dos elementos correspondentes.

int*_quickSum(int*vetorA, int*vetorB, intqtd_iter);

Em seguida, os vetores são inicializados e são extraídas a quantidade de elementos dos vetores, assim como, a quantidade de iterações necessárias para realizar as somas (2 por vez).

intvetorA[5] = {0, 2, 4, 6, 8};
intvetorB[5] = {1, 3, 5, 7, 9};
intqtd_elementos=sizeof(vetorA) / sizeof(int);
intqtd_iter= (qtd_elementos-1) / 2;

Por fim, um terceiro vetor é inicializado, recebendo o resultado da chamada da função _quickSum e seus elementos são impressos no console.

int*vetorC=_quickSum(vetorA, vetorB, qtd_iter);
printf("Soma dos elementos dos vetores A e B:\n");
printf("{ ");
for (inti=0; i<qtd_elementos; i++)
{
printf("%d, ", vetorC[i]);
}
printf("}\n");

quick_sum.asm

O código asm inicializa a variável vetorC na memória e resguarda a pilha de execução.

SECTION .bss	vetorC	RESD	1SECTION .textGLOBAL_quickSum_quickSum:pushEBPmovEBP,ESP

Em seguida os parâmetros são salvos nos registradores EDI, ESI e ECX, respectivamente, esse último servirá de contador para o loop das somas.

movEDI,[EBP+8]movESI,[EBP+12]movECX,[EBP+16]

É iniciado então o loop responsável por fazer a soma dos elementos, a cada iteração duas posições do vetorA são carregadas em MM0, duas posições do vetorB são adicionadas às posições carregadas em MM0 e por fim o resultado é salvo nas posições correspondentes do vetorC.

.loopSum:movq MM0, QWORD[EDI+ECX*8-8]paddb MM0, QWORD[ESI+ECX*8-8]movq QWORD[vetorC +ECX*8-8], MM0loop .loopSum

Por fim, o endereço do vetorC é retornado através de EAX e a pilha de execução é restaurada.

movEAX, vetorCmovESP,EBPpopEBPret12

Compilação e Execução

Para compilar e executar o código é necessário ter nasm e gcc instalados, em seguida é preciso executar os seguintes comandos no terminal:

$ make
$ ./quick_sum

Referência

O código apresentado nesse repositório parte de estudos iniciados no curso de Coprocessamento em Computadores x86 do monitor Pedro Botelho no canal Pedro Botelho no YouTube.

About

Repositório contendo pequeno projeto em c + assembly para realização de somas rápidas em vetores de inteiros. O código apresentado nesse repositório parte de estudos iniciados no curso de Coprocessamento em Computadores x86 do monitor Pedro Botelho no canal Pedro Botelho no YouTube.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Used by

Contributors

Languages