
Enviado em 24/06/2017 - 12:15h
Estou tentando realizar um programa que realize a multiplicaçao de matrizes (mais especificamente 3 matrizes (B x A x 2C) ) e preciso realizar essa operação tanto em C, quanto em Assembly (2 funções - uma em GAS e outra em NASM). Em C sem problemas, está rodando perfeito, porém quando tento realizar a copilação (usando o gcc) está dando falha de segmentação. Vari o codigo varias vezes e realmente não acho onde pode estar o problema (ou se a logica utilizada está errada). Segue o codigo abaixo:#include <stdio.h>
const int L = 5;
void multMatrixN(int m1[L][L], int m2[L][L], int r[L][L], int L);
void multMatrixG(int m1[L][L], int m2[L][L], int r[L][L], int L);
void multMatrixC(int m1[L][L], int m2[L][L], int r[L][L]);
void printMatrix(int m[L][L]);
void doubleMatrix(int m[L][L]);
int smallestMatrix(int m[L][L]);
void main(void){
int a[L][L], b[L][L], c[L][L], r[L][L], aux[L][L];
int i, j;
for(i=0; i<L; i++){ // INICIALIZAÇÃO DAS MATRIZES
for(j=0; j<L; j++){
a[i][j] = 2*i+1;
b[i][j] = 2*j+1;
c[i][j] = i*j+1;
r[i][j] = 0;
}
}
doubleMatrix(c);
multMatrixG(a,b,aux,L);
//multMatrixN(aux,c,r,L);
/*
printf("\n\n\t MATRIZ A\n\t");
printMatrix(a);
printf("\n\t MATRIZ B\n\t");
printMatrix(b);
printf("\n\t MATRIZ 2C\n\t");
doubleMatrix(c);
printMatrix(c);
multMatrix(a, b, aux);
multMatrix(aux, c, r);
*/
printf("\n\n\t MATRIZ RESULTADO\n\t");
printMatrix(r);
printf("\n\n\tO menor valor da diagonal principal é %d", smallestMatrix(r));
}
//Função que realiza multiplicação em NASM
/*
void multMatrixN(int m1[L][L], int m2[L][L], int r[L][L], int L){
asm("SECTION .data");
asm("i: db 0");
asm("j: db 0");
asm("k: db 0");
asm("soma: db 0");
asm("SECTION .text");
asm("global start");
asm("_start:");
asm(" mov edi, [ebp+12]"); //M2
asm(" mov esi, [ebp+8]"); //M1
asm(" forIloop:");
asm(" forJloop:");
asm(" mov soma, 0");
asm(" forKloop:");
asm(" mov eax, [ebp+20]"); // Calculo do endereco para m1
asm(" mov ebx, i");
asm(" mul bl");
asm(" add eax, k");
asm(" sal eax, 2");
asm(" mov ecx, eax"); // ecx = (L*i + k)*4
asm(" mov eax, [ebp+20]"); // Calculo do endereco para m2
asm(" mov ebx, k");
asm(" mul bl");
asm(" add eax, j");
asm(" sal eax, 2");
asm(" mov edx, eax"); // edx = (L*k + j)*4
asm(" mov eax, [esi+ecx]"); // Calculo da multiplicacao
asm(" mov ebx, [edi+edx]");
asm(" mul ebx");
asm(" add soma, eax");
asm(" inc k");
asm(" forKcond:");
asm(" cmp k,[ebp+20]");
asm(" jne forKloop");
asm(" mov eax, [ebp+20]"); // Calculo do endereco para r
asm(" mov ebx, i");
asm(" mul bl");
asm(" add eax, j");
asm(" sal eax, 2");
asm(" mov ecx, eax"); // ecx = (L*i + j)*4
asm(" mov ebx,[ebp+16]");
asm(" mov [ebx+ecx], soma");
asm(" inc j");
asm(" forJcond:");
asm(" cmp j, [ebp+20]");
asm(" jne forJloop");
asm(" inc i");
asm(" forIcond:");
asm(" cmp i, [ebp+20]");
asm(" jne forIloop");
}*/
//Função que realiza multiplicação em GAS
void multMatrixG(int m1[L][L], int m2[L][L], int r[L][L], int L){
asm(".data");
asm("i: .byte 0");
asm("j: .byte 0");
asm("k: .byte 0");
asm("soma: .int 0");
asm(".text");
asm(" movl 12(%ebp), %edi"); //M2
asm(" movl 8(%ebp), %esi"); //M1
asm(" movl 20(%ebp), %eax");
asm(" movl %eax, i");
asm(" forIloop:");
asm(" decl i");
asm(" movl 20(%ebp), %eax");
asm(" movl %eax, j");
asm(" forJloop:");
asm(" decl j");
asm(" movl $0, soma");
asm(" movl 20(%ebp), %eax");
asm(" movl %eax, k");
asm(" forKloop:");
asm(" decl k");
asm(" movl 20(%ebp), %eax"); // Calculo do endereco para m1
asm(" movl i, %ebx");
asm(" mull %ebx");
asm(" addl k, %eax");
asm(" sall $2, %eax");
asm(" movl %eax, %ecx"); // ecx = (L*i + k)*4
asm(" movl 20(%ebp), %eax"); // Calculo do endereco para m2
asm(" movl k, %ebx");
asm(" mull %ebx");
asm(" addl j, %eax");
asm(" sall $2, %eax");
asm(" movl %eax, %edx"); // edx = (L*k + j)*4
asm(" movl (%esi,%ecx),%eax"); // Calculo da multiplicacao
asm(" movl (%edi,%edx),%ebx");
asm(" mull %ebx");
asm(" addl %eax, soma");
asm(" forKcond:");
asm(" cmpl $0, k");
asm(" jne forKloop");
asm(" movl 20(%ebp), %eax"); // Calculo do endereco para r
asm(" movl i, %ebx");
asm(" mull %ebx");
asm(" addl j, %eax");
asm(" sall $2, %eax ");
asm(" movl %eax, %ecx"); // ecx = (L*i + j)*4
asm(" movl $soma, %ebx");
asm(" movl 16(%ebp), %eax");
asm(" movl %ebx, (%eax,%ecx)");
asm(" forJcond:");
asm(" cmpl $0, j");
asm(" jne forJloop");
asm(" forIcond:");
asm(" cmpl $0, i");
asm(" jne forIloop");
}
void multMatrixC(int m1[L][L], int m2[L][L], int r[L][L]){ //REALIZA MULTIPLICAÇÃO DE MATRIZ
int i, j, k, soma = 0;
for(i=0; i<L; i++){
for(j=0; j<L; j++){
r[i][j] = 0;
for(k=0; k<L; k++){
soma += m1[i][k] * m2[k][j];
}
r[i][j] = soma;
soma = 0;
}
}
}
void printMatrix(int m[L][L]){ // PRINT MATRIZ
int i, j;
for(i=0; i<L; i++){
for(j=0; j<L; j++){
printf("%5d",m[i][j]);
}
printf("\n\t");
}
}
void doubleMatrix(int m[L][L]){ // DOBRO DA MATRIZ
int i, j;
for(i=0; i<L; i++){
for(j=0; j<L; j++){
m[i][j] *= 2;
}
}
}
int smallestMatrix(int m[L][L]){ // RETORNA MENOR VALOR DA DIAGONAL PRINCIPAL
int i, menor = 99999;
for(i=0; i<L; i++){
if(m[i][i] < menor)
menor = m[i][i];
}
return menor;
}
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como fazer a conversão binária e aplicar as restrições no Linux
Como quebrar a senha de um servidor Linux Debian
Como bloquear pendrive em uma rede Linux
Um autoinstall.yaml para Ubuntu com foco em quem vai fazer máquina virtual
Instalar GRUB sem archinstall no Arch Linux em UEFI Problemático









