Calculadora em C com Assembly (multiplataforma)

Publicado por André (última atualização em 15/09/2010)

[ Hits: 8.069 ]

Homepage: http://127.0.0.1

Download Calc.c




Calculadora avançada escrita em duas linguagens.  C (médio nível) e Assembly (baixo nível).  O autor do código sou eu, e para um melhor entendimento, comentei as linhas do código. Sinta-se a vontade para comentar.

E outra, o código é multiplataforma.

Obs.: FAVOR, MANTER OS CRÉDITOS!

  



Esconder código-fonte

/*-----------------------------------------
* Calculadora escrita em C + Assembly     *
* Código multiplataforma                  *
* Open Source                             *
* Comentei o código para um melhor        *
* entendimento.                           *
* Autor:  André S. Rosa Junior            *
* Contato: andre.rosa36@gmail.com         *
\\----------------------------------------*/

/* Declaração de bibliotecas */
#include <stdio.h>
#include <conio.h>
/* Verifica se está no Windows */
#ifdef WIN32
/* Declara a biblioteca do Windows */
#include <windows.h>
/* Termina a verificação */
#endif

 /* Declaração de variáveis */

    int opc, vNum1, vNum2;

    /* Por segurança, inicializarei todas as variáveis com 0 */
    opc = 0;
    vNum1 = 0;
    vNum2 = 0;

