Repositório contendo pequeno projeto em c + assembly para realização de somas rápidas em vetores de inteiros.
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");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,ESPEm 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 .loopSumPor fim, o endereço do vetorC é retornado através de EAX e a pilha de execução é restaurada.
movEAX, vetorCmovESP,EBPpopEBPret12Para compilar e executar o código é necessário ter nasm e gcc instalados, em seguida é preciso executar os seguintes comandos no terminal:
$ make
$ ./quick_sumO 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.