/* Funcao principal */
int main(void){



    /* Enunciado */
    printf("\t\t---------------------------------------\n");
    printf("\t\t| CALCULADORA ESCRITA EM C & ASSEMBLY |\n");
    printf("\t\t---------------------------------------\n");

    printf("\n\n");
    /* Verifica se está no Windows */
    #ifdef WIN32
     /* Chama conteúdo de um bloco de código */
     exibeCredito();
     /* Termina a verificação */
    #endif

    /* bloco de código para solicitação de valores */
    solicitaValores();


    /* Verifica a plataforma */
    #ifdef WIN32

    /* limpa tela (Windows) */
    system("cls");
    #else
    /* limpa tela (Unix, Unix-like, Linux) */
    system("clear");
    #endif

    exibeMenu();



}

 void exibeCredito(){

     /*------------------------- \\
     |OBS: Sleep() necessita da   |
     | windows.h                  |
     \\-------------------------*/
           #ifdef WIN32
    printf("P");

    /* pause de 100 milesegundos */
    Sleep(100);
    printf("r");
    Sleep(100);
    printf("o");
    Sleep(100);
    printf("g");
    Sleep(100);
    printf("r");
    Sleep(100);
    printf("a");
    printf("m");
    Sleep(100);
    printf("a");
    Sleep(100);
    printf("d");
    Sleep(100);
    printf("o  ");
    Sleep(100);
    printf("p");
    Sleep(100);
    printf("o");
    Sleep(100);
    printf("r");
    Sleep(100);
    printf("  A");
    Sleep(100);
    printf("n");
    Sleep(100);
    printf("d");
    Sleep(100);
    printf("r");
    Sleep(100);
    printf("e");
    printf("\n\n");
    Sleep(200);

    #endif

    }

    void menuSoma(){

    int resultSoma(){

  __asm__("mov %%ecx, %%eax": : "c"(vNum1 + vNum2));
    }

    printf(" \n\n\tA soma de %d com %d e: %d\n\n",vNum1, vNum2, resultSoma(0));

    }

 void menuSubtrai(){

    int resultSub(){

  __asm__("mov %%ecx, %%eax": : "c"(vNum1 - vNum2));
    }

    printf(" \n\n\tA subtracao de %d por %d e: %d\n\n",vNum1, vNum2, resultSub(0));

    }

     void menuMultiplica(){

    int resultMul(){

  __asm__("mov %%ecx, %%eax": : "c"(vNum1 * vNum2));
    }

    printf(" \n\n\tA multiplicacao de %d por %d e: %d\n\n",vNum1, vNum2, resultMul(0));


    }

     void menuDivide(){

         if(vNum1 < vNum2){

            printf("\n\n\t\tEntre com um dividendo maior! \n\n");
            getchar();
            getchar();

            #ifdef WIN32
            system("cls");
            #else
            system("clear");
            #endif

            return solicitaValores();
         }
         else{



         }

    int resultDiv(){
 /*codigo assembly  */
  __asm__("mov %%ecx, %%eax": : "c"(vNum1 / vNum2));
    }

    printf(" \n\n\tA divisao de %d por %d e: %d\n\n",vNum1, vNum2, resultDiv(0));
     }



     void menuCreditos(){

            #ifdef WIN32
            system("cls");
            #else
            system("clear");
            #endif

     /* chama bloco exibeCredito() */
     exibeCredito();
    printf("\n\t\tE-mail: andre.rosa36@gmail.com");
    printf("\n\t\tViva o Linux: \nhttp://vivaolinux.com.br/perfil/verPerfil.php?login=fairplay");
    printf("\n\n\t\tOBRIGADO POR USAR MEU PROGRAMA! \n\n\n\n");

    getchar();

    }

    void menuSair(){

    /* pause execução */
    getchar();
    }

    void exibeMenu(){

    /* Menu para escolha de operação */
    printf("\t SELECIONE UMA OPCAO: ");
    printf("\n\n");
    printf("\t[1] Adicao");
    printf("\n\t[2] Subtracao");
    printf("\n\t[3] Multiplicacao");
    printf("\n\t[4] Divisao");
    printf("\n\t[5] Creditos");
    printf("\n\t[0] Sair");
    printf("\n\n\t\t>> ");

    /* lê a opção do usuário */
    scanf("%d",&opc);


    /* Indica que a variável "opc" será responsável
    pela escolha da operação */
    switch(opc){

        /* Opção 1,2,3,4... */
        case 1:

        menuSoma();

        break;

        case 2:

        menuSubtrai();

        break;

        case 3:

        menuMultiplica();

        break;

        case 4:

        menuDivide();

        break;

        case 5:

        menuCreditos();

        break;

        case 0:

        menuSair();

        break;

        /* se não for nenhuma das opçoes...  */
        default:

        printf("\n\t\tEntre com uma opcao valida! \n");
        #ifdef WIN32

        Sleep(900);
        system("cls");

        #else

        system("clear");

        #endif

        /* retorna ao bloco de exibição do menu */
        return exibeMenu();



    }


    }

    void solicitaValores(){

    /* Solicita o primeiro valor */
    printf("Entre com o primeiro valor: ");
    /* lê o valor */
    scanf("%d",&vNum1);
    /* "idem" acima */
    printf("Entre com o segundo valor: ");
    scanf("%d",&vNum2);
    }


Scripts recomendados

Escrita de número em octal em Assembly puro para Linux 64 bits (NASM - Netwide Assembler)

Escrita de um número em binário na tela em Assembly Puro para Linux 64 bits (GNU Assem

Algoritmo de Raiz Quadrada Inteira em Assembly Puro para Linux x86 (GNU Assembler)

Escrita de um número em octal na tela em Assembly Puro para Linux x86 (GNU Assembly)

Retorna o maior e menor elemento de um vetor em Assembly


  

Comentários
[1] Comentário enviado por danilo m galhard em 16/09/2011 - 07:16h

Cara como vc compila duas linguagens d programacao Juntas?

[2] Comentário enviado por victocha em 03/04/2012 - 20:28h

Muito interessante... mas ficaria ainda mais se você comentasse os trechos em asm =D

Se der eu agradeço, vlws e parabéns.

[3] Comentário enviado por inacioalves em 13/04/2013 - 19:49h

Não deve nem compilar no linux devido a biblioteca conio.h.

$ gcc -o Calc Calc.c
Calc.c:13:19: erro fatal: conio.h: Arquivo ou diretório não encontrado
compilação terminada.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